diff --git a/.clang-format b/.clang-format new file mode 100644 index 000000000..363922fdb --- /dev/null +++ b/.clang-format @@ -0,0 +1,395 @@ +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +--- +# @version clang-format version 15 +# @see https://clang.llvm.org/docs/ClangFormatStyleOptions.html + +# 访问说明符 public/private 的偏移,与类对齐 +AccessModifierOffset: -4 +# ( 后的参数对齐,与 ( 对齐 +AlignAfterOpenBracket: Align +# 结构体初始化对齐,右对齐 +AlignArrayOfStructures: Right +# 连续赋值对齐 +AlignConsecutiveAssignments: + # 允许 + Enabled: true + # 忽略空行 + AcrossEmptyLines: true + # 忽略注释 + AcrossComments: true + # 忽略混合运算符 + AlignCompound: true + # 填充运算符 + PadOperators: true +# 位域对齐 +AlignConsecutiveBitFields: + # 允许 + Enabled: true + # 忽略空行 + AcrossEmptyLines: true + # 忽略注释 + AcrossComments: true + # 忽略混合运算符 + AlignCompound: true + # 填充运算符 + PadOperators: true +# 连续声明对齐,忽略空行/注释 +AlignConsecutiveDeclarations: + # 允许 + Enabled: true + # 忽略空行 + AcrossEmptyLines: true + # 忽略注释 + AcrossComments: true + # 忽略混合运算符 + AlignCompound: true + # 填充运算符 + PadOperators: true +# 连续宏定义对齐,忽略空行/注释 +AlignConsecutiveMacros: + # 允许 + Enabled: true + # 忽略空行 + AcrossEmptyLines: true + # 忽略注释 + AcrossComments: true + # 忽略混合运算符 + AlignCompound: true + # 填充运算符 + PadOperators: true +# 换行符号左对齐 +AlignEscapedNewlines: Left +# 操作符对齐,与 BreakBeforeBinaryOperators 共同生效 +AlignOperands: AlignAfterOperator +# 行后注释对齐 +AlignTrailingComments: true +# 尽量将函数调用/初始化的所有参数放在同一行,禁用 +AllowAllArgumentsOnNextLine: false +# 尽量将函数声明的参数放在同一行 +AllowAllParametersOfDeclarationOnNextLine: true +# 将 while (true) {} 中的 {} 合并为一行,禁用 +AllowShortBlocksOnASingleLine: Never +# 将 switch case: 中的 case: 合并为一行,禁用 +AllowShortCaseLabelsOnASingleLine: false +# 将枚举类型合并为一行,禁用 +AllowShortEnumsOnASingleLine: false +# 将短函数合并为一行,禁用 +AllowShortFunctionsOnASingleLine: None +# 将短语句合并为一行,禁用 +AllowShortIfStatementsOnASingleLine: Never +# 将 lambda 表达式合并为一行,禁用 +AllowShortLambdasOnASingleLine: None +# 将短循环合并为一行,禁用 +AllowShortLoopsOnASingleLine: false +# 将在返回类型后换行,禁用 +AlwaysBreakAfterReturnType: None +# 将在多行字符串前换行,禁用 +AlwaysBreakBeforeMultilineStrings: false +# 在模版声明后换行 +AlwaysBreakTemplateDeclarations: Yes +# 编译器属性排除,不会参与格式化 +AttributeMacros: [ '__capability', + '__output', + '__ununsed', + '[[maybe_unused]]' ] + +# 尽量将函数调用的参数放在同一行 +BinPackArguments: true +# 尽量将函数声明的参数放在同一行 +BinPackParameters: true +# 在位域声明的 : 前后都加空格 +BitFieldColonSpacing: Both +# 大括号换行设置 +BraceWrapping: + # 在 case 后换行,禁用 + AfterCaseLabel: false + # 在 class 后换行,禁用 + AfterClass: false + # 在控制语句后换行,禁用 + AfterControlStatement: Never + # 在 enum 后换行,禁用 + AfterEnum: false + # 在函数定义后换行,禁用 + AfterFunction: false + # 在 namespace 后换行,禁用 + AfterNamespace: false + # 在结构体后换行,禁用 + AfterStruct: false + # 在联合体后换行,禁用 + AfterUnion: false + # 在 extern 后换行,禁用 + AfterExternBlock: false + # 在 catch 后换行,禁用 + BeforeCatch: false + # 在 else 前换行 + BeforeElse: true + # 在 lambda 后换行,禁用 + BeforeLambdaBody: false + # 在 while 前换行,禁用 + BeforeWhile: false + # 换行缩进括号,禁用 + IndentBraces: false + # 空函数的大括号换行 + SplitEmptyFunction: true + # 空 class/struct/union 的大括号换行 + SplitEmptyRecord: true + # 空 namespace 的大括号换行 + SplitEmptyNamespace: true +# 在二元操作符前换行 +BreakBeforeBinaryOperators: All +# 在大括号前换行,使用自定义规则,在 BraceWrapping 中规定 +BreakBeforeBraces: Custom +# 在 concept(c++20) 前换行 +BreakBeforeConceptDeclarations: Always +# 在三元操作符前换行 +BreakBeforeTernaryOperators: true +# 构造函数初始化列表在冒号 : 前,逗号 , 后换行 +BreakConstructorInitializers: BeforeColon +# class 继承列表在冒号 : 前,逗号 , 后换行 +BreakInheritanceList: BeforeColon +# 允许将字符串切割 +BreakStringLiterals: true +# 最大列数 +ColumnLimit: 80 +# 特殊注释的正则表达式,不会进行格式化 +CommentPragmas: '^ NO_STYLE:' +# 将多个 namespace 合并为一行,禁用 +CompactNamespaces: false +# 构造函数的初始化列表/继承列表的缩进宽度 +ConstructorInitializerIndentWidth: 4 +# 续行的缩进宽度 +ContinuationIndentWidth: 2 +# 去除 C++11 的列表初始化的大括号 { 后和 } 前的空格,禁用 +Cpp11BracedListStyle: false +# 分析文件使用最多的换行符并应用到整个文件, +# 只有当无法得到结论时才会使用 UseCRLF,禁用 +DeriveLineEnding: true +# 分析文件使用最多的指针/引用的对齐方式并应用到整个文件, +# 只有当无法得到结论时才会使用 PointerAlignment,禁用 +DerivePointerAlignment: false +# 关闭格式化,禁用 +DisableFormat: false +# 访问描述符后的空行,只保留 MaxEmptyLinesToKeep 指定的行数 +EmptyLineAfterAccessModifier: Leave +# 访问描述符前的空行,始终保留,除非是 class/struct 的开始 +EmptyLineBeforeAccessModifier: Always +# 在命名空间结束后添加注释,与 ShortNamespaceLines 共同生效 +FixNamespaceComments: true +# for-each 宏,作为循环语句进行格式化 +ForEachMacros: [ 'RANGES_FOR', 'FOREACH' ] + +# if 宏,作为条件语句进行格式化 +IfMacros: [ 'IF' ] +# 将 #include 分块,规则由 IncludeCategories 指定,暂未使用 +#IncludeBlocks: Regroup +# 将 #include 分块,保留原有分块 +IncludeBlocks: Preserve +# 对 #include 进行排序,匹配了某正则表达式的 #include 拥有对应的优先级, +# 优先级越小排序越靠前,匹配不到的则默认优先级为 INT_MAX,暂未使用 +IncludeCategories: + # 正则 + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + # 优先级 + Priority: 2 + # 排序优先级,默认与 Priority 相同 + SortPriority: 2 + # 大小写敏感 + CaseSensitive: true + - Regex: '^((<|")(gtest|gmock|isl|json)/)' + Priority: 3 + CaseSensitive: true + - Regex: '<[[:alnum:].]+>' + Priority: 4 + CaseSensitive: true + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: true +# 判断头文件是否为相关的头文件,用于排序 +# 如 a.cpp 与 a.h,设置为 a.cpp/a_test.cpp +IncludeIsMainRegex: '(_test)?$' +# 判断头文件是否包含实现,用于排序 +IncludeIsMainSourceRegex: '(*\.hpp)$' +# 访问控制符缩进,禁用 +IndentAccessModifiers: false +# case 块缩进,禁用 +IndentCaseBlocks: false +# case 标签缩进 +IndentCaseLabels: true +# extern 块缩进,与 BraceWrapping.AfterExternBlock 共同生效 +IndentExternBlock: AfterExternBlock +# 缩进 goto 标签,禁用 +IndentGotoLabels: false +# 缩进预处理,在 # 后缩进 +IndentPPDirectives: AfterHash +# 缩进 requires +IndentRequiresClause: true +# 缩进宽度 +IndentWidth: 4 +# 函数返回类型换行时,缩进函数声明/函数定义的函数名,禁用 +IndentWrappedFunctionNames: false +# 自动插入大括号 +InsertBraces: true +# 保留在块开始处的空行,禁用 +KeepEmptyLinesAtTheStartOfBlocks: false +# lambda 表达式函数体缩进 +LambdaBodyIndentation: OuterScope +# 语言,设置语言为 c++ +Language: Cpp + +# 开始一个块的宏的正则表达式 +MacroBlockBegin: "^MACRO_BEGIN|NS_TABLE_HEAD$" +# 结束一个块的宏的正则表达式 +MacroBlockEnd: "^MACRO_END|NS_TABLE_.*_END$" +# 最大连续空行 +MaxEmptyLinesToKeep: 1 +# namespace 缩进,禁用 +NamespaceIndentation: None +# namespace 宏 +NamespaceMacros: [ 'NAMESPACE' ] +# 预处理缩进,-1 表示使用默认值 IndentWidth +PPIndentWidth: -1 +# 如果构造函数的初始化列表超过一行则换行 +PackConstructorInitializers: NextLine + +# 有些情况下你会觉得怎么排版都达不到完美, +# 只能各方面妥协一下(例如你限定了行宽,但注释想放宽松点允许超一些)。 +# penalty 简单来说就是給每一次“违规”设定一个罚分, +# clang-format 帮你选择最终吃到的总罚分比较少的策略。 +# 在赋值前后换行时的罚分 +# @see https://www.zhihu.com/question/438473572/answer/1668773325 +# 在赋值前后打断的罚分 +PenaltyBreakAssignment: 2 +# 在函数调用 fun( 后打断的罚分 +PenaltyBreakBeforeFirstCallParameter: 19 +# 在注释中换行的罚分 +PenaltyBreakComment: 300 +# 在第一个 << 点打断的罚分 +PenaltyBreakFirstLessLess: 120 +# 在 ( 后打断的罚分 +PenaltyBreakOpenParenthesis: 100 +# 在字符串常量中换行的罚分 +PenaltyBreakString: 1000 +# 在模版声明后打断的罚分 +PenaltyBreakTemplateDeclaration: 10 +# 注释的每个字符超出 ColumnLimit 的罚分 +PenaltyExcessCharacter: 1000000 +# 每个空格缩进的罚分, +# counted relative to leading non-whitespace column +PenaltyIndentedWhitespace: 0 +# 函数返回类型单独成行的罚分 +PenaltyReturnTypeOnItsOwnLine: 0 +# 指针和引用对齐,左对齐 +PointerAlignment: Left +# 修饰符对齐,由 QualifierOrder 指定 +QualifierAlignment: Custom +# 修饰符顺序 +QualifierOrder: [ 'inline', 'static', 'const', 'volatile','type' ] +# 将字符串格式化,与 ProtocolBuffers 配合使用,未使用 +RawStringFormats: + - Language: Cpp + BasedOnStyle: InheritParentConfig + Delimiters: [ pb ] +# 引用对齐,与 PointerAlignment 相同 +ReferenceAlignment: Pointer +# 重新排版注释 +ReflowComments: true +# requires 位置,单独成行 +RequiresClausePosition: OwnLine +# 在定义块之间添加空行,总是添加 +SeparateDefinitionBlocks: Always +# 设置短 namespace 长度,0 表示将所有 namespace 视为 short namespace +ShortNamespaceLines: 0 +# 排序 #include,按照字母序 +SortIncludes: CaseInsensitive +# 排序 using 声明 +SortUsingDeclarations: true +# 在 C 风格类型转换后添加空格,禁用 +SpaceAfterCStyleCast: false +# 在逻辑非 ! 后添加空格,禁用 +SpaceAfterLogicalNot: false +# 在 template 后添加空格 +SpaceAfterTemplateKeyword: true +# 在指针修饰符周围添加空格,使用 PointerAlignment +SpaceAroundPointerQualifiers: Default +# 在赋值运算符之前添加空格 +SpaceBeforeAssignmentOperators: true +# 在 case 的 : 前添加空格,禁用 +SpaceBeforeCaseColon: false +# 在 c++11 大括号初始化前添加空格 +SpaceBeforeCpp11BracedList: true +# 在构造函数初始化列表 : 前添加空格 +SpaceBeforeCtorInitializerColon: true +# 在继承 : 前添加空格 +SpaceBeforeInheritanceColon: true +# 在 ( 前添加空格,由 SpaceBeforeParensOptions 指定 +SpaceBeforeParens: Custom +# 在 ( 前添加空格的规则 +SpaceBeforeParensOptions: + # 在控制语句后添加 + AfterControlStatements: true + # 在 for-each 宏后添加,禁用 + AfterForeachMacros: false + # 在函数声明后添加,禁用 + AfterFunctionDeclarationName: false + # 在函数定义后添加,禁用 + AfterFunctionDefinitionName: false + # 在 if 宏后添加,禁用 + AfterIfMacros: false + # 在重载运算符后添加,禁用 + AfterOverloadedOperator: false + # 在 requires 后添加 + AfterRequiresInClause: true + # 在表达式中的 requires 后添加,禁用 + AfterRequiresInExpression: false + # 在非空的 () 前添加,禁用 + BeforeNonEmptyParentheses: false +# 在范围 for 循环 : 前添加空格 +SpaceBeforeRangeBasedForLoopColon: true +# 在 [ 前添加空格,禁用 +SpaceBeforeSquareBrackets: false +# 在空 {} 中添加空格 +SpaceInEmptyBlock: true +# 在空的圆括号中添加空格,禁用 +SpaceInEmptyParentheses: false +# 在行后注释前添加空格(只适用于 //) +SpacesBeforeTrailingComments: 4 +# 在尖括号的 < 后和 > 前添加空格,禁用 +SpacesInAngles: Never +# 在 C 风格类型转换的括号中添加空格,禁用 +SpacesInCStyleCastParentheses: false +# 在条件判断中 ( 后 ) 前添加空格,禁用 +SpacesInConditionalStatement: false +# 在容器字面量中添加空格 +SpacesInContainerLiterals: true +# 行注释前缀中的空格 +SpacesInLineCommentPrefix: + # 最大值 + Maximum: 1 + # 最小值 + Minimum: 1 +# 在 ( 后和 ) 前添加空格,禁用 +SpacesInParentheses: false +# 在 [ 后和 ] 前添加空格,lamda 表达式和未指明大小的数组的声明不受影响,禁用 +SpacesInSquareBrackets: false +# cpp 标准,使用最新支持的 +Standard: Latest +# 需要识别为宏的代码块前缀 +StatementAttributeLikeMacros: [ ] +# 需要解释为完整代码段的宏 +StatementMacros: [ ] +# tab 宽度,8 个空格 +TabWidth: 8 +# 需要识别为宏,而不是函数调用的宏 +TypenameMacros: [ ] +# 使用 \r\n 换行符,与 DeriveLineEnding 共同生效,禁用 +UseCRLF: false +# 使用 tab,禁用 +UseTab: Never +# 对空格敏感的宏 +WhitespaceSensitiveMacros: [ ] +... diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..fc5870f97 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,17 @@ + +# This file is a part of Simple-XX/SimpleKernel (https://github.com/Simple-XX/SimpleKernel). +# +# FUNDING.yml for Simple-XX/SimpleKernel. + +# These are supported funding model platforms + +github: ['Simple-XX'] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: ['https://tva1.sinaimg.cn/large/006tNbRwly1g9yjfoboa4j30go0p0411.jpg', 'https://tva1.sinaimg.cn/large/006tNbRwly1g9yjg7p0auj30u014qn7q.jpg'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index e0b16d5e3..79e46f6ae 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,7 +1,7 @@ --- name: Bug report about: Create a report to help us improve -title: '' +title: "[BUG]" labels: bug assignees: '' @@ -23,11 +23,12 @@ A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. -**Desktop (please complete the following information):** +**Env (please complete the following information):** - OS: [e.g. MacOS 10.14.2] - Compile tools: [e.g. i386-elf-gcc i386-elf-ld] - Emulator: [e.g. Bochs 2.6.9] - - Branch [e.g. TODO] + - Branch: [e.g. TODO] + - Any modifications to tools/env.sh: **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/help.md b/.github/ISSUE_TEMPLATE/help.md new file mode 100644 index 000000000..2080ae454 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/help.md @@ -0,0 +1,21 @@ +--- +name: Help +about: any questions +title: "[HELP]" +labels: help wanted +assignees: '' + +--- + +**Env (please complete the following information):** + - OS: [e.g. MacOS 10.14.2] + - Compile tools: [e.g. i386-elf-gcc i386-elf-ld] + - Emulator: [e.g. Bochs 2.6.9] + - Branch: [e.g. TODO] + - Any modifications to tools/env.sh: + +**Describe your question** +A clear and concise description of what the question is. + +**Additional context** +Add any other context about the problem here. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..644cf33b7 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,129 @@ + +# This file is a part of Simple-XX/SimpleKernel (https://github.com/Simple-XX/SimpleKernel). +# +# build.yml for Simple-XX/SimpleKernel. + +name: build + +on: + - push + - pull_request + - release + +env: + BUILD_TYPE: Release + +jobs: + build_osx: + runs-on: macos-latest + + steps: + - name: get code + uses: actions/checkout@v2 + + - name: setup toolchain + shell: bash + run: | + brew install x86_64-elf-gcc + brew tap riscv-software-src/riscv + brew install riscv-tools + + - name: make build dir + shell: bash + run: | + mkdir ${{github.workspace}}/build + + - name: osx-i386 + shell: bash + working-directory: ${{github.workspace}}/build + run: | + cmake -DTOOLCHAIN_PREFIX=x86_64-elf- -DCMAKE_C_COMPILER=x86_64-elf-gcc -DCMAKE_CXX_COMPILER=x86_64-elf-g++ -DARCH=i386 -DCMAKE_BUILD_TYPE=RELEASE -DHAVE_FLAG_SEARCH_PATHS_FIRST=0 .. + make + rm -rf ./* + + - name: osx-x86_64 + shell: bash + working-directory: ${{github.workspace}}/build + run: | + cmake -DTOOLCHAIN_PREFIX=x86_64-elf- -DCMAKE_C_COMPILER=x86_64-elf-gcc -DCMAKE_CXX_COMPILER=x86_64-elf-g++ -DARCH=x86_64 -DCMAKE_BUILD_TYPE=RELEASE -DHAVE_FLAG_SEARCH_PATHS_FIRST=0 .. + make + rm -rf ./* + + - name: osx-riscv64 + shell: bash + working-directory: ${{github.workspace}}/build + run: | + cmake -DTOOLCHAIN_PREFIX=riscv64-unknown-elf- -DCMAKE_C_COMPILER=riscv64-unknown-elf-gcc -DCMAKE_CXX_COMPILER=riscv64-unknown-elf-g++ -DARCH=riscv64 -DCMAKE_BUILD_TYPE=RELEASE -DHAVE_FLAG_SEARCH_PATHS_FIRST=0 .. + make + rm -rf ./* + + build_ubuntu: + runs-on: ubuntu-latest + needs: [build_osx] + steps: + - name: get code + uses: actions/checkout@v2 + + - name: setup toolchain + shell: bash + run: | + sudo apt-get install -y gcc-riscv64-linux-gnu g++-riscv64-linux-gnu + + - name: make build dir + shell: bash + run: | + mkdir ${{github.workspace}}/build + + - name: ubuntu-i386 + shell: bash + working-directory: ${{github.workspace}}/build + run: | + cmake -DTOOLCHAIN_PREFIX= -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DARCH=i386 -DCMAKE_BUILD_TYPE=RELEASE .. + make + rm -rf ./* + + - name: ubuntu-x86_64 + shell: bash + working-directory: ${{github.workspace}}/build + run: | + cmake -DTOOLCHAIN_PREFIX= -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DARCH=x86_64 -DCMAKE_BUILD_TYPE=RELEASE .. + make + rm -rf ./* + + - name: ubuntu-riscv64 + shell: bash + working-directory: ${{github.workspace}}/build + run: | + cmake -DTOOLCHAIN_PREFIX=riscv64-linux-gnu- -DCMAKE_C_COMPILER=riscv64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=riscv64-linux-gnu-g++ -DARCH=riscv64 -DCMAKE_BUILD_TYPE=RELEASE .. + make + rm -rf ./* + + # build_win: + # runs-on: windows-latest + + # auto_pr: + # runs-on: ubuntu-latest + # needs: [build_osx] + + # steps: + # - name: get code + # uses: actions/checkout@v2 + + # - name: Create Pull Request + # uses: peter-evans/create-pull-request@v3 + # with: + # token: ${{ secrets.PAT }} + # commit-message: "[Auto PR]" + # committer: GitHub + # author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com> + # signoff: true + # branch: test-patches + # delete-branch: true + # title: '[BOT] Auto PR' + # body: | + # Auto-generated by [create-pull-request](https://github.com/peter-evans/create-pull-request) + # labels: | + # Auto PR + # assignees: MRNIU + # reviewers: MRNIU + # draft: false diff --git a/.gitignore b/.gitignore index f15c4d66b..4d693db22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,20 @@ -bochsout.txt - -snapshot.txt +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# .gitinnore for Simple-XX/SimpleKernel. *.o - -*.gch \ No newline at end of file +*.gch +*.tags* +.DS_Store +build* +grub-2.04.tar.xz +grub-2.04 +iso +*.iso +*.bin +null.d +tools/aarch64-unknown-linux-gnu* +.gdbinit +tools/opensbi/build diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/SimpleKernel.iml b/.idea/SimpleKernel.iml new file mode 100644 index 000000000..f08604bb6 --- /dev/null +++ b/.idea/SimpleKernel.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/.idea/cmake.xml b/.idea/cmake.xml new file mode 100644 index 000000000..921664e6e --- /dev/null +++ b/.idea/cmake.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..249efa28a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..79ee123c2 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/SimpleKernel_dir.xml b/.idea/dictionaries/SimpleKernel_dir.xml new file mode 100644 index 000000000..1a9535c8a --- /dev/null +++ b/.idea/dictionaries/SimpleKernel_dir.xml @@ -0,0 +1,20 @@ + + + + bochsrc + corei + imafdc + lriscv + mmio + mrniu + niuzh + opensbi + readelf + simplekernel + syms + virtio + xlen + xorriso + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 000000000..97626ba45 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml new file mode 100644 index 000000000..12ce1b3ad --- /dev/null +++ b/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..6b29ddf9f --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..79b3c9483 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..18309178f --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/kernel.xml b/.idea/runConfigurations/kernel.xml new file mode 100644 index 000000000..66eb96783 --- /dev/null +++ b/.idea/runConfigurations/kernel.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/make_i386_iso.xml b/.idea/runConfigurations/make_i386_iso.xml new file mode 100644 index 000000000..d49cdd9f9 --- /dev/null +++ b/.idea/runConfigurations/make_i386_iso.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/make_x86_64_iso.xml b/.idea/runConfigurations/make_x86_64_iso.xml new file mode 100644 index 000000000..488560a44 --- /dev/null +++ b/.idea/runConfigurations/make_x86_64_iso.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/qemu_i386_debug.xml b/.idea/runConfigurations/qemu_i386_debug.xml new file mode 100644 index 000000000..aec032588 --- /dev/null +++ b/.idea/runConfigurations/qemu_i386_debug.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/qemu_riscv64_debug.xml b/.idea/runConfigurations/qemu_riscv64_debug.xml new file mode 100644 index 000000000..9ad3329d8 --- /dev/null +++ b/.idea/runConfigurations/qemu_riscv64_debug.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations/qemu_x86_64_debug.xml b/.idea/runConfigurations/qemu_x86_64_debug.xml new file mode 100644 index 000000000..fcd6dcd30 --- /dev/null +++ b/.idea/runConfigurations/qemu_x86_64_debug.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/scopes/src.xml b/.idea/scopes/src.xml new file mode 100644 index 000000000..91d064d56 --- /dev/null +++ b/.idea/scopes/src.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/tool_settings.zip b/.idea/tool_settings.zip new file mode 100644 index 000000000..47ca8c075 Binary files /dev/null and b/.idea/tool_settings.zip differ diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..683e670e8 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3f81e465f..000000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -os: osx -language: c - -addons: - homebrew: - update: false - -before_install: - - brew install i386-elf-binutils - - brew install i386-elf-gcc - -script: - - cd ./src - - make -after_script: - - make clean diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 000000000..91b383c27 --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,13 @@ +{ + "configurations": [ + { + "name": "SimpleKernel_vscode_cpp", + "includePath": [ + "${workspaceFolder}/src/**" + ], + "cStandard": "gnu17", + "cppStandard": "gnu++17" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..fdb8ea0eb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,133 @@ +{ + "files.associations": { + "array": "cpp", + "string": "cpp", + "string_view": "cpp", + "ranges": "cpp", + "random": "c", + "*.tcc": "cpp", + "streambuf": "cpp", + "cstdio": "cpp", + "exception": "cpp", + "memory_resource": "cpp", + "iosfwd": "cpp", + "new": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "cstdlib": "cpp", + "deque": "cpp", + "vector": "cpp", + "initializer_list": "cpp", + "type_traits": "cpp", + "atomic": "cpp", + "complex": "cpp", + "unordered_map": "cpp", + "iterator": "cpp", + "optional": "cpp", + "utility": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iostream": "cpp", + "bit": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "map": "cpp", + "set": "cpp", + "memory": "cpp", + "numeric": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "iomanip": "cpp", + "istream": "cpp", + "limits": "cpp", + "stdexcept": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp", + "list": "cpp", + "climits": "cpp", + "basic_string": "cpp", + "construct": "cpp", + "exceptdef": "cpp", + "hashtable": "cpp", + "heap_algo": "cpp", + "set_algo": "cpp", + "uninitialized": "cpp", + "unordered_set": "cpp", + "util": "cpp", + "queue": "cpp", + "rb_tree": "cpp", + "algo": "cpp", + "algobase": "cpp", + "allocator": "cpp", + "astring": "cpp", + "numbers": "cpp", + "rope": "cpp", + "regex": "cpp", + "*.def": "cpp", + "forward_list": "cpp", + "slist": "cpp", + "valarray": "cpp", + "span": "cpp" + }, + "cmake.configureOnOpen": true, + // --------Doxygen-------- + // 文件注释的组成及其排序 + "doxdocgen.file.fileOrder": [ + // @file + "file", + // @brief 简介 + "brief", + // 作者 + "author", + // 版本 + "version", + // 日期 + "date", + // 版权 + "copyright", + // 自定义 + "custom" + ], + // 下面时设置上面标签tag的具体信息 + // 文件注释:版权信息模板 + "doxdocgen.file.copyrightTag": [ + "@copyright MIT LICENSE", + "https://github.com/Simple-XX/SimpleKernel" + ], + // 文件注释:自定义模块,这里我添加一个修改日志 + "doxdocgen.file.customTag": [ + "@par change log:", + "", + "
DateAuthorDescription", + "
{date}作者内容", + "
", + ], + "doxdocgen.file.fileTemplate": "@file {name}", + "doxdocgen.generic.authorEmail": "XXX@XXX.com", + "doxdocgen.generic.authorName": "XXX", + "doxdocgen.generic.authorTag": "@author {author} ({email})", + // 日期格式与模板 + "doxdocgen.generic.dateFormat": "YYYY-MM-DD", + "doxdocgen.generic.dateTemplate": "@date {date}", + // 根据自动生成的注释模板(目前主要体现在函数注释上) + "doxdocgen.generic.order": [ + "brief", + "tparam", + "param", + "return" + ], + "doxdocgen.generic.paramTemplate": "@param{indent:8}{param}{indent:25}My Param doc", + "doxdocgen.generic.returnTemplate": "@return {type}{indent:25}", + "doxdocgen.generic.splitCasingSmartText": true, + // --------Doxygen END-------- +} diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..0afda3e62 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# CMake 入口 + +# 设置最小 cmake 版本 +cmake_minimum_required(VERSION 3.13) + +# 跳过编译器检查 +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_CXX_COMPILER_WORKS TRUE) + +# 设置项目名与使用的语言 +project(SimpleKernel LANGUAGES CXX ASM) + +# 禁止原地编译 +if(${SimpleKernel_SOURCE_DIR} STREQUAL ${SimpleKernel_BINARY_DIR}) + message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there.") +endif() + +# 设置使用的 C/C++ 版本 +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +# 设置辅助 cmake 脚本路径 +set(CMAKE_MODULE_PATH "${SimpleKernel_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) + +# 设置 arch +include(${SimpleKernel_SOURCE_DIR}/cmake/arch_detector.cmake) +# 引入添加头文件函数 +include(${SimpleKernel_SOURCE_DIR}/cmake/header_files.cmake) +# 引入添加汇编文件函数 +include(${SimpleKernel_SOURCE_DIR}/cmake/find_asm_files.cmake) + +# 设置输出路径 +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# 设置内核名称 +set(KernelName kernel.elf) + +# 设置 src 路径 +set(SimpleKernel_SOURCE_CODE_DIR ${SimpleKernel_SOURCE_DIR}/src) +# 跳转到 SimpleKernel_SOURCE_CODE_DIR 下的 CMakeLists +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}) diff --git a/LICENSE b/LICENSE index 7b9c6b1ce..bfd6aff42 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 天魔传人 +Copyright (c) 2018 Simple-XX Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,3 +19,52 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +---------- + +Copyright (c) 2019 Simple-XX + +Anti 996 License Version 1.0 (Draft) + +Permission is hereby granted to any individual or legal entity +obtaining a copy of this licensed work (including the source code, +documentation and/or related items, hereinafter collectively referred +to as the "licensed work"), free of charge, to deal with the licensed +work for any purpose, including without limitation, the rights to use, +reproduce, modify, prepare derivative works of, distribute, publish +and sublicense the licensed work, subject to the following conditions: + +1. The individual or the legal entity must conspicuously display, +without modification, this License and the notice on each redistributed +or derivative copy of the Licensed Work. + +2. The individual or the legal entity must strictly comply with all +applicable laws, regulations, rules and standards of the jurisdiction +relating to labor and employment where the individual is physically +located or where the individual was born or naturalized; or where the +legal entity is registered or is operating (whichever is stricter). In +case that the jurisdiction has no such laws, regulations, rules and +standards or its laws, regulations, rules and standards are +unenforceable, the individual or the legal entity are required to +comply with Core International Labor Standards. + +3. The individual or the legal entity shall not induce or force its +employee(s), whether full-time or part-time, or its independent +contractor(s), in any methods, to agree in oral or written form, to +directly or indirectly restrict, weaken or relinquish his or her +rights or remedies under such laws, regulations, rules and standards +relating to labor and employment as mentioned above, no matter whether +such written or oral agreement are enforceable under the laws of the +said jurisdiction, nor shall such individual or the legal entity +limit, in any methods, the rights of its employee(s) or independent +contractor(s) from reporting or complaining to the copyright holder or +relevant authorities monitoring the compliance of the license about +its violation(s) of the said license. + +THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN ANY WAY CONNECTION WITH THE +LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK. diff --git a/README.md b/README.md index cf1c6cacb..1a19f92c1 100644 --- a/README.md +++ b/README.md @@ -1,235 +1,3 @@ +# vfs -![Build Status](https://travis-ci.org/MRNIU/SimpleKernel.svg?branch=TODO) -![last-commit](https://img.shields.io/github/last-commit/google/skia.svg) -![languages](https://img.shields.io/github/languages/count/badges/shields.svg) -![MIT License](https://img.shields.io/github/license/mashape/apistatus.svg) - -[English](https://github.com/MRNIU/SimpleKernel/blob/TODO/README_en.md) | [中文](https://github.com/MRNIU/SimpleKernel/blob/TODO/README.md) -# SimpleKernel - -## 简介 - -SimpleKernel,一个用来练手的简单内核。提供了各个阶段完成度不同的内核,你可以从自己喜欢的地方开始。 - -使用的语言: - -- x86 汇编 -- C -- C++ -- Shell -- make - -- x86 -- 使用 Grub 启动 -- UXIN-like -- 多任务 -- ELF -- IDE disk -- 时钟 -- 键盘 -- 鼠标 -- EXT2 文件系统 -- POSIX API -- libc -- 一些 shell命令 - - -## 开发环境 - -- Ubuntu Linux - - - Bochs - 编译安装 - - - i386-elf 交叉编译工具链 - 编译安装 - -- Mac - - Bochs - - brew install bochs - - - i386-elf 交叉编译工具链 - - brew install i386-elf-binutils - brew install i386-elf-gcc - -注: -Mac 10.14.1,bochs 2.6.9,i386-elf-binutils 2.31.1,i386-elf-gcc 8.2.0 测试通过。 - -## 如何运行 - - git clone https://github.com/MRNIU/SimpleKernel.git - cd SimpleKernel/ - sh setup.sh - -在出现的 bochs 命令行中 输入 `c` 即可运行。 - -运行截图 - -![屏幕快照 2018-12-10 下午8.40.12](https://lh3.googleusercontent.com/-bMiOQG70raM/XA5ijMqVcLI/AAAAAAAAAGU/YB_HvVl8JD4PiKbV1UHfQA4HqeD6xWCxACHMYCw/I/%255BUNSET%255D) - -![屏幕快照 2018-12-10 下午8.40.38](https://lh3.googleusercontent.com/-Lp2Xea_cLgM/XA5ijHG93RI/AAAAAAAAAGc/wpYAqRo7wGIABAAi6jGz3NRhASB2aOQywCHMYCw/I/%255BUNSET%255D) - -![屏幕快照 2018-12-10 下午8.40.50](https://lh3.googleusercontent.com/-DwLqMLIWGps/XA5ijD1nZvI/AAAAAAAAAGY/PeRQd2FN8qoOEGq4LEx1vxgmFCmq8qUYACHMYCw/I/%255BUNSET%255D) - -更多 bochs 使用方式请参考 bochs 的相关资料。 - - -## 快速上手 - -``` -├── bochsout.txt bochs 输出 -├── bochsrc.txt bochs 配置文件 -├── setup.sh -├── simplekernel.img -├── someknowledge -├── src/ 源码目录 -│   ├── Makefile 构建规则 -│   ├── arch/ 架构相关代码 -│   │   ├── README.md -│   │   ├── i386/ i386 架构 -│   │   │   ├── README.md -│   │   │   ├── boot/ 启动代码,使用 multiboot -│   │   │   │   ├── boot.s -│   │   │   │   └── link.ld -│   │   │   ├── clock.c 时钟 -│   │   │   ├── clock.h -│   │   │   ├── cpu.hpp CPU操作 -│   │   │   ├── debug/ 调试函数 -│   │   │   │   └── debug.c -│   │   │   ├── intr/ 中断设置 -│   │   │   │   ├── README.md -│   │   │   │   ├── intr.c idt 设置 -│   │   │   │   ├── intr.h -│   │   │   │   └── intr_s.s -│   │   │   └── mm/ 内存管理 -│   │   │   ├── README.md -│   │   │   ├── gdt.c gdt 设置 -│   │   │   ├── gdt.h -│   │   │   ├── gdt_s.s -│   │   │   ├── pmm.c 物理内存管理 -│   │   │   ├── pmm.h -│   │   │   ├── vmm.c 虚拟内存管理 -│   │   │   └── vmm.h -│   │   └── x64/ x64 架构 -│   │   └── TODO -│   ├── include/ 头文件 -│   │   ├── DataStructure/ 可能会用到的数据结构与算法 -│   │   │   ├── BinarySearchTree.cpp 二叉树 -│   │   │   ├── DataStructuer.h -│   │   │   ├── LinkedList.cpp 链表 -│   │   │   ├── Queue.cpp 队列 -│   │   │   ├── SortAlgorithm.cpp 排序算法 -│   │   │   └── Stack.cpp 栈 -│   │   ├── README.md -│   │   ├── debug.h -│   │   ├── drv/ 设备头文件 -│   │   │   ├── keyboard.h -│   │   │   └── mouse.h -│   │   ├── elf.h elf 格式定义 -│   │   ├── kernel.h 内核函数直接引用的头文件 -│   │   ├── libc/ c 标准库 -│   │   │   ├── README.md -│   │   │   ├── assert.h 断言 -│   │   │   ├── stdarg.h -│   │   │   ├── stdbool.h -│   │   │   ├── stddef.h -│   │   │   ├── stdint.h -│   │   │   ├── stdio/ 标准输入输出 -│   │   │   │   ├── printk.c -│   │   │   │   └── vsprintf.c -│   │   │   ├── stdio.h -│   │   │   ├── string/ 字符串处理 -│   │   │   │   └── string.c -│   │   │   ├── string.h -│   │   ├── mm/ 内存相关头文件 -│   │   │   ├── README.md -│   │   │   └── mm.h -│   │   ├── multiboot.h 多重引导规范定义 -│   │   ├── pic.hpp 8259A 中断芯片设置 -│   │   ├── port.hpp 端口操作 -│   │   ├── tty.hpp tty 定义 -│   │   └── vga.hpp vga 显示定义 -│   └── kernel/ -│   ├── README.md -│   ├── drv/ 设备 -│   │   ├── kb.c -│   │   └── mouse.c -│   └── kernel.c 内核入口 -└── tools/ 工具,在 .rb 文件中你可以找到 gcc 和 binutils 的编译选项 - ├── i386-elf-binutils.rb - └── i386-elf-gcc.rb - -``` - -## 测试 - -目前只有很简陋的 CI。 - -### 自动化集成 - -合并到 master 分支时需要通过 Travis CI 测试。编译没有错误即可。 - -## 代码风格 - -## 镜像文件 - -simplekernel.img 是 1.44 软盘,我们的内核就在这里。 - -## TODO - -- 修复 bug -- 鼠标输入处理 -- debug 函数 -- 添加编码规范测试 - -## 作者 - -作者:[MRNIU](https://github.com/MRNIU) - -您也可以在贡献者名单中参看所有参与该项目的开发者。 - -## 贡献 - -请阅读 CONTRIBUTING.md。 - -## 鸣谢 - -此项目参考了很多优秀的项目和资料 - -[osdev](https://wiki.osdev.org) - -[GRUB 在 Mac 上的安装](https://wiki.osdev.org/GRUB#Installing_GRUB_2_on_OS_X) - -[multiboot](https://www.gnu.org/software/grub/manual/multiboot/multiboot.html) - -《程序员的自我修养--链接、装载与库》(俞甲子 石凡 潘爱民) - -[JamesM's kernel development tutorials](http://www.jamesmolloy.co.uk/tutorial_html/1.-Environment%20setup.html) - -[xOS](https://github.com/fengleicn/xOS) - -[hurlex](http://wiki.0xffffff.org/posts/hurlex-8.html) - -[howerj/os](https://github.com/howerj/os) - -[cfenollosa/os-tutorial](https://github.com/cfenollosa/os-tutorial) - -[omarrx024/xos](https://github.com/omarrx024/xos) - -[PurpleBooth/project-title](https://gist.github.com/PurpleBooth/109311bb0361f32d87a2%23project-title) - -[0xAX weblong](http://0xax.blogspot.com/search/label/asm) - -[How-to-Make-a-Computer-Operating-System](https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System) - -[coding-style](https://www.kernel.org/doc/Documentation/process/coding-style.rst) - -[DNKernel](https://github.com/morimolymoly/DNKernel) - -## 版权信息 - -此项目使用 MIT 许可证 - - +虚拟文件系统的实现 + exFat diff --git a/README_en.md b/README_en.md deleted file mode 100644 index 811e46b6f..000000000 --- a/README_en.md +++ /dev/null @@ -1,213 +0,0 @@ - -![Build Status](https://travis-ci.org/MRNIU/SimpleKernel.svg?branch=TODO) -![last-commit](https://img.shields.io/github/last-commit/google/skia.svg) -![languages](https://img.shields.io/github/languages/count/badges/shields.svg) -![MIT License](https://img.shields.io/github/license/mashape/apistatus.svg) - -[English](https://github.com/MRNIU/SimpleKernel/blob/TODO/README_en.md) | [中文](https://github.com/MRNIU/SimpleKernel/blob/TODO/README.md) -# SimpleKernel - -## Abstract - -SimpleKernel,一个用来练手的简单内核。提供了各个阶段完成度不同的内核,你可以从自己喜欢的地方开始。 - -使用的语言: - -- x86 汇编 -- C -- C++ -- Shell -- make - -## 开发环境 - -- Ubuntu Linux - - - Bochs - 编译安装 - - - i386-elf 交叉编译工具链 - 编译安装 - -- Mac - - Bochs - - brew install bochs - - - i386-elf 交叉编译工具链 - - brew install i386-elf-binutils - brew install i386-elf-gcc - -注: -Mac 10.14.1,bochs 2.6.9,i386-elf-binutils 2.31.1,i386-elf-gcc 8.2.0 测试通过。 - -## RUN - - git clone https://github.com/MRNIU/SimpleKernel.git - cd SimpleKernel/ - sh setup.sh - -在出现的 bochs 命令行中 输入 `c` 即可运行。 - -运行截图 - -![屏幕快照 2018-12-10 下午8.40.12](https://lh3.googleusercontent.com/-bMiOQG70raM/XA5ijMqVcLI/AAAAAAAAAGU/YB_HvVl8JD4PiKbV1UHfQA4HqeD6xWCxACHMYCw/I/%255BUNSET%255D) - -![屏幕快照 2018-12-10 下午8.40.38](https://lh3.googleusercontent.com/-Lp2Xea_cLgM/XA5ijHG93RI/AAAAAAAAAGc/wpYAqRo7wGIABAAi6jGz3NRhASB2aOQywCHMYCw/I/%255BUNSET%255D) - -![屏幕快照 2018-12-10 下午8.40.50](https://lh3.googleusercontent.com/-DwLqMLIWGps/XA5ijD1nZvI/AAAAAAAAAGY/PeRQd2FN8qoOEGq4LEx1vxgmFCmq8qUYACHMYCw/I/%255BUNSET%255D) - -更多 bochs 使用方式请参考 bochs 的相关资料。 - - -## QUICK START - -``` -├── bochsout.txt bochs output -├── bochsrc.txt bochs configuration file -├── setup.sh -├── simplekernel.img -├── someknowledge -├── src/ source directory -│   ├── Makefile build rules -│   ├── arch/ 架构相关代码 -│   │   ├── README.md -│   │   ├── i386/ i386 架构 -│   │   │   ├── README.md -│   │   │   ├── boot/ boot code,use multiboot -│   │   │   │   ├── boot.s -│   │   │   │   └── link.ld -│   │   │   ├── clock.c -│   │   │   ├── clock.h -│   │   │   ├── cpu.hpp CPU操作 -│   │   │   ├── debug/ debug function -│   │   │   │   └── debug.c -│   │   │   ├── intr/ 中断设置 -│   │   │   │   ├── README.md -│   │   │   │   ├── intr.c idt 设置 -│   │   │   │   ├── intr.h -│   │   │   │   └── intr_s.s -│   │   │   └── mm/ 内存管理 -│   │   │   ├── README.md -│   │   │   ├── gdt.c gdt 设置 -│   │   │   ├── gdt.h -│   │   │   ├── gdt_s.s -│   │   │   ├── pmm.c 物理内存管理 -│   │   │   ├── pmm.h -│   │   │   ├── vmm.c 虚拟内存管理 -│   │   │   └── vmm.h -│   │   └── x64/ x64 架构 -│   │   └── TODO -│   ├── include/ 头文件 -│   │   ├── DataStructuer/ data structure -│   │   │   ├── BinarySearchTree.cpp -│   │   │   ├── DataStructuer.h -│   │   │   ├── LinkedList.cpp -│   │   │   ├── Queue.cpp 队列 -│   │   │   ├── SortAlgorithm.cpp 排序算法 -│   │   │   └── Stack.cpp 栈 -│   │   ├── README.md -│   │   ├── debug.h -│   │   ├── drv/ 设备头文件 -│   │   │   ├── keyboard.h -│   │   │   └── mouse.h -│   │   ├── elf.h elf 格式定义 -│   │   ├── kernel.h 内核函数直接引用的头文件 -│   │   ├── libc/ c 标准库 -│   │   │   ├── README.md -│   │   │   ├── assert.h 断言 -│   │   │   ├── stdarg.h -│   │   │   ├── stdbool.h -│   │   │   ├── stddef.h -│   │   │   ├── stdint.h -│   │   │   ├── stdio/ 标准输入输出 -│   │   │   │   ├── printk.c -│   │   │   │   └── vsprintf.c -│   │   │   ├── stdio.h -│   │   │   ├── string/ 字符串处理 -│   │   │   │   └── string.c -│   │   │   ├── string.h -│   │   ├── mm/ 内存相关头文件 -│   │   │   ├── README.md -│   │   │   └── mm.h -│   │   ├── multiboot.h 多重引导规范定义 -│   │   ├── pic.hpp 8259A 中断芯片设置 -│   │   ├── port.hpp 端口操作 -│   │   ├── tty.hpp tty 定义 -│   │   └── vga.hpp vga 显示定义 -│   └── kernel/ -│   ├── README.md -│   ├── drv/ 设备 -│   │   ├── kb.c -│   │   └── mouse.c -│   └── kernel.c 内核入口 -└── tools/ 工具,在 .rb 文件中你可以找到 gcc 和 binutils 的编译选项 - ├── i386-elf-binutils.rb - └── i386-elf-gcc.rb -``` - -## 测试 - -目前只有很简陋的 CI。 - -### 自动化集成 - -合并到 master 分支时需要通过 Travis CI 测试。编译没有错误即可。 - -## 代码风格 - -## 镜像文件 - -simplekernel.img is 1.44 floppy, our kernel is right here. - -## TODO - -- fix bugs -- mouse input -- debug function -- checlstyle - -## AUTHOR - -Author: [MRNIU](https://github.com/MRNIU) - -您也可以在贡献者名单中参看所有参与该项目的开发者。 - -## CONTRIBUTING - -Read CONTRIBUTING.md. - -## 鸣谢 - -此项目参考了很多优秀的项目和资料 - -[osdev](https://wiki.osdev.org) - -[install GRUB on Mac](https://wiki.osdev.org/GRUB#Installing_GRUB_2_on_OS_X) - -[multiboot](https://www.gnu.org/software/grub/manual/multiboot/multiboot.html) - -[JamesM's kernel development tutorials](http://www.jamesmolloy.co.uk/tutorial_html/1.-Environment%20setup.html) - -[xOS](https://github.com/fengleicn/xOS) - -[hurlex](http://wiki.0xffffff.org/posts/hurlex-8.html) - -[howerj/os](https://github.com/howerj/os) - -[cfenollosa/os-tutorial](https://github.com/cfenollosa/os-tutorial) - -[omarrx024/xos](https://github.com/omarrx024/xos) - -[PurpleBooth/project-title](https://gist.github.com/PurpleBooth/109311bb0361f32d87a2%23project-title) - -[0xAX weblong](http://0xax.blogspot.com/search/label/asm) - -[How-to-Make-a-Computer-Operating-System](https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System) - -[coding-style](https://www.kernel.org/doc/Documentation/process/coding-style.rst) - -## 版权信息 - -此项目使用 MIT 许可证 diff --git a/bochsrc.txt b/bochsrc.txt deleted file mode 100644 index a7cd8f604..000000000 --- a/bochsrc.txt +++ /dev/null @@ -1,22 +0,0 @@ -############################################################### -# bochsrc.txt file for SimpleKernel (https://github.com/MRNIU). - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -############################################################### - -megs: 32 -romimage: file=/usr/local/share/bochs/BIOS-bochs-latest -vgaromimage: file=/usr/local/share/bochs/VGABIOS-lgpl-latest -# 这里需要根据实际路径进行修改 -# Here needs to change as your real path. - -ata0-master: type=disk, path="fs.img", mode=flat -ata1-master: type=cdrom, path="simplekernel.iso", status=inserted -boot: cdrom - -log: bochsout.txt -#mouse: enabled=1 -keyboard: keymap=/usr/local/share/bochs/keymaps/sdl2-pc-us.map -display_library: sdl2 -clock: sync=realtime, time0=local -cpu: ips=1000000 \ No newline at end of file diff --git a/cmake/arch_detector.cmake b/cmake/arch_detector.cmake new file mode 100644 index 000000000..ab687f525 --- /dev/null +++ b/cmake/arch_detector.cmake @@ -0,0 +1,28 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# Based on https://github.com/SynestiaOS/SynestiaOS +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 对 shell 传入的 ARCH 参数进行处理 + +# TODO: 优化 CMake 流程,环境搭建由自动脚本实现 + +# 如果 ARCH 为 i386 或 x86_64,统一添加 ia32 前缀 +if (ARCH STREQUAL i386) + set(SimpleKernelArch ia32/i386) +elseif (ARCH STREQUAL x86_64) + set(SimpleKernelArch ia32/x86_64) +# 其它情况不变 +elseif (ARCH STREQUAL aarch64) + set(SimpleKernelArch aarch64) +elseif (ARCH STREQUAL riscv64) + set(SimpleKernelArch riscv64) +else () + # 不支持的 ARCH + message(WARNING "unexpected ARCH: ${ARCH}, using default value \"riscv64\"") + # 默认设为 riscv64 + set(SimpleKernelArch riscv64) +endif () + +# 输出 SimpleKernelArch +message(STATUS "SimpleKernelArch is ${SimpleKernelArch}") diff --git a/cmake/find_asm_files.cmake b/cmake/find_asm_files.cmake new file mode 100644 index 000000000..1de83082e --- /dev/null +++ b/cmake/find_asm_files.cmake @@ -0,0 +1,11 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# Based on https://github.com/SynestiaOS/SynestiaOS +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 在 Directory 目录下寻找 .s/.S 格式的文件,并添加到 OutValue 中 + +macro(find_asm_source_files OutValue Directory) + file(GLOB ${OutValue} LIST_DIRECTORIES false ${Directory}/*.[sS]) + message(STATUS "found asm files: ${${OutValue}}") +endmacro() diff --git a/cmake/header_files.cmake b/cmake/header_files.cmake new file mode 100644 index 000000000..21d7910de --- /dev/null +++ b/cmake/header_files.cmake @@ -0,0 +1,62 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# Based on https://github.com/SynestiaOS/SynestiaOS +# header_files.cmake for Simple-XX/SimpleKernel. + +function(target_include_libc_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/libc/include) +endfunction() + +function(target_include_libcxx_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/libcxx/include) +endfunction() + +function(target_include_kernel_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/kernel/include) +endfunction() + +function(target_include_arch_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/) + if (SimpleKernelArch STREQUAL "ia32/i386" OR SimpleKernelArch STREQUAL "ia32/x86_64") + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/ia32) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/ia32/port/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/gdt/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/intr/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/ia32/apic/include) + elseif (SimpleKernelArch STREQUAL riscv64) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/opensbi/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/intr/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/hw) + endif() +endfunction() + + +function(target_include_common_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/include/mem) +endfunction() + +function(target_include_drv_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/tui/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/uart/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/opensbi/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/sbi_console/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/dtb/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/multiboot2/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/keyboard/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/platform_bus/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/drv/virtio/include) +endfunction() + +function(target_include_dev_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/device/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/device/platform_bus/include) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/device/virtio/include) +endfunction() + +function(target_include_fs_header_files Target) + target_include_directories(${Target} PRIVATE ${SimpleKernel_SOURCE_CODE_DIR}/fs/fatfs/include) +endfunction() + diff --git a/cmake/toolchain_linux_aarch64.cmake b/cmake/toolchain_linux_aarch64.cmake new file mode 100644 index 000000000..00c7c5885 --- /dev/null +++ b/cmake/toolchain_linux_aarch64.cmake @@ -0,0 +1,38 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# toolchain_linux_aarch64.cmake for Simple-XX/SimpleKernel. + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR AARCH64) + +# TODO +# GCC +find_program(GCC aarch64-none-eabi-gcc) +if (NOT GCC) + message(FATAL_ERROR "gcc-aarch64-linux-gnu not found.\n" + "Run `sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu` to install.") +else () + message(STATUS "Found gcc-aarch64-linux-gnu ${GCC}") +endif () + +set(TOOLCHAIN_PREFIX aarch64-linux-gnu-) +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) +set(CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) +set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) +set(CMAKE_NM ${TOOLCHAIN_PREFIX}nm) +set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) +set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) + +# qemu +find_program(QEMU qemu-system-aarch64) +if (NOT QEMU) + message(FATAL_ERROR "qemu not found.\n" + "Run `sudo apt-get install -y qemu-system` to install.") +else () + message(STATUS "Found qemu ${QEMU}") +endif () diff --git a/cmake/toolchain_linux_riscv.cmake b/cmake/toolchain_linux_riscv.cmake new file mode 100644 index 000000000..def485301 --- /dev/null +++ b/cmake/toolchain_linux_riscv.cmake @@ -0,0 +1,37 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# toolchain_linux_riscv.cmake for Simple-XX/SimpleKernel. + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR RISCV) + +# GCC +find_program(RISCV riscv64-linux-gnu-g++) +if (NOT RISCV) + message(FATAL_ERROR "riscv64-linux-gnu-gcc not found.\n" + "Run `sudo apt-get install -y gcc-riscv64-linux-gnu g++-riscv64-linux-gnu` to install.") +else () + message(STATUS "Found riscv64-linux-gnu-gcc ${RISCV}.") +endif () + +set(TOOLCHAIN_PREFIX riscv64-linux-gnu-) +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) +set(CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) +set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) +set(CMAKE_NM ${TOOLCHAIN_PREFIX}nm) +set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) +set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) + +# qemu +find_program(QEMU qemu-system-riscv64) +if (NOT QEMU) + message(FATAL_ERROR "qemu not found.\n" + "Run `sudo apt-get install -y qemu-system` to install.") +else () + message(STATUS "Found qemu ${QEMU}") +endif () diff --git a/cmake/toolchain_linux_x86_64.cmake b/cmake/toolchain_linux_x86_64.cmake new file mode 100644 index 000000000..67df794bf --- /dev/null +++ b/cmake/toolchain_linux_x86_64.cmake @@ -0,0 +1,45 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# toolchain_linux_x86_64.cmake for Simple-XX/SimpleKernel. + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +# GCC +find_program(G++ g++) +if (NOT G++) + message(FATAL_ERROR "g++ not found.\n" + "Run `sudo apt-get install -y gcc g++` to install.") +else () + message(STATUS "Found g++ ${G++}") +endif () + +# xorriso +find_program(XORRISO xorriso) +if (NOT XORRISO) + message(FATAL_ERROR "xorriso not found.\n" + "Run `sudo apt-get install -y xorriso` to install.") +else () + message(STATUS "Found xorriso ${XORRISO}") +endif () + +# GRUB +find_program(GRUB grub-file) +if (NOT GRUB) + message(FATAL_ERROR "grub-file not found.\n" + "Run `sudo apt-get install -y grub2` to install.") +else () + message(STATUS "Found grub-file ${GRUB}") +endif () + +# qemu +find_program(QEMU qemu-system-x86_64) +if (NOT QEMU) + message(FATAL_ERROR "qemu not found.\n" + "Run `sudo apt-get install -y qemu-system` to install.") +else () + message(STATUS "Found qemu ${QEMU}") +endif () diff --git a/cmake/toolchain_mac_aarch64.cmake b/cmake/toolchain_mac_aarch64.cmake new file mode 100644 index 000000000..1d5a4c88a --- /dev/null +++ b/cmake/toolchain_mac_aarch64.cmake @@ -0,0 +1,47 @@ + +# This file is a part of Simple-XX/SimpleKernel (https://github.com/Simple-XX/SimpleKernel). +# +# toolchain_mac_aarch64.cmake for Simple-XX/SimpleKernel. + +set(CMAKE_SYSTEM_NAME Darwin) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR AARCH64) + +set(arm_gcc_toolchain_path ${CMAKE_CURRENT_SOURCE_DIR}/../../../tools/aarch64-unknown-linux-gnu.tar.xz) +set(arm_gcc_toolchain_dir ${CMAKE_CURRENT_SOURCE_DIR}/../../../tools/aarch64-unknown-linux-gnu) +set(arm_gcc_toolchain_url https://github.com/thinkski/osx-arm-linux-toolchains/releases/download/8.3.0/aarch64-unknown-linux-gnu.tar.xz) + +# GCC +find_program(GCC ${CMAKE_CURRENT_SOURCE_DIR}/../../../tools/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-g++) +if (NOT GCC) + message("aarch64-unknown-linux-gnu-g++ not found.\n" + "install ...") + file(DOWNLOAD ${arm_gcc_toolchain_url} ${arm_gcc_toolchain_path} + EXPECTED_MD5 a8acb994a78185191e6be31f3573cec0 + TLS_VERIFY ON + SHOW_PROGRESS) + execute_process(COMMAND + ${CMAKE_COMMAND} -E tar xvzf ${arm_gcc_toolchain_path} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../../tools) +else () + message(STATUS "Found aarch64-unknown-linux-gnu-g++ ${GCC}") +endif () + +set(TOOLCHAIN_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/../../../tools/aarch64-unknown-linux-gnu/bin/aarch64-unknown-linux-gnu-) +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) +set(CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) +set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) +set(CMAKE_NM ${TOOLCHAIN_PREFIX}nm) +set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) +set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) + +# qemu +find_program(QEMU qemu-system-aarch64) +if (NOT QEMU) + message(FATAL_ERROR "qemu not found.\n" + "Please install qemu first.") +else () + message(STATUS "Found qemu ${QEMU}") +endif () diff --git a/cmake/toolchain_mac_riscv.cmake b/cmake/toolchain_mac_riscv.cmake new file mode 100644 index 000000000..0f054bdac --- /dev/null +++ b/cmake/toolchain_mac_riscv.cmake @@ -0,0 +1,44 @@ + +# This file is a part of Simple-XX/SimpleKernel (https://github.com/Simple-XX/SimpleKernel). +# +# toolchain_mac_riscv.cmake for Simple-XX/SimpleKernel. + +set(CMAKE_SYSTEM_NAME Darwin) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR RISCV) + +find_program(BREW brew) +if (NOT BREW) + message(FATAL_ERROR "brew not found.\n" + "Run `/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"` to install linuxbrew") +else () + message(STATUS "Found brew ${BREW}") +endif () + +# GCC +find_program(RISCV riscv64-unknown-elf-gcc) +if (NOT RISCV) + message(FATAL_ERROR "riscv64-unknown-elf-gcc not found.\n" + "Run `brew tap riscv-software-src/riscv` and `brew install riscv-tools` to install the toolchain. Then add the bin path to you PATH.") +else () + message(STATUS "Found riscv64-unknown-elf-gcc ${RISCV}.") +endif () + +set(TOOLCHAIN_PREFIX riscv64-unknown-elf-) +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) +set(CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) +set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) +set(CMAKE_NM ${TOOLCHAIN_PREFIX}nm) +set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) +set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) + +# qemu +find_program(QEMU qemu-system-riscv64) +if (NOT QEMU) + message(FATAL_ERROR "qemu not found.\n" + "Please install qemu first.") +else () + message(STATUS "Found qemu ${QEMU}") +endif () diff --git a/cmake/toolchain_mac_x86_64.cmake b/cmake/toolchain_mac_x86_64.cmake new file mode 100644 index 000000000..b9ff72f15 --- /dev/null +++ b/cmake/toolchain_mac_x86_64.cmake @@ -0,0 +1,62 @@ + +# This file is a part of Simple-XX/SimpleKernel (https://github.com/Simple-XX/SimpleKernel). +# +# toolchain_mac_x86_64.cmake for Simple-XX/SimpleKernel. + +set(CMAKE_SYSTEM_NAME Darwin) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR x86_64) + +find_program(BREW brew) +if (NOT BREW) + message(FATAL_ERROR "brew not found.\n" + "Run `/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)\"` to install linuxbrew") +else () + message(STATUS "Found brew ${BREW}") +endif () + +# GCC +find_program(GCC x86_64-elf-gcc) +if (NOT GCC) + message(FATAL_ERROR "x86_64-elf-gcc not found.\n" + "Run `brew install x86_64-elf-gcc` to install the toolchain.") +else () + message(STATUS "Found x86_64-elf-gcc ${GCC}.") +endif () + +set(TOOLCHAIN_PREFIX x86_64-elf-) +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) +set(CMAKE_READELF ${TOOLCHAIN_PREFIX}readelf) +set(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}ld) +set(CMAKE_NM ${TOOLCHAIN_PREFIX}nm) +set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) +set(CMAKE_RANLIB ${TOOLCHAIN_PREFIX}ranlib) + +# xorriso +find_program(Xorriso xorriso) +if (NOT Xorriso) + message(FATAL_ERROR "xorriso not found.\n" + "run `brew install xorriso` to install the toolchain") +else () + message(STATUS "Found xorriso ${Xorriso}") +endif () + +# GRUB +find_program(GRUB grub-file) +if (NOT GRUB) + message(FATAL_ERROR "grub-file not found.\n" + "Use grub4mac.sh to install grub.") +else () + message(STATUS "Found grub-file ${GRUB}") +endif () + +# qemu +find_program(QEMU qemu-system-x86_64) +if (NOT QEMU) + message(FATAL_ERROR "qemu not found.\n" + "Please install qemu first.") +else () + message(STATUS "Found qemu ${QEMU}") +endif () diff --git "a/docs/-1_\345\217\202\350\200\203\350\265\204\346\226\231\346\261\207\346\200\273.md" "b/docs/-1_\345\217\202\350\200\203\350\265\204\346\226\231\346\261\207\346\200\273.md" new file mode 100644 index 000000000..c7d0a2687 --- /dev/null +++ "b/docs/-1_\345\217\202\350\200\203\350\265\204\346\226\231\346\261\207\346\200\273.md" @@ -0,0 +1,45 @@ +# SimpleKernel 参考资料汇总 + +关于交叉编译的一些说明:https://wiki.osdev.org/GCC_Cross-Compiler + +arm 工具链:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads + +riscv 工具链:https://github.com/riscv/riscv-gnu-toolchain + +GCC 安装: https://gcc.gnu.org/install/ + +i386 的启动代码:https://wiki.osdev.org/Bare_Bones + +grub:https://www.gnu.org/software/grub/manual/grub/grub.html + +multiboot2 规范:https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html + +opensbi:https://github.com/riscv/opensbi + +c++ 的使用:https://wiki.osdev.org/C++ + +如何对全局对象进行构造:https://wiki.osdev.org/Calling_Global_Constructors + +c++ abi 支持:https://wiki.osdev.org/C%2B%2B_Exception_Support + +gcc 内嵌汇编:https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html + +IA32 prots:https://wiki.osdev.org/I/O_Ports + +IA32 VGA:https://wiki.osdev.org/VGA_Hardware + +IA32 text ui:https://wiki.osdev.org/Text_UI + +IA32 text 模式的光标:https://wiki.osdev.org/Text_Mode_Cursor + +IA32 text 模式在屏幕上输出:https://wiki.osdev.org/Printing_To_Screen + +device-tree:https://github.com/devicetree-org/devicetree-specification + +dtb解析0: https://e-mailky.github.io/2016-12-06-dts-introduce + +dtb解析1: https://e-mailky.github.io/2019-01-14-dts-1 + +dtb解析2: https://e-mailky.github.io/2019-01-14-dts-2 + +dtb解析3: https://e-mailky.github.io/2019-01-14-dts-3 diff --git "a/docs/0_\345\267\245\345\205\267\351\223\276.md" "b/docs/0_\345\267\245\345\205\267\351\223\276.md" new file mode 100644 index 000000000..3e1b3ed00 --- /dev/null +++ "b/docs/0_\345\267\245\345\205\267\351\223\276.md" @@ -0,0 +1,120 @@ +# SimpleKernel 工具链 + +SimpleKernel 为了保证在各个平台上的可用性,选择了较为通用的工具链,主要分为三个部分 + +1. 构建系统 + + 使用 CMake 对代码进行管理,同时控制编译选项 + +2. 内核的编译 + + 使用 GCC 工具链 + +3. 模拟器 + + 对于 x86/x86_64 架构,支持 bochs 与 qemu + + arm/aarch64/riscv64 架构,使用 qemu + +4. 辅助脚本 + + 主要用于环境变量管理,如 `./run.sh` 是用来编译并运行内核,`./tools/env.sh` 则规定了需要的参数。 + + 此外还有模拟器配置,如 `./bochsrc_linux.txt` + +## CMake + +CMake 可以分为两个部分 + +1. 主要 cmake 规则 + + 所有 CMakeLists.txt 文件,规定了内核的编译方式。 + + - ./CMakeLists.txt + + 设置了一些 CMake 选项,并在最后通过 `add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR})` 将控制权转移到 ./src/CMakeLists.txt + + - ./src/CMakeLists.txt + + 规定了 gcc 的编译选项,指定生成的二进制文件名称,并规定生成二进制文件所需的模块 + + - ./src/*/CMakeLists.txt + + 各个模块的编译规则 + +2. 辅助 cmake 规则 + + 用于辅助主要规则,保存在 ./cmake 目录下 + + - toolchain_*.cmake 用于判断依赖是否已安装 + - header_files.cmake 用于添加头文件 + - find_asm_files.cmake 用于将汇编文件添加到编译列表 + - arch_detector.cmake 用于判断目标架构 + +更多细节请查看注释。 + +项目地址:[CMake](https://cmake.org) + +## GCC + +GCC 需要根据目标平台与宿主机进行配置,即 target 与 host。 + +一般而言,网上有编译好的可以直接拿来用。 + +以 target=riscv64,host=osx 为例,可以在 `https://github.com/riscv/homebrew-riscv` 找到现成的,只需要按照说明安装即可。 + +对于特殊情况,可能需要自己手动编译 gcc,大致步骤如下[^1]: + +1. 安装依赖 +2. 下载源码 +3. 配置 +4. 编译 + +其中比较重要的地方是第三步,需要根据需要进行配置,你可以参考 ./tools/x86_64-elf-gcc.sh 的内容进行编译。 + +项目地址:[GCC, the GNU Compiler Collection - GNU Project](https://gcc.gnu.org) + +## bochs + +bochs 是专门用于 x86/x86_64 的虚拟机。 + +./tools/bochsrc_*.txt 规定了虚拟机的配置选项 + +./tools/bochsinit 规定在虚拟机启动后执行的命令 + +项目地址:[bochs: The Open Source IA-32 Emulation Project (Home Page)](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwibsOK5v5b4AhUFD0QIHTX-BS4QFnoECBMQAQ&url=https%3A%2F%2Fbochs.sourceforge.io%2F&usg=AOvVaw22vn_4SPHPDYUk_NoYgyP2) + +更多细节请查看注释 + +## qemu + +qemu 是支持范围更大的虚拟机,支持多种架构。 + +安装: + +项目地址:[QEMU](https://www.qemu.org) + +## 辅助脚本 + +- ./tools/env.sh + + 设置目标架构,并根据设置的目标架构初始化相关变量。 + + 更多细节请查看注释。 + +- ./run.sh + + 根据 tools/env.sh 的设置在虚拟机中运行内核。 + + 更多细节请查看注释。 + + +## 相关文档 + +关于交叉编译的一些说明:https://wiki.osdev.org/GCC_Cross-Compiler + +arm 工具链:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads + +riscv 工具链:https://github.com/riscv/riscv-gnu-toolchain + +[^1]: https://gcc.gnu.org/install/ diff --git "a/docs/1.5_cpp\347\232\204\345\210\235\345\247\213\345\214\226.md" "b/docs/1.5_cpp\347\232\204\345\210\235\345\247\213\345\214\226.md" new file mode 100644 index 000000000..e5d984404 --- /dev/null +++ "b/docs/1.5_cpp\347\232\204\345\210\235\345\247\213\345\214\226.md" @@ -0,0 +1,67 @@ +# SimpleKernel cpp 的初始化 + +Simplekernel 主要是用 C++ 完成的,为了最大化 C++ 的优势,需要对 C++ 的一些基础设施进行初始化。 + +这一工作大致分为两部分。 + +## cxxabi + +cxxabi 是 C++ 特性的基础,一些特性必须由 cxxabi 实现后才能使用。 + +在 ./src/libcxx/include/cxxabi.h 与 ./src/libcxx/cxxabi.cpp 两个文件中定义了相关数据与函数,链接阶段将这些定义链接上就可以正常使用相关特性了。 + +这部分不进行深究,相关资料:[cxxabi-1.86](http://refspecs.linux-foundation.org/cxxabi-1.86.html) + +## 全局对象的构造 + +在通常场景下,C++ 的全局对象会在进入 main 函数之前进行构造,在 main 返回后析构。在内核里也是一样,我们需要在进入 kernel_main 之前完成构造,不同的是我们不需要考虑析构问题,因为内核是不会返回的,当它结束的时候意味着关机了。 + +编译器在链接时,会将所有的全局对象的构造函数函数指针收集在一起,放在一个名为 `.init_array` 的段中,在 src/arch/*/link.ld 中,有这么一段规则: + +``` +/* 只读数据段 */ +.rodata : ALIGN(4K) { + /* 构造函数起点 */ + PROVIDE(ctors_start = .); + *(SORT_BY_INIT_PRIORITY (.init_array.*)) + *(SORT_BY_INIT_PRIORITY (.ctors.*)) + *(.init_array .ctors) + /* 构造函数终点 */ + PROVIDE(ctors_end = .); + /* 析构函数起点 */ + PROVIDE(dtors_start = .); + *(.dtor*) + /* 析构函数终点 */ + PROVIDE(dtors_end = .); + *(.rodata*) + *(.gcc_except_table) +} +``` + +这部分规定将构造函数放在 `.rodata` 段里,并将这段内存用 `ctors_start` 和 `ctors_end` 两个地址进行标识,以便在代码中访问。 + +初始化由 `cpp_init` 执行,定义在 ./src/libcxx/src/cxxabi.cpp 中 + +```c++ +typedef void (*ctor_t)(void); +extern ctor_t ctors_start[]; +extern ctor_t ctors_end[]; +void cpp_init(void) { + ctor_t *f; + for (f = ctors_start; f < ctors_end; f++) { + (*f)(); + } + return; +} +``` + +遍历这一区域的所有函数并执行,这样就完成了全局对象的构造。 + +更多细节请查看注释。 + +## 相关文档 + +https://wiki.osdev.org/C++ + +https://wiki.osdev.org/Calling_Global_Constructors + diff --git "a/docs/1_\347\263\273\347\273\237\345\220\257\345\212\250.md" "b/docs/1_\347\263\273\347\273\237\345\220\257\345\212\250.md" new file mode 100644 index 000000000..7c03a1c72 --- /dev/null +++ "b/docs/1_\347\263\273\347\273\237\345\220\257\345\212\250.md" @@ -0,0 +1,92 @@ +# SimpleKernel 启动 + +内核实际上也是一个程序,它从链接脚本规定的入口点(`ENTRY(_start)`)开始执行,但在这一步之前,还得让硬件知道 `_start` 的位置,这一步骤 SImpleKernel 使用了一些开源的引导程序来辅助这一过程,你可以在 osdev 看看具体的流程[^1],这里不再赘述。 + +## IA32 + +IA32 包括 i386(或 x86) 与 x86_64,它们在细节上有部分区别。 + +SimpleKernel 使用 grub2 进行辅助,跳过与机器打交道的部分,由 grub2 进行最最开始的设置,我们只需要处理从 `_start` 开始的代码即可。 + +相比其它架构,IA32 有太多历史包袱,这导致它的启动过程比较麻烦,尤其是实模式(16bit),保护模式(32bit),以及长模式(64bit)的切换十分复杂。幸运的是,grub2 已经帮我们进入了保护模式,这使得我们可以暂时跳过相关模式的设置。 + +- grub2[^2] + + 一个引导程序,在 linux 中有广泛的应用,这里只使用了它最基础的功能。 + +- multiboot2[^3] + + 这是一个引导标准,一般用于 pc 的启动,任何符合 multiboot2 标准的内核都可以通过支持 multiboot2 标准的引导程序启动。 + + 这个标准在内核中的表现为 ia32/*/boot.S 中的 + + ```assembly + // 声明这一段代码以 32 位模式编译 + .code32 + + // multiboot2 文件头 + // 计算头长度 + .SET HEADER_LENGTH, multiboot_header_end - multiboot_header + // 计算校验和 + .SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + HEADER_LENGTH) + // 8 字节对齐 + .align MULTIBOOT_HEADER_ALIGN + // 声明所属段 + .section .multiboot_header + multiboot_header: + // 魔数 + .long MULTIBOOT2_HEADER_MAGIC + // 架构 + .long MULTIBOOT_ARCHITECTURE_I386 + // 头长度 + .long HEADER_LENGTH + // 校验和 + .long CHECKSUM + // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf + .short MULTIBOOT_HEADER_TAG_END + // 结束标记 + .short 0 + .long 8 + multiboot_header_end: + ``` + + 只要在内核开始部分检测到符合 multiboot2 规定的数据,就认为这是一个符合规范的内核,引导程序会在对硬件进行初始化后将控制权交给 `_start` + +- x86 + + 由于 grub 已经进入了保护模式,我们不需要做什么多余的事情,在设置栈指针后直接进入 C 函数 `kernel_main` 执行即可。 + + - 执行流 + + 模拟器 -> grub2 -> _start(boot.S ) -> kernel_main(kernel_main.cpp) + +- x86_64 + + TODO + +更多细节请查看注释。 + +## RISCV + +riscv 相较 IA32 非常新,其标准至今还在更新,它没有 IA32 那么多的遗留问题与设计冗余,所以简单不少。 + +引导程序使用了 opensbi,与 grub 类似,opensbi 将硬件设置为 S 态后跳转到我们的代码中,但相比 ia32/grub 的繁琐,riscv/opensbi 更为精炼。 + +- opensbi[^4] + + 在 riscv 设备启动时,会进入 M(Machine) 态,这是 riscv 架构中权限最高的一级,可以操作所有硬件资源,opensbi 会在这一级进行一些设置,然后切换到 S(Supervisor) 态执行内核代码,S 态可以访问到的资源是 M 态的子集。 + +同样,在设置栈地址后跳转到 `kernel_main` 执行。 + +- 执行流 + + 模拟器 -> opensbi -> _start(boot.S) -> kernel_main(kernel_main.cpp) + +更多细节请查看注释。 + +## 相关文档 + +[^1]: https://wiki.osdev.org/Bare_Bones +[^2]: https://www.gnu.org/software/grub/manual/grub/grub.html +[^3]: https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html +[^4]: https://github.com/riscv/opensbi diff --git "a/docs/2_\345\237\272\346\234\254\350\276\223\345\207\272.md" "b/docs/2_\345\237\272\346\234\254\350\276\223\345\207\272.md" new file mode 100644 index 000000000..fc9a002fb --- /dev/null +++ "b/docs/2_\345\237\272\346\234\254\350\276\223\345\207\272.md" @@ -0,0 +1,249 @@ +# SimpleKernel 基本输出 + +在内核顺利启动后,为了方便以后的调试,应该优先实现字符的输出功能。 + +为了满足不同平台的接口一致,抽象出了一个静态类 `IO` 来统一端口读写、MMIO、以及输出调用。 + +- 相关代码 + + ./src/include/io.h + + ./src/kernel/io.cpp + + ./src/drv/sbi_console,riscv 架构使用下基于 opensbi 的串口输出 + + ./src/drv/tui,IA32 下使用的 text user interface 输出 + + ./src/drv/uart,通用 uart 输出 + +## IA32 + +IA32 提供了一套名为 TUI(text user interface) 的东西,它允许我们通过读写端口与内存的方式在屏幕上输出文字,它是我们在 IA32 上实现基本输出的基础。 + +使用这套系统有三个主要部分: + +1. 光标位置 + + 通过读写 `TUI_ADDR` 与 `TUI_DATA` 两个端口实现光标位置的读取与设置。 + + ```c++ + void TUI::set_pos(const pos_t _pos) { + const uint16_t index = _pos.row * this->WIDTH + _pos.col; + this->pos = _pos; + // 光标的设置,见参考资料 + // 告诉 TUI 我们要设置光标的高字节 + PORT::outb(TUI_ADDR, TUI_CURSOR_H); + // 发送高 8 位 + PORT::outb(TUI_DATA, index >> 8); + // 告诉 TUI 我们要设置光标的低字节 + PORT::outb(TUI_ADDR, TUI_CURSOR_L); + // 发送低 8 位 + PORT::outb(TUI_DATA, index); + return; + } + + pos_t TUI::get_pos(void) const { + PORT::outb(TUI_ADDR, TUI_CURSOR_H); + size_t cursor_pos_h = PORT::inb(TUI_DATA); + PORT::outb(TUI_ADDR, TUI_CURSOR_L); + size_t cursor_pos_l = PORT::inb(TUI_DATA); + // 返回光标位置 + return pos_t(cursor_pos_l, cursor_pos_h); + } + ``` + + + +2. 字符及其颜色 + + 要在屏幕上输出字符,需要向地址 0xB8000 写入数据,数据格式为 + + ```c++ + /** + * @brief 颜色信息 + */ + class col_t { + public: + /** + * @brief 构造一个颜色对象 + * @param _fore 前景色 + * @param _back 背景色 + */ + col_t(const COLOR::color_t _fore, const COLOR::color_t _back); + + ~col_t(void); + // 前景色 + uint8_t fore : 4; + // 背景色 + uint8_t back : 4; + }; + + /** + * @brief 内存中的字符对象 + */ + class char_t { + public: + char_t(void); + + /** + * @brief 构造一个内存中的字符对象 + * @param _c 字符 + * @param _color 颜色 + */ + char_t(const uint8_t _c, const col_t _color); + + ~char_t(void); + // 字符 + uint8_t c; + // 颜色 + col_t color; + }; + ``` + + 共计 2 字节大小。 + + 其中第一字节为要显示的 ASCII 字符,后面 8 位的高 4 位与低 4 位分别表示前景颜色与背景颜色。 + +3. 缓存地址 + + 在我们的设置中,TUI 的缓存地址从 0xB8000 开始,大小为 80\*25\*2=4000 字节。 + + 其中, + + 80=列数, + + 25=行数, + + 2=字符及其颜色数据大小 + +- 相关代码 + + ./src/include/color.h + + ./src/drv/tui/include/tui.h + + ./src/drv/tui/tui.cpp + +更多细节请查看注释。 + +## RISCV + +riscv 通过 uart 进行输出,但我们并不需要自己写 uart 驱动,opensbi 提供了现成的接口,直接调用即可。 + +```c++ +void OPENSBI::put_char(const char _c) { + ecall(_c, 0, 0, 0, 0, 0, FID_CONSOLE_PUTCHAR, EID_CONSOLE_PUTCHAR); + return; +} +``` + +- 颜色设置 + + 由于实际使用的是串口,所以可以通过控制字符来实现对颜色的控制 + ```c++ + void SBI_CONSOLE::set_color(const COLOR::color_t _color) const { + // 根据 _color 构造字符串 + char *tmp = nullptr; + switch (_color) { + case COLOR::BLACK: { + tmp = (char *)"\033[30m"; + break; + } + case COLOR::RED: { + tmp = (char *)"\033[31m"; + break; + } + case COLOR::GREEN: { + tmp = (char *)"\033[32m"; + break; + } + case COLOR::YELLOW: { + tmp = (char *)"\033[33m"; + break; + } + case COLOR::BLUE: { + tmp = (char *)"\033[34m"; + break; + } + case COLOR::PURPLE: { + tmp = (char *)"\033[35m"; + break; + } + case COLOR::CYAN: { + tmp = (char *)"\033[36m"; + break; + } + case COLOR::WHITE: { + tmp = (char *)"\033[37m"; + break; + } + case COLOR::GREY: { + tmp = (char *)"\033[90m"; + break; + } + case COLOR::LIGHT_RED: { + tmp = (char *)"\033[91m"; + break; + } + case COLOR::LIGHT_GREEN: { + tmp = (char *)"\033[92m"; + break; + } + case COLOR::LIGHT_YELLOW: { + tmp = (char *)"\033[93m"; + break; + } + case COLOR::LIGHT_BLUE: { + tmp = (char *)"\033[94m"; + break; + } + case COLOR::LIGHT_PURPLE: { + tmp = (char *)"\033[95m"; + break; + } + case COLOR::LIGHT_CYAN: { + tmp = (char *)"\033[96m"; + break; + } + case COLOR::LIGHT_WHITE: { + tmp = (char *)"\033[97m"; + break; + } + } + // 写入 + write_string(tmp); + color = _color; + return; + } + ``` + +opensbi 接口文档:[riscv-sbi-doc](https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/riscv-sbi.adoc) + +- 相关代码 + + ./src/include/color.h + + ./src/drv/opensbi/include/opensbi.h + + ./src/drv/opensbi/opensbi.cpp + + ./src/drv/sbi_console/include/sbi_console.h + + ./src/drv/sbi_console/sbi_console.cpp + +更多细节请查看注释。 + +## 相关文档 + +opensbi:https://github.com/riscv/opensbi + +IA32 prots:https://wiki.osdev.org/I/O_Ports + +IA32 VGA:https://wiki.osdev.org/VGA_Hardware + +IA32 text ui:https://wiki.osdev.org/Text_UI + +IA32 text 模式的光标:https://wiki.osdev.org/Text_Mode_Cursor + +IA32 text 模式在屏幕上输出:https://wiki.osdev.org/Printing_To_Screen + diff --git "a/docs/3_\350\247\243\346\236\220\345\220\257\345\212\250\344\277\241\346\201\257.md" "b/docs/3_\350\247\243\346\236\220\345\220\257\345\212\250\344\277\241\346\201\257.md" new file mode 100644 index 000000000..e5a9d2bd4 --- /dev/null +++ "b/docs/3_\350\247\243\346\236\220\345\220\257\345\212\250\344\277\241\346\201\257.md" @@ -0,0 +1,240 @@ +# SimpleKernel 解析启动信息 + +为了支持接下来的工作,我们需要获取电脑的硬件信息,这些信息可以通过引导程序传递,我们只要做解析即可。 + +同样,有一个 `BOOT_INFO` 名称空间来统一管理这些接口。 + +- 相关代码 + + ./src/include/boot_info.h + + ./src/include/resource.h + +## IA32 + +在启动时我们使用了 grub2+multiboot2 的方式进行引导,在同时还会为我们提供所需要的硬件信息。 + +grub2 会通过 `eax` 和 `ebx` 两个寄存器将信息传递给我们,只需要在启动阶段保存它们,就能在后面进行解析,获取硬件信息。 + +multiboot2 使用迭代方法寻找所需信息,函数 `multiboot2_iter(bool (*_fun)(const iter_data_t *, void *), void *_data)` 提供了这一接口。 + + +- 相关代码 + + ./src/arch/ia32/i386/boot/boot.S + + ./src/drv/multiboot2/include/multiboot2.h + + ./src/drv/multiboot2/multiboot2.cpp + +更多细节请查看注释。 + +## RISCV + +设备树(device tree)是嵌入式设备常用的硬件配置信息传递方式,在启动时,opensbi 会将设备树信息的地址传递给内核, + +```assembly +.section .init +.globl _start +.type _start, @function +.extern kernel_main +.extern cpp_init +.extern boot_info_addr +.extern dtb_init_hart +_start: + // 保存 sbi 传递的参数 + // 将 a0 的值传递给 dtb_init_hart + sw a0, dtb_init_hart, t0 + // 将 a1 的值传递给 boot_info_addr + sw a1, boot_info_addr, t0 + // 设置栈地址 + la sp, stack_top + // 初始化 C++ + call cpp_init + // 跳转到 C 代码执行 + call kernel_main +``` + +内核会在 `BOOT_INFO` 中进行初始化,解析其内容。 + +```c++ +namespace BOOT_INFO { +bool init(void) { + auto res = DTB::get_instance().dtb_init(); + if (inited == false) { + inited = true; + info("BOOT_INFO init.\n"); + } + else { + info("BOOT_INFO reinit.\n"); + } + return res; +} +}; // namespace BOOT_INFO + +bool DTB::dtb_init(void) { + // 头信息 + dtb_info.header = (fdt_header_t *)BOOT_INFO::boot_info_addr; + // 魔数 + assert(be32toh(dtb_info.header->magic) == FDT_MAGIC); + // 版本 + assert(be32toh(dtb_info.header->version) == FDT_VERSION); + // 设置大小 + BOOT_INFO::boot_info_size = be32toh(dtb_info.header->totalsize); + // 内存保留区 + dtb_info.reserved = + (fdt_reserve_entry_t *)(BOOT_INFO::boot_info_addr + + be32toh(dtb_info.header->off_mem_rsvmap)); + // 数据区 + dtb_info.data = + BOOT_INFO::boot_info_addr + be32toh(dtb_info.header->off_dt_struct); + // 字符区 + dtb_info.str = + BOOT_INFO::boot_info_addr + be32toh(dtb_info.header->off_dt_strings); + // 检查保留内存 + dtb_mem_reserved(); + // 初始化 map + bzero(nodes, sizeof(nodes)); + bzero(phandle_map, sizeof(phandle_map)); + // 初始化节点的基本信息 + dtb_iter(DT_ITER_BEGIN_NODE | DT_ITER_END_NODE | DT_ITER_PROP, dtb_init_cb, + nullptr); + // 中断信息初始化,因为需要查找 phandle,所以在基本信息初始化完成后进行 + dtb_iter(DT_ITER_PROP, dtb_init_interrupt_cb, nullptr); +// #define DEBUG +#ifdef DEBUG + // 输出所有信息 + for (size_t i = 0; i < nodes[0].count; i++) { + std::cout << nodes[i].path << ": " << std::endl; + for (size_t j = 0; j < nodes[i].prop_count; j++) { + printf("%s: ", nodes[i].props[j].name); + for (size_t k = 0; k < nodes[i].props[j].len / 4; k++) { + printf("0x%X ", + be32toh(((uint32_t *)nodes[i].props[j].addr)[k])); + } + printf("\n"); + } + } +#undef DEBUG +#endif + return true; +} +``` + +`void DTB::dtb_iter(uint8_t _cb_flags, bool (*_cb)(const iter_data_t *, void *), void * _data)` 是解析的核心函数 + +```c++ +void DTB::dtb_iter(uint8_t _cb_flags, bool (*_cb)(const iter_data_t *, void *), + void *_data, uintptr_t _addr) { + // 迭代变量 + iter_data_t iter; + // 路径深度 + iter.path.len = 0; + // 数据地址 + iter.addr = (uint32_t *)_addr; + // 节点索引 + iter.nodes_idx = 0; + // 开始 flag + bool begin = true; + + while (1) { + // + iter.type = be32toh(iter.addr[0]); + switch (iter.type) { + case FDT_NOP: { + // 跳过 type + iter.addr++; + break; + } + case FDT_BEGIN_NODE: { + // 第 len 深底的名称 + iter.path.path[iter.path.len] = (char *)(iter.addr + 1); + // 深度+1 + iter.path.len++; + iter.nodes_idx = begin ? 0 : (iter.nodes_idx + 1); + begin = false; + if (_cb_flags & DT_ITER_BEGIN_NODE) { + if (_cb(&iter, _data)) { + return; + } + } + // 跳过 type + iter.addr++; + // 跳过 name + iter.addr += + COMMON::ALIGN(strlen((char *)iter.addr) + 1, 4) / 4; + break; + } + case FDT_END_NODE: { + if (_cb_flags & DT_ITER_END_NODE) { + if (_cb(&iter, _data)) { + return; + } + } + // 这一级结束了,所以 -1 + iter.path.len--; + // 跳过 type + iter.addr++; + break; + } + case FDT_PROP: { + iter.prop_len = be32toh(iter.addr[1]); + iter.prop_name = (char *)(dtb_info.str + be32toh(iter.addr[2])); + iter.prop_addr = iter.addr + 3; + if (_cb_flags & DT_ITER_PROP) { + if (_cb(&iter, _data)) { + return; + } + } + iter.prop_name = nullptr; + iter.prop_addr = nullptr; + // 跳过 type + iter.addr++; + // 跳过 len + iter.addr++; + // 跳过 nameoff + iter.addr++; + // 跳过 data,并进行对齐 + iter.addr += COMMON::ALIGN(iter.prop_len, 4) / 4; + iter.prop_len = 0; + break; + } + case FDT_END: { + return; + } + default: { + printf("unrecognized token 0x%X\n", iter.type); + return; + } + } + } + return; +} +``` + +- 相关代码 + + ./src/arch/riscv64/boot/boot.S + + ./src/drv/dtb/include/dtb.h + + ./src/drv/dtb/dtb.cpp + +更多细节请查看注释。 + +## 相关文档 + +multiboot2 规范:https://www.gnu.org/software/grub/manual/multiboot2/multiboot.html + +opensbi:https://github.com/riscv/opensbi + +device-tree:https://github.com/devicetree-org/devicetree-specification + +dtb解析0: https://e-mailky.github.io/2016-12-06-dts-introduce + +dtb解析1: https://e-mailky.github.io/2019-01-14-dts-1 + +dtb解析2: https://e-mailky.github.io/2019-01-14-dts-2 + +dtb解析3: https://e-mailky.github.io/2019-01-14-dts-3 + diff --git "a/docs/4_\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/docs/4_\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" new file mode 100644 index 000000000..6bd19127f --- /dev/null +++ "b/docs/4_\347\211\251\347\220\206\345\206\205\345\255\230\347\256\241\347\220\206.md" @@ -0,0 +1,146 @@ +# SimpleKernel 物理内存管理 + +物理内存是内核的基础模块,我们会使用一个分配器对它进行统一管理。 + +分配器的基类是 `ALLOCATOR` 类,这是一个抽象类,必须被继承后才能使用。 + +由抽象类派生出的具体类是一个分配算法,使用了首次匹配算法(First Fit)。 + +分配器以 4KB 为最小管理单位,每次分配或回收都是它的整数倍。 + +此外,为了区分内核权限的内存和用户权限的内存,在 PMM 类的实现中有两个指向 FIRSTFIT 类的 ALLOCATOR 类指针,这允许我们指定要操作的内存位置。 + +```c++ +/** + * @brief 内存分配器抽象类 + */ +class ALLOCATOR { +private: +protected: + /// 分配器名称 + const char *name; + /// 当前管理的内存区域地址 + uintptr_t allocator_start_addr; + /// 当前管理的内存区域长度 + size_t allocator_length; + /// 当前管理的内存区域空闲长度 + size_t allocator_free_count; + /// 当前管理的内存区域已使用长度 + size_t allocator_used_count; + +public: + /** + * @brief 构造内存分配器 + * @param _name 分配器名 + * @param _addr 要管理的内存开始地址 + * @param _len 要管理的内存长度,单位以具体实现为准 + */ + ALLOCATOR(const char *_name, uintptr_t _addr, size_t _len); + + virtual ~ALLOCATOR(void) = 0; + + /** + * @brief 分配 _len 页 + * @param _len 页数 + * @return uintptr_t 分配到的地址 + */ + virtual uintptr_t alloc(size_t _len) = 0; + + /** + * @brief 在指定地址分配 _len 长度 + * @param _addr 指定的地址 + * @param _len 长度 + * @return true 成功 + * @return false 失败 + */ + virtual bool alloc(uintptr_t _addr, size_t _len) = 0; + + /** + * @brief 释放 _len 长度 + * @param _addr 地址 + * @param _len 长度 + */ + virtual void free(uintptr_t _addr, size_t _len) = 0; + + /** + * @brief 已使用数量 + * @return size_t 数量 + */ + virtual size_t get_used_count(void) const = 0; + + /** + * @brief 空闲数量 + * @return size_t 数量 + */ + virtual size_t get_free_count(void) const = 0; +}; +``` + +具体到不同架构,物理内存管理会从 `BOOT_INFO` 获取信息进行初始化 + +```c++ +bool PMM::init(void) { + // 获取物理内存信息 + resource_t mem_info = BOOT_INFO::get_memory(); + // 设置物理地址的起点与长度 + start = mem_info.mem.addr; + length = mem_info.mem.len; + // 计算页数 + total_pages = length / COMMON::PAGE_SIZE; + // 内核空间地址开始 + kernel_space_start = COMMON::KERNEL_START_ADDR; + // 长度手动指定 + kernel_space_length = COMMON::KERNEL_SPACE_SIZE; + // 非内核空间在内核空间结束后 + non_kernel_space_start = + COMMON::KERNEL_START_ADDR + COMMON::KERNEL_SPACE_SIZE; + // 长度为总长度减去内核长度 + non_kernel_space_length = length - kernel_space_length; + + // 创建分配器 + // 内核空间 + static FIRSTFIT first_fit_allocator_kernel( + "First Fit Allocator(kernel space)", kernel_space_start, + kernel_space_length / COMMON::PAGE_SIZE); + kernel_space_allocator = (ALLOCATOR *)&first_fit_allocator_kernel; + // 非内核空间 + static FIRSTFIT first_fit_allocator( + "First Fit Allocator", non_kernel_space_start, + non_kernel_space_length / COMMON::PAGE_SIZE); + allocator = (ALLOCATOR *)&first_fit_allocator; + + // 内核实际占用页数 这里也算了 0~1M 的 reserved 内存 + size_t kernel_pages = + (COMMON::ALIGN(COMMON::KERNEL_END_ADDR, COMMON::PAGE_SIZE) - + COMMON::ALIGN(COMMON::KERNEL_START_ADDR, COMMON::PAGE_SIZE)) / + COMMON::PAGE_SIZE; + // 将内核已使用部分划分出来 + if (alloc_pages_kernel(COMMON::KERNEL_START_ADDR, kernel_pages) == true) { + // 将 multiboot2/dtb 信息移动到内核空间 + move_boot_info(); + info("pmm init.\n"); + return true; + } + else { + assert(0); + return false; + } +} +``` + +- 相关代码 + + ./src/include/mem/allocator.h + + ./src/include/mem/firstfit.h + + ./src/include/mem/pmm.h + + ./src/kernel/allocator.cpp + + ./src/kernel/firstfit.cpp + + ./src/kernel/pmm.cpp + + +更多细节请查看注释。 diff --git "a/docs/5_\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" "b/docs/5_\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" new file mode 100644 index 000000000..d175c8feb --- /dev/null +++ "b/docs/5_\350\231\232\346\213\237\345\206\205\345\255\230\347\256\241\347\220\206.md" @@ -0,0 +1,170 @@ +# SimpleKernel 虚拟内存管理 + +虚拟内存与架构密切相关,但仍然能够找到它们的共同之处。 + +在 `cpu.hpp` 中封装了它们的差异,使得可以获得一个近似一致的虚拟内存管理逻辑。 + + +## IA32 + +TODO + +## RISCV + +页表结构可以抽象为以下数据 + +```c++ +namespace CPU { +/** + * @brief pte 结构 + * @todo 使用 pte 结构重写 vmm + */ +struct pte_t { + enum { + VALID_OFFSET = 0, + READ_OFFSET = 1, + WRITE_OFFSET = 2, + EXEC_OFFSET = 3, + USER_OFFSET = 4, + GLOBAL_OFFSET = 5, + ACCESSED_OFFSET = 6, + DIRTY_OFFSET = 7, + VALID = 1 << VALID_OFFSET, + READ = 1 << READ_OFFSET, + WRITE = 1 << WRITE_OFFSET, + EXEC = 1 << EXEC_OFFSET, + USER = 1 << USER_OFFSET, + GLOBAL = 1 << GLOBAL_OFFSET, + ACCESSED = 1 << ACCESSED_OFFSET, + DIRTY = 1 << DIRTY_OFFSET, + }; + union { + struct { + uint64_t flags : 8; + uint64_t rsw : 2; + uint64_t ppn : 44; + uint64_t reserved : 10; + }; + uint64_t val; + }; + + pte_t(void) { + val = 0; + return; + } + pte_t(uint64_t _val) : val(_val) { + return; + } + friend std::ostream &operator<<(std::ostream &_os, const pte_t &_pte) { + printf("val: 0x%p, valid: %s, read: %s, write: %s, exec: %s, user: %s, " + "global: %s, accessed: %s, dirty: %s, rsw: 0x%p, ppn: 0x%p", + _pte.val, (_pte.flags & VALID) == VALID ? "true" : "false", + (_pte.flags & READ) == READ ? "true" : "false", + (_pte.flags & WRITE) == WRITE ? "true" : "false", + (_pte.flags & EXEC) == EXEC ? "true" : "false", + (_pte.flags & USER) == USER ? "true" : "false", + (_pte.flags & GLOBAL) == GLOBAL ? "true" : "false", + (_pte.flags & ACCESSED) == ACCESSED ? "true" : "false", + (_pte.flags & DIRTY) == DIRTY ? "true" : "false", _pte.rsw, + _pte.ppn); + return _os; + } +}; + +/** + * @brief satp 结构 + */ +struct satp_t { + enum { + NONE = 0, + SV39 = 8, + SV48 = 9, + SV57 = 10, + SV64 = 11, + }; + static constexpr const char *MODE_NAME[] = { + [NONE] = "NONE", "UNKNOWN", "UNKNOWN", "UNKNOWN", + "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", + [SV39] = "SV39", [SV48] = "SV48", [SV57] = "SV57", [SV64] = "SV64", + }; + + union { + struct { + uint64_t ppn : 44; + uint64_t asid : 16; + uint64_t mode : 4; + }; + uint64_t val; + }; + + static constexpr const uint64_t PPN_OFFSET = 12; + + satp_t(void) { + val = 0; + return; + } + satp_t(uint64_t _val) : val(_val) { + return; + } + friend std::ostream &operator<<(std::ostream &_os, const satp_t &_satp) { + printf("val: 0x%p, ppn: 0x%p, asid: 0x%p, mode: %s", _satp.val, + _satp.ppn, _satp.asid, MODE_NAME[_satp.mode]); + return _os; + } +}; +}; // namespace CPU +``` + +以下是在执行 mmap 映射内存时的逻辑。 +```c++ +// 在 _pgd 中查找 _va 对应的页表项 +// 如果未找到,_alloc 为真时会进行分配 +pte_t *VMM::find(const pt_t _pgd, uintptr_t _va, bool _alloc) { + pt_t pgd = _pgd; + // sv39 共有三级页表,一级一级查找 + // -1 是因为最后一级是具体的某一页,在函数最后直接返回 + for (size_t level = VMM_PT_LEVEL - 1; level > 0; level--) { + // 每次循环会找到 _va 的第 level 级页表 pgd + // 相当于 pgd_level[VPN_level],这样相当于得到了第 level 级页表的地址 + pte_t *pte = (pte_t *)&pgd[PX(level, _va)]; + // 解引用 pte,如果有效,获取 level+1 级页表, + if ((*pte & VMM_PAGE_VALID) == 1) { + // pgd 指向下一级页表 + // *pte 保存的是页表项,需要转换为对应的物理地址 + pgd = (pt_t)PTE2PA(*pte); + } + // 如果无效 + else { + // 判断是否需要分配 + // 如果需要 + if (_alloc == true) { + // 申请新的物理页 + pgd = (pt_t)PMM::get_instance().alloc_page_kernel(); + bzero(pgd, COMMON::PAGE_SIZE); + // 申请失败则返回 + if (pgd == nullptr) { + // 如果出现这种情况,说明物理内存不够,一般不会出现 + assert(0); + return nullptr; + } + // 清零 + bzero(pgd, COMMON::PAGE_SIZE); + // 填充页表项 + *pte = PA2PTE((uintptr_t)pgd) | VMM_PAGE_VALID; + } + // 不分配的话直接返回 + else { + return nullptr; + } + } + } + // 0 最低级 pt + return &pgd[PX(0, _va)]; +} +``` + +更多细节请查看注释。 + +## 相关文档 + +TODO \ No newline at end of file diff --git "a/docs/6_\345\240\206\347\256\241\347\220\206.md" "b/docs/6_\345\240\206\347\256\241\347\220\206.md" new file mode 100644 index 000000000..cf8777280 --- /dev/null +++ "b/docs/6_\345\240\206\347\256\241\347\220\206.md" @@ -0,0 +1,59 @@ +# SimpleKernel 堆管理 + +堆(heap)是内核使用动态内存的主要方式,`HEAP` 同样继承了 `ALLOCATOR`,这里使用了 slab 分配算法。 + + +堆的初始化,将内存分为内核/用户两部分 +```c++ +bool HEAP::init(void) { + // 内核空间 + static SLAB slab_allocator_kernel( + "SLAB Allocator Kernel", PMM::get_instance().get_kernel_space_start(), + PMM::get_instance().get_kernel_space_length() * COMMON::PAGE_SIZE, + true); + allocator_kernel = (ALLOCATOR *)&slab_allocator_kernel; + // 非内核空间 + static SLAB slab_allocator_non_kernel( + "SLAB Allocator", PMM::get_instance().get_non_kernel_space_start(), + PMM::get_instance().get_non_kernel_space_length() * COMMON::PAGE_SIZE, + false); + allocator_non_kernel = (ALLOCATOR *)&slab_allocator_non_kernel; + info("heap init.\n"); + return 0; +} +``` + +在堆管理实现后,动态内存就可以使用了,这允许我们用更多的语言特性。 + +`malloc` 与 `free` 的实现 +```c++ +/** + * @brief malloc 定义 + * @param _size 要申请的 bytes + * @return void* 申请到的地址 + */ +extern "C" void *malloc(size_t _size) { + return (void *)HEAP::get_instance().malloc(_size); +} + +/** + * @brief free 定义 + * @param _p 要释放的内存地址 + */ +extern "C" void free(void *_p) { + HEAP::get_instance().free(_p); + return; +} +``` + +slab 部分较复杂,可以直接参考代码。 + +- 相关代码 + + ./src/include/mem/heap.h + + ./src/kernel/heap.cpp + + ./src/include/mem/slab.h + + ./src/kernel/slab.cpp diff --git "a/docs/7_c++stl\347\232\204\346\224\257\346\214\201.md" "b/docs/7_c++stl\347\232\204\346\224\257\346\214\201.md" new file mode 100644 index 000000000..2ba67e27f --- /dev/null +++ "b/docs/7_c++stl\347\232\204\346\224\257\346\214\201.md" @@ -0,0 +1,7 @@ +# SimpleKernel c++ stl 的支持 + +C++ 的标准模版库(STL) 非常强大,这里我们只使用了部分,使用了 [Alinshans/MyTinySTL](https://github.com/Alinshans/MyTinySTL) 的实现。 + +- 相关代码 + + ./src/libcxx/include/* diff --git "a/docs/8_\344\270\255\346\226\255.md" "b/docs/8_\344\270\255\346\226\255.md" new file mode 100644 index 000000000..737054e09 --- /dev/null +++ "b/docs/8_\344\270\255\346\226\255.md" @@ -0,0 +1,595 @@ +# SimpleKernel 中断 + +## IA32 + +TODO + +## RISCV + +寄存结构及中断上下文 +```c++ +namespace CPU { +/// 机器模式定义 +enum { + U_MODE = 0, + S_MODE = 1, + M_MODE = 3, +}; + +enum { + INTR_SOFT = 0, + /// U 态软中断 + INTR_SOFT_U = INTR_SOFT + U_MODE, + /// S 态软中断 + INTR_SOFT_S = INTR_SOFT + S_MODE, + /// M 态软中断 + INTR_SOFT_M = INTR_SOFT + M_MODE, + INTR_TIMER = 4, + /// U 态时钟中断 + INTR_TIMER_U = INTR_TIMER + U_MODE, + /// S 态时钟中断 + INTR_TIMER_S = INTR_TIMER + S_MODE, + /// M 态时钟中断 + INTR_TIMER_M = INTR_TIMER + M_MODE, + INTR_EXTERN = 8, + /// U 态外部中断 + INTR_EXTERN_U = INTR_EXTERN + U_MODE, + /// S 态外部中断 + INTR_EXTERN_S = INTR_EXTERN + S_MODE, + /// M 态外部中断 + INTR_EXTERN_M = INTR_EXTERN + M_MODE, +}; + +enum { + EXCP_INSTRUCTION_ADDRESS_MISALIGNED = 0, + EXCP_INSTRUCTION_ACCESS_FAULT = 1, + EXCP_ILLEGAL_INSTRUCTION = 2, + EXCP_BREAKPOINT = 3, + EXCP_LOAD_ADDRESS_MISALIGNED = 4, + EXCP_LOAD_ACCESS_FAULT = 5, + EXCP_STORE_AMO_ADDRESS_MISALIGNED = 6, + EXCP_STORE_AMO_ACCESS_FAULT = 7, + EXCP_ECALL = 8, + EXCP_ECALL_U = EXCP_ECALL + U_MODE, + EXCP_ECALL_S = EXCP_ECALL + S_MODE, + EXCP_ECALL_M = EXCP_ECALL + M_MODE, + EXCP_INSTRUCTION_PAGE_FAULT = 12, + EXCP_LOAD_PAGE_FAULT = 13, + EXCP_STORE_AMO_PAGE_FAULT = 15, +}; + +// Supervisor Status Register, sstatus +// User Interrupt Enable +static constexpr const uint64_t SSTATUS_UIE = 1 << 0; +// Supervisor Interrupt Enable +static constexpr const uint64_t SSTATUS_SIE = 1 << 1; +// User Previous Interrupt Enable +static constexpr const uint64_t SSTATUS_UPIE = 1 << 4; +// Supervisor Previous Interrupt Enable +static constexpr const uint64_t SSTATUS_SPIE = 1 << 5; +// Previous mode, 1=Supervisor, 0=User +static constexpr const uint64_t SSTATUS_SPP = 1 << 8; + +/** + * @brief sstatus 寄存器定义 + */ +struct sstatus_t { + union { + struct { + // Reserved Writes Preserve Values, Reads Ignore Values (WPRI) + uint64_t wpri1 : 1; + // interrupt enable + uint64_t sie : 1; + uint64_t wpri12 : 3; + // previous interrupt enable + uint64_t spie : 1; + uint64_t ube : 1; + uint64_t wpri3 : 1; + // previous mode (supervisor) + uint64_t spp : 1; + uint64_t wpri4 : 4; + // FPU status + uint64_t fs : 2; + // extensions status + uint64_t xs : 2; + uint64_t wpri5 : 1; + // permit supervisor user memory access + uint64_t sum : 1; + // make executable readable + uint64_t mxr : 1; + uint64_t wpri6 : 12; + // U-mode XLEN + uint64_t uxl : 2; + uint64_t wpri7 : 29; + // status dirty + uint64_t sd : 1; + }; + uint64_t val; + }; + + sstatus_t(void) { + val = 0; + return; + } + sstatus_t(uint64_t _val) : val(_val) { + return; + } + friend std::ostream &operator<<(std::ostream &_os, + const sstatus_t &_sstatus) { + printf("val: 0x%p, sie: %s, spie: %s, spp: %s", _sstatus.val, + (_sstatus.sie == true ? "enable" : "disable"), + (_sstatus.spie == true ? "enable" : "disable"), + (_sstatus.spp == true ? "S mode" : "U mode")); + return _os; + } +}; + +// Supervisor Interrupt Enable +// software +static constexpr const uint64_t SIE_SSIE = 1 << 1; +// timer +static constexpr const uint64_t SIE_STIE = 1 << 5; +// external +static constexpr const uint64_t SIE_SEIE = 1 << 9; + +/// 中断模式 直接 +static constexpr const uint64_t TVEC_DIRECT = 0xFFFFFFFFFFFFFFFC; +/// 中断模式 向量 +static constexpr const uint64_t TVEC_VECTORED = 0xFFFFFFFFFFFFFFFD; + +/** + * @brief 允许中断 + */ +static inline void ENABLE_INTR(void) { + WRITE_SSTATUS(READ_SSTATUS().val | SSTATUS_SIE); + return; +} + +/** + * @brief 允许中断 + * @param _sstatus 要设置的 sstatus + */ +static inline void ENABLE_INTR(sstatus_t &_sstatus) { + _sstatus.sie = true; + return; +} + +/** + * @brief 禁止中断 + */ +static inline void DISABLE_INTR(void) { + WRITE_SSTATUS(READ_SSTATUS().val & ~SSTATUS_SIE); + return; +} + +/** + * @brief 禁止中断 + * @param _sstatus 要设置的原 sstatus 值 + */ +static inline void DISABLE_INTR(sstatus_t &_sstatus) { + _sstatus.sie = false; + return; +} + +/** + * @brief 读取中断状态 + * @return true 允许 + * @return false 禁止 + */ +static inline bool STATUS_INTR(void) { + sstatus_t x = READ_SSTATUS(); + return x.sie; +} + +/** + * @brief 通用寄存器 + */ +struct xregs_t { + uintptr_t zero; + uintptr_t ra; + uintptr_t sp; + uintptr_t gp; + uintptr_t tp; + uintptr_t t0; + uintptr_t t1; + uintptr_t t2; + uintptr_t s0; + uintptr_t s1; + uintptr_t a0; + uintptr_t a1; + uintptr_t a2; + uintptr_t a3; + uintptr_t a4; + uintptr_t a5; + uintptr_t a6; + uintptr_t a7; + uintptr_t s2; + uintptr_t s3; + uintptr_t s4; + uintptr_t s5; + uintptr_t s6; + uintptr_t s7; + uintptr_t s8; + uintptr_t s9; + uintptr_t s10; + uintptr_t s11; + uintptr_t t3; + uintptr_t t4; + uintptr_t t5; + uintptr_t t6; +}; + +/** + * @brief 浮点寄存器 + */ +struct fregs_t { + uintptr_t ft0; + uintptr_t ft1; + uintptr_t ft2; + uintptr_t ft3; + uintptr_t ft4; + uintptr_t ft5; + uintptr_t ft6; + uintptr_t ft7; + uintptr_t fs0; + uintptr_t fs1; + uintptr_t fa0; + uintptr_t fa1; + uintptr_t fa2; + uintptr_t fa3; + uintptr_t fa4; + uintptr_t fa5; + uintptr_t fa6; + uintptr_t fa7; + uintptr_t fs2; + uintptr_t fs3; + uintptr_t fs4; + uintptr_t fs5; + uintptr_t fs6; + uintptr_t fs7; + uintptr_t fs8; + uintptr_t fs9; + uintptr_t fs10; + uintptr_t fs11; + uintptr_t ft8; + uintptr_t ft9; + uintptr_t ft10; + uintptr_t ft11; +}; + +/** + * @brief 所有寄存器,在中断时使用,共 32+32+7=71 个 + */ +struct all_regs_t { + xregs_t xregs; + fregs_t fregs; + uintptr_t sepc; + uintptr_t stval; + uintptr_t scause; + uintptr_t sie; + sstatus_t sstatus; + satp_t satp; + uintptr_t sscratch; +}; + +}; // namespace CPU +``` + +现场保存与恢复 + +```assembly + +// 寄存器长度,8 字节 +.equ REG_BYTES, 8 +// 所有寄存器数量 +.equ ALL_REGS, 71 +// 保存所有寄存器需要的大小 +.equ ALL_SIZE, (ALL_REGS * REG_BYTES) + +// 将寄存器 a 保存在 c 偏移 b 的位置 +.macro sd_base a, b, c +sd \a, ((\b) * REG_BYTES)(\c) +.endm + +// 从 c 的偏移 b 处获取数据并赋值给寄存器 a +.macro ld_base a, b, c +ld \a, ((\b) * REG_BYTES)(\c) +.endm + +// 将 float 寄存器 a 保存在 c 偏移 b 的位置 +.macro fsd_base a, b, c +fsd \a, ((\b) * REG_BYTES)(\c) +.endm + +// 从 c 的偏移 b 处获取数据并赋值给 float 寄存器 a +.macro fld_base a, b, c +fld \a, ((\b) * REG_BYTES)(\c) +.endm + +/** + * @brief 保存所有寄存器 + * @param _base 要保存到的基地址 + */ +.macro all_regs_save _base + sd_base zero, 0, \_base + sd_base ra, 1, \_base + sd_base sp, 2, \_base + sd_base gp, 3, \_base + sd_base tp, 4, \_base + sd_base t0, 5, \_base + sd_base t1, 6, \_base + sd_base t2, 7, \_base + sd_base s0, 8, \_base + sd_base s1, 9, \_base + sd_base a0, 10, \_base + sd_base a1, 11, \_base + sd_base a2, 12, \_base + sd_base a3, 13, \_base + sd_base a4, 14, \_base + sd_base a5, 15, \_base + sd_base a6, 16, \_base + sd_base a7, 17, \_base + sd_base s2, 18, \_base + sd_base s3, 19, \_base + sd_base s4, 20, \_base + sd_base s5, 21, \_base + sd_base s6, 22, \_base + sd_base s7, 23, \_base + sd_base s8, 24, \_base + sd_base s9, 25, \_base + sd_base s10, 26, \_base + sd_base s11, 27, \_base + sd_base t3, 28, \_base + sd_base t4, 29, \_base + sd_base t5, 30, \_base + sd_base t6, 31, \_base + + fsd_base ft0, 32, \_base + fsd_base ft1, 33, \_base + fsd_base ft2, 34, \_base + fsd_base ft3, 35, \_base + fsd_base ft4, 36, \_base + fsd_base ft5, 37, \_base + fsd_base ft6, 38, \_base + fsd_base ft7, 39, \_base + fsd_base fs0, 40, \_base + fsd_base fs1, 41, \_base + fsd_base fa0, 42, \_base + fsd_base fa1, 43, \_base + fsd_base fa2, 44, \_base + fsd_base fa3, 45, \_base + fsd_base fa4, 46, \_base + fsd_base fa5, 47, \_base + fsd_base fa6, 48, \_base + fsd_base fa7, 49, \_base + fsd_base fs2, 50, \_base + fsd_base fs3, 51, \_base + fsd_base fs4, 52, \_base + fsd_base fs5, 53, \_base + fsd_base fs6, 54, \_base + fsd_base fs7, 55, \_base + fsd_base fs8, 56, \_base + fsd_base fs9, 57, \_base + fsd_base fs10, 58, \_base + fsd_base fs11, 59, \_base + fsd_base ft8, 60, \_base + fsd_base ft9, 61, \_base + fsd_base ft10, 62, \_base + fsd_base ft11, 63, \_base + + csrr t0, sepc + sd_base t0, 64, \_base + csrr t0, stval + sd_base t0, 65, \_base + csrr t0, scause + sd_base t0, 66, \_base + csrr t0, sie + sd_base t0, 67, \_base + csrr t0, sstatus + sd_base t0, 68, \_base + csrr t0, satp + sd_base t0, 69, \_base + csrr t0, sscratch + sd_base t0, 70, \_base +.endm + +/** + * @brief 恢复所有寄存器 + * @param _base 要恢复数据的基地址 + */ +.macro all_regs_load _base + ld_base t0, 64, \_base + csrw sepc, t0 + ld_base t0, 65, \_base + csrw stval, t0 + ld_base t0, 66, \_base + csrw scause, t0 + ld_base t0, 67, \_base + csrw sie, t0 + ld_base t0, 68, \_base + csrw sstatus, t0 + ld_base t0, 69, \_base + csrw satp, t0 + ld_base t0, 70, \_base + csrw sscratch, t0 + + ld_base zero, 0, \_base + ld_base ra, 1, \_base + ld_base sp, 2, \_base + ld_base gp, 3, \_base + ld_base tp, 4, \_base + ld_base t0, 5, \_base + ld_base t1, 6, \_base + ld_base t2, 7, \_base + ld_base s0, 8, \_base + ld_base s1, 9, \_base + ld_base a0, 10, \_base + ld_base a1, 11, \_base + ld_base a2, 12, \_base + ld_base a3, 13, \_base + ld_base a4, 14, \_base + ld_base a5, 15, \_base + ld_base a6, 16, \_base + ld_base a7, 17, \_base + ld_base s2, 18, \_base + ld_base s3, 19, \_base + ld_base s4, 20, \_base + ld_base s5, 21, \_base + ld_base s6, 22, \_base + ld_base s7, 23, \_base + ld_base s8, 24, \_base + ld_base s9, 25, \_base + ld_base s10, 26, \_base + ld_base s11, 27, \_base + ld_base t3, 28, \_base + ld_base t4, 29, \_base + ld_base t5, 30, \_base + ld_base t6, 31, \_base + + fld_base ft0, 32, \_base + fld_base ft1, 33, \_base + fld_base ft2, 34, \_base + fld_base ft3, 35, \_base + fld_base ft4, 36, \_base + fld_base ft5, 37, \_base + fld_base ft6, 38, \_base + fld_base ft7, 39, \_base + fld_base fs0, 40, \_base + fld_base fs1, 41, \_base + fld_base fa0, 42, \_base + fld_base fa1, 43, \_base + fld_base fa2, 44, \_base + fld_base fa3, 45, \_base + fld_base fa4, 46, \_base + fld_base fa5, 47, \_base + fld_base fa6, 48, \_base + fld_base fa7, 49, \_base + fld_base fs2, 50, \_base + fld_base fs3, 51, \_base + fld_base fs4, 52, \_base + fld_base fs5, 53, \_base + fld_base fs6, 54, \_base + fld_base fs7, 55, \_base + fld_base fs8, 56, \_base + fld_base fs9, 57, \_base + fld_base fs10, 58, \_base + fld_base fs11, 59, \_base + fld_base ft8, 60, \_base + fld_base ft9, 61, \_base + fld_base ft10, 62, \_base + fld_base ft11, 63, \_base +.endm + +.section .text +// 保存所有寄存器 +.globl trap_entry +.extern trap_handler +.align 4 +trap_entry: + // 将所有寄存器保存到栈上 + // 在栈上留出保存寄存器的空间 + addi sp, sp, -ALL_SIZE + all_regs_save sp + + // 调用 intr.cpp: trap_handler + // 传递参数 + csrr a0, sepc + csrr a1, stval + csrr a2, scause + mv a3, sp + csrr a4, sie + csrr a5, sstatus + csrr a6, satp + csrr a7, sscratch + jal trap_handler + + // 从栈上恢复所有寄存器 + all_regs_load sp + // 释放栈上用于保存寄存器的空间 + addi sp, sp, ALL_SIZE + + // 跳转到 sepc 处执行 + sret +``` + +中断初始化 +```c++ +int32_t INTR::init(void) { + // 设置 trap vector + CPU::WRITE_STVEC((uintptr_t)trap_entry); + // 直接跳转到处理函数 + CPU::STVEC_DIRECT(); + // 设置处理函数 + for (auto &i : interrupt_handlers) { + i = handler_default; + } + for (auto &i : excp_handlers) { + i = handler_default; + } + // 内部中断初始化 + CLINT::get_instance().init(); + // 外部中断初始化 + PLIC::get_instance().init(); + // 注册缺页中断 + register_excp_handler(CPU::EXCP_LOAD_PAGE_FAULT, pg_load_excp); + // 注册缺页中断 + register_excp_handler(CPU::EXCP_STORE_AMO_PAGE_FAULT, pg_store_excp); + info("intr init.\n"); + return 0; +} +``` + +中断处理 +```c++ +/** + * @brief 中断处理函数 + * @param _scause 原因 + * @param _sepc 值 + * @param _stval 值 + * @param _scause 值 + * @param _all_regs 保存在栈上的所有寄存器,实际上是 sp + * @param _sie 值 + * @param _sstatus 值 + * @param _sscratch 值 + */ +extern "C" void trap_handler(uintptr_t _sepc, uintptr_t _stval, + uintptr_t _scause, CPU::all_regs_t *_all_regs, + uintptr_t _sie, CPU::sstatus_t _sstatus, + CPU::satp_t _satp, uintptr_t _sscratch) { + if (_scause & CPU::CAUSE_INTR_MASK) { +// 中断 + // 跳转到对应的处理函数 + INTR::get_instance().do_interrupt(_scause & CPU::CAUSE_CODE_MASK, 0, + nullptr); + } + else { +// 异常 +// 跳转到对应的处理函数 + INTR::get_instance().do_excp(_scause & CPU::CAUSE_CODE_MASK, 0, + nullptr); + } + return; +} +``` + +更多细节请查看注释。 + +- 相关代码 + + ./src/arch/riscv64/context.S + + ./src/arch/riscv64/intr/intr_s.S + + ./src/arch/riscv64/intr/include/intr.h + + ./src/arch/riscv64/intr/intr.cpp + + ./src/arch/riscv64/intr/clint.cpp + + ./src/arch/riscv64/intr/plic.cpp + + ./src/arch/riscv64/intr/timer.cpp + +## 相关文档 + +TODO diff --git a/docs/An Introduction to the RISC-V Architecture.pdf b/docs/An Introduction to the RISC-V Architecture.pdf new file mode 100644 index 000000000..5dd7ab869 Binary files /dev/null and b/docs/An Introduction to the RISC-V Architecture.pdf differ diff --git a/related_docs/Multiboot2 Specification version 2.0.pdf b/docs/Multiboot2 Specification version 2.0.pdf similarity index 100% rename from related_docs/Multiboot2 Specification version 2.0.pdf rename to docs/Multiboot2 Specification version 2.0.pdf diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 3e11b089e..000000000 --- a/docs/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# SimpleKerenl's Doc - -TODO - - - diff --git a/docs/RISC-V-Reader-Chinese-v2p1.pdf b/docs/RISC-V-Reader-Chinese-v2p1.pdf new file mode 100644 index 000000000..df681e6d3 Binary files /dev/null and b/docs/RISC-V-Reader-Chinese-v2p1.pdf differ diff --git a/docs/UEFI_Spec_2_10_Aug29.pdf b/docs/UEFI_Spec_2_10_Aug29.pdf new file mode 100644 index 000000000..b56b7b993 Binary files /dev/null and b/docs/UEFI_Spec_2_10_Aug29.pdf differ diff --git a/docs/devicetree-specification-v0.3.pdf b/docs/devicetree-specification-v0.3.pdf new file mode 100644 index 000000000..dd680479c Binary files /dev/null and b/docs/devicetree-specification-v0.3.pdf differ diff --git a/docs/riscv-mmu.pdf b/docs/riscv-mmu.pdf new file mode 100644 index 000000000..3c2b672f2 Binary files /dev/null and b/docs/riscv-mmu.pdf differ diff --git "a/docs/riscv-privileged-spec-v1.7\344\270\255\346\226\207\347\211\210.pdf" "b/docs/riscv-privileged-spec-v1.7\344\270\255\346\226\207\347\211\210.pdf" new file mode 100644 index 000000000..d5303edf6 Binary files /dev/null and "b/docs/riscv-privileged-spec-v1.7\344\270\255\346\226\207\347\211\210.pdf" differ diff --git a/docs/riscv-privileged.pdf b/docs/riscv-privileged.pdf new file mode 100644 index 000000000..60a7bb8db Binary files /dev/null and b/docs/riscv-privileged.pdf differ diff --git a/docs/riscv-spec-20191213.pdf b/docs/riscv-spec-20191213.pdf new file mode 100644 index 000000000..533c1cbf9 Binary files /dev/null and b/docs/riscv-spec-20191213.pdf differ diff --git a/docs/sifive-interrupt-cookbook.pdf b/docs/sifive-interrupt-cookbook.pdf new file mode 100644 index 000000000..8df7bb7e4 Binary files /dev/null and b/docs/sifive-interrupt-cookbook.pdf differ diff --git a/docs/virtio-v1.1.pdf b/docs/virtio-v1.1.pdf new file mode 100644 index 000000000..4326b631d Binary files /dev/null and b/docs/virtio-v1.1.pdf differ diff --git a/iso/boot/grub/grub.cfg b/iso/boot/grub/grub.cfg deleted file mode 100644 index 26a2b6565..000000000 --- a/iso/boot/grub/grub.cfg +++ /dev/null @@ -1,7 +0,0 @@ -set timeout=15 -set default=0 # Set the default menu entry - -menuentry "SimpleKernel" { - multiboot2 /boot/kernel.kernel - boot -} diff --git a/iso/boot/kernel.kernel b/iso/boot/kernel.kernel deleted file mode 100755 index ee3e501ac..000000000 Binary files a/iso/boot/kernel.kernel and /dev/null differ diff --git a/related_docs/EFLAGS.jpg b/related_docs/EFLAGS.jpg deleted file mode 100644 index 53bf5f0a8..000000000 Binary files a/related_docs/EFLAGS.jpg and /dev/null differ diff --git "a/related_docs/GDT\347\233\270\345\205\263.md" "b/related_docs/GDT\347\233\270\345\205\263.md" deleted file mode 100644 index 5098f7f76..000000000 --- "a/related_docs/GDT\347\233\270\345\205\263.md" +++ /dev/null @@ -1,122 +0,0 @@ -# GDT: Global Descriptor Table - -全局描述符表 - -本质:一个结构体,用来定义程序执行时的内存状态。 - -![屏幕快照 2018-06-04 11.35.32](http://p4uro3cva.bkt.clouddn.com/屏幕快照 2018-06-04 11.35.32.png) - -各个位的用途 - -![segment_descriptor](http://p4uro3cva.bkt.clouddn.com/segment_descriptor.png) - -具体请参阅 Intel 文档 - - - -- 8-11 - TYPE: 说明存储段描述符所描述的存储段的具体属性。 - -数据段类型 - -|类型值|说明| -|------|---| -|0|只读| -|1|只读、已访问 -|2|读/写 -|3|读/写、已访问 -|4|只读、向下扩展 -|5|只读、向下扩展、已访问 -|6|读/写、向下扩展 -|7|读/写、向下扩展、已访问 - - -代码段类型 - -|类型值|说明| -|-----|---| -|8|只执行 -|9|只执行、已访问 -|A|执行/读 -|B|执行/读、已访问 -|C|只执行、一致码段 -|D|只执行、一致码段、已访问 -|E|执行/读、一致码段 -|F|执行/读、一致码段、已访问 - - -系统段类型 - -|类型编码|说明| -|-------|---| -|0|<未定义> -|1|可用286TSS -|2|LDT -|3|忙的286TSS -|4|286调用门 -|5|任务门 -|6|286中断门 -|7|286陷阱门 -|8|未定义 -|9|可用386TSS -|A|<未定义> -|B|忙的386TSS -|C|386调用门 -|D|<未定义> -|E|386中断门 -|F|386陷阱门 - -- 12 - - S: 说明描述符的类型。 - 对于存储段描述符而言,S=1,以区别与系统段描述符和门描述符(S=0)。 - -- 13-14 - DPL: 表示描述符特权级(Descriptor Privilege level),共 2 位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。 - -- 15 - P: 存在(Present)位。 - P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中; - P=0 表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。 - - -- 20 - - AVL: 软件可利用位。80386对该位的使用未左规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定。 - -- 22 - D: D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄存器寻址的段(通常是堆栈段)的三种描述符中的意义各不相同。 - - 在描述可执行段的描述符中,D位决定了指令使用的地址及操作数所默认的大小。 - - D=1表示默认情况下指令使用32位地址及32位或8位操作数,这样的代码段也称为32位代码段; - - D=0 表示默认情况下,使用16位地址及16位或8位操作数,这样的代码段也称为16位代码段,它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。 - - 在向下扩展数据段的描述符中,D位决定段的上部边界。 - - D=1表示段的上部界限为4G; - - D=0表示段的上部界限为64K,这是为了与80286兼容。 - - 在描述由SS寄存器寻址的段描述符中,D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器。 - - D=1表示使用32位堆栈指针寄存器ESP; - - D=0表示使用16位堆栈指针寄存器SP,这与80286兼容。 - -- 23 - - G: 段界限粒度(Granularity)位。 - G=0 表示界限粒度为字节; - G=1 表示界限粒度为4K 字节。 - 注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。 - - - - - -## 参考资料 - -[【构建操作系统】全局描述符表GDT](https://zhuanlan.zhihu.com/p/25867829) - -[Wiki pedia: Global Descriptor Table](https://en.wikipedia.org/wiki/Global_Descriptor_Table) - -[JamesM's kernel development tutorials: The GDT and IDT](http://www.jamesmolloy.co.uk/tutorial_html/4.-The%20GDT%20and%20IDT.html) - -[GDT(Global Descriptor Table)全局描述符表](http://www.cnblogs.com/starlitnext/archive/2013/03/07/2948929.html) - -[hurlex <六> 添加全局段描述符表](http://wiki.0xffffff.org/posts/hurlex-6.html) - - diff --git "a/related_docs/IA32 \350\260\203\347\224\250\346\203\257\344\276\213.md" "b/related_docs/IA32 \350\260\203\347\224\250\346\203\257\344\276\213.md" deleted file mode 100644 index 0226cd8e0..000000000 --- "a/related_docs/IA32 \350\260\203\347\224\250\346\203\257\344\276\213.md" +++ /dev/null @@ -1,8 +0,0 @@ -# IA32 指令集寄存器使用惯例 -这个惯例保证了函数调用时寄存器的值不会丢失或紊乱。 - -`%eax` `%edx` 和 `%ecx` 称为调用者保存寄存器,被调用者使用这三个寄存器时不必担心它们原来的值有没有保存下来,这是调用者自己应该负责的事情。 - -`%ebx` `%esi` 和 `%edi` 称为被调用者保存寄存器,被调用者如果想要使用它们,必须在开始时保存它们的值并在结束时恢复它们的值,一般通过压栈和出栈来实现。 - - diff --git "a/related_docs/IDT\343\200\201\344\270\255\346\226\255\343\200\201ISR\343\200\201IRQ\347\255\211.md" "b/related_docs/IDT\343\200\201\344\270\255\346\226\255\343\200\201ISR\343\200\201IRQ\347\255\211.md" deleted file mode 100644 index a6307ca83..000000000 --- "a/related_docs/IDT\343\200\201\344\270\255\346\226\255\343\200\201ISR\343\200\201IRQ\347\255\211.md" +++ /dev/null @@ -1,10 +0,0 @@ - - - - -# 层次关系 -硬件在特定 IRQ 中断线上发送信号给 PIC -PIC 将此信号与偏移量叠加获得中断号 -CPU 根据中断号查 IDT,获取对应中断处理程序的入口地址 -跳转到此程序开始执行中断 - diff --git "a/related_docs/Linux ELF\346\226\207\344\273\266\346\240\274\345\274\217\345\210\206\346\236\220 - \350\260\242\345\201\245\347\232\204\344\270\223\346\240\217 - CSDN\345\215\232\345\256\242.pdf" "b/related_docs/Linux ELF\346\226\207\344\273\266\346\240\274\345\274\217\345\210\206\346\236\220 - \350\260\242\345\201\245\347\232\204\344\270\223\346\240\217 - CSDN\345\215\232\345\256\242.pdf" deleted file mode 100644 index 1be17b269..000000000 Binary files "a/related_docs/Linux ELF\346\226\207\344\273\266\346\240\274\345\274\217\345\210\206\346\236\220 - \350\260\242\345\201\245\347\232\204\344\270\223\346\240\217 - CSDN\345\215\232\345\256\242.pdf" and /dev/null differ diff --git a/related_docs/Multiboot Specification version 0.6.96.pdf b/related_docs/Multiboot Specification version 0.6.96.pdf deleted file mode 100644 index 9228c64b0..000000000 Binary files a/related_docs/Multiboot Specification version 0.6.96.pdf and /dev/null differ diff --git a/related_docs/README.md b/related_docs/README.md deleted file mode 100644 index 76adc0f9f..000000000 --- a/related_docs/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# someknowledge/ -## 文件说明 - -这个目录下存放的是在写代码过程中遇到的一些问题,我把我不太理解的东西整理了一下放在这里。 - diff --git "a/related_docs/VGA\347\253\257\345\217\243\350\257\273\345\206\231.md" "b/related_docs/VGA\347\253\257\345\217\243\350\257\273\345\206\231.md" deleted file mode 100644 index 3c3791747..000000000 --- "a/related_docs/VGA\347\253\257\345\217\243\350\257\273\345\206\231.md" +++ /dev/null @@ -1,11 +0,0 @@ -# VGA 端口读写 - -![屏幕快照 2018-06-03 19.38.13](http://p4uro3cva.bkt.clouddn.com/屏幕快照 2018-06-03 19.38.13.png) - -![屏幕快照 2018-06-03 19.38.30](http://p4uro3cva.bkt.clouddn.com/屏幕快照 2018-06-03 19.38.30.png) - -VGA 只提供了一个端口,但有很多寄存器,如何访问指定的寄存器? - -首先向 address register(0x3D4) 写入要操作寄存器的索引值,然后再向 0x3D5 写数据就是操作对应的寄存器了。 - - diff --git "a/related_docs/\345\217\257\345\217\230\345\217\202\346\225\260\345\216\237\347\220\206.md" "b/related_docs/\345\217\257\345\217\230\345\217\202\346\225\260\345\216\237\347\220\206.md" deleted file mode 100644 index 3f06fffbc..000000000 --- "a/related_docs/\345\217\257\345\217\230\345\217\202\346\225\260\345\216\237\347\220\206.md" +++ /dev/null @@ -1,38 +0,0 @@ -# va_list可变参数原理 - - - -``` - -typedef char * va_list; - - -// 用来得到 TYPE 元素类型的字节大小,若不足4字节(short,char),那么认为这个元素的大小为4字节, -// 简单的说就是检测元素的大小,不足4字节的当作4字节看待. -#define __va_SIZE(TYPE) (((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int)) - -// AP 一般都是 va_list,LASTARG 则是指向参数变长函数的格式化字符串的指针, -// va_start 宏根据 (va_list)&LASTARG 得到第一个可变参数前的一个固定参数在堆栈中的内存地址, -// 加上 __va_SIZEOF(TYPE)即 TYPE 所占内存大小后,使ap指向固定参数后下个参数(第一个可变参数地址)。 -// va_start 的作用就很明显了。取得变长参数列表的第一个参数的地址。 -#define va_start(AP, LASTARG) (AP = ((va_list)&(LASTARG) + __va_SIZE (LASTARG))) - -// 取得 TYPE 类型的可变参数值。首先 AP+=__va_SIZE(TYPE),即 AP 跳过当前可变参数而指向下个变参的地址; -// 然后 AP-__va_SIZE(TYPE)得到当前变参的内存地址,类型转换后返回当前变参值。 -//#define va_arg(AP, TYPE) (*(TYPE *)((AP+=__va_SIZE(TYPE))-__va_SIZE(TYPE))) -#define va_arg(AP, TYPE) (AP+=__va_SIZE(TYPE), *((TYPE *)(AP-__va_SIZE (TYPE)))) - - - -// 把指针 va_list 置 0 -#define va_end(AP) (AP = (va_list) 0)ke - - -``` - - - - - - - diff --git "a/related_docs/\345\234\250mac\344\270\212\345\210\266\344\275\234grub2\345\274\225\345\257\274\351\225\234\345\203\217.md" "b/related_docs/\345\234\250mac\344\270\212\345\210\266\344\275\234grub2\345\274\225\345\257\274\351\225\234\345\203\217.md" deleted file mode 100644 index 4425fc00b..000000000 --- "a/related_docs/\345\234\250mac\344\270\212\345\210\266\344\275\234grub2\345\274\225\345\257\274\351\225\234\345\203\217.md" +++ /dev/null @@ -1,70 +0,0 @@ -# 在mac上制作grub2引导镜像 - -- 安装 grub2 在 mac 上 - 见 readme - -1. 首先用 `dd` 命令创建一个空的镜像文件,大小为 100MB - - dd if=/dev/zero of=disk.img count=204800 bs=512 - -2. 用 `fdisk` 分区 - -``` -fdisk -e disk.img - -fdisk: could not open MBR file /usr/standalone/i386/boot0: No such file or directory -The signature for this MBR is invalid. -Would you like to initialize the partition table? [y] -Enter 'help' for information -fdisk:*1> disk -Disk: disk.img geometry: 812/4/63 [204800 sectors] -Change disk geometry? [n] -fdisk:*1> edit 1 - Starting Ending - #: id cyl hd sec - cyl hd sec [ start - size] ------------------------------------------------------------------------- - 1: 00 0 0 0 - 0 0 0 [ 0 - 0] unused -Partition id ('0' to disable) [0 - FF]: [0] (? for help) 0B -Do you wish to edit in CHS mode? [n] -Partition offset [0 - 204800]: [63] 2047 -Partition size [1 - 202753]: [202753] -fdisk:*1> write -Writing MBR at offset 0. -fdisk: 1> quit -``` -![屏幕快照 2018-12-27 下午3.05.10](https://lh3.googleusercontent.com/-kasCl4Re1Sc/XCR5vPaGvaI/AAAAAAAAAHA/e7osRuERt6sdPjfV0O6zKQfXFDzvuQBVACHMYCw/I/%255BUNSET%255D) - - -3. 把引导文件和文件系统独立分出来 - - dd if=disk.img of=mbr.img bs=512 count=2047 - dd if=disk.img of=fs.img bs=512 skip=2047 -4. 挂载 - - hdiutil attach -nomount fs.img - -5. 安装文件系统 - - newfs_msdos -F 32 /dev/diskX - -6. 卸载掉 fs.img,将处理好的 两个 img 写入 - - hdiutil detach /dev/diskX - cat mbr.img fs.img > disk.img - -7. 挂载,并安装 grub 引导 - - hdiutil attach disk.img - - i386-elf-grub-install --modules="part_msdos biosdisk fat multiboot configfile" --root-directory="/Volumes/NO NAME" disk.img - -![屏幕快照 2018-12-27 下午3.17.23](https://lh3.googleusercontent.com/-9c9SvfMV468/XCR8l5ca-sI/AAAAAAAAAHY/Afu-Zc8IQLY5f9ouUELcqdp4I4TMkokwQCHMYCw/I/%255BUNSET%255D) - - - - - -# 参考资料 - -https://wiki.osdev.org/GRUB_2#Installing_GRUB_2_on_OS_X - diff --git "a/related_docs/\345\256\236\346\250\241\345\274\217\344\270\216\344\277\235\346\212\244\346\250\241\345\274\217.md" "b/related_docs/\345\256\236\346\250\241\345\274\217\344\270\216\344\277\235\346\212\244\346\250\241\345\274\217.md" deleted file mode 100644 index 3071380ed..000000000 --- "a/related_docs/\345\256\236\346\250\241\345\274\217\344\270\216\344\277\235\346\212\244\346\250\241\345\274\217.md" +++ /dev/null @@ -1,88 +0,0 @@ -# 实模式与保护模式 - -在 IA32 下,CPU 有两种工作方式:实模式和保护模式。当我们按下开机按钮以后,CPU 是工作在实模式下的,经过某种机制以后才进入保护模式。 - -  Intel 8086是 16 位的 CPU,有 16 位的寄存器、16 位的数据总线以及 20 位的地址总线,因此它有 1M 的寻址空间,一个地址是又段和偏移两部分组成的,物理地址计算方法是: - -``` -Physical Address = (Segment) * 16 + Offset (Statement: Segment 和 Offset 都是 16 位的) -``` - - - -从 80386 开始,Intel 进入了 32 位的时代。80386 有 32 位地址线,寻址空间达到 4G。这个时候保护模式出现了,保护模式并没有抛弃实模式下 `Seg: Offset` 这样的寻址方式,只是对 Seg 的解释发生了变化。实模式下段值可以看作是地址的一部分,而保护模式下,段寄存器还是原来的 16 位,但它仅仅只是一个索引,它指向一个数据结构的一个表项,这个数据结构就是大名鼎鼎的 GDT,GDT 定义了段的起始地址、界限和属性。 - -简而言之,GDT 的作用是用来提供段式存储机制,这种机制是通过寄存器和 GDT 中的描述符共同提供的。 - - -## 保护模式的起源 - -最开始的程序寻址是直接的 `Seg: Offset` 模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程序员是可见的。但是,由此也带来两个问题: - -- 无法支持多任务 -- 程序的安全性无法得到保证(用户程序可以改写系统空间或者其他用户的程序内容)。 - -实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向实际的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。 - -在保护模式下,全部 32 条地址线有效,可寻址高达 4G 字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换和保护任务环境; 4 个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离;支持虚拟 8086 方式,便于执行 8086 程序。 - -保护模式出现的原因是:保护进程地址空间。这样,就产生了一个结果:两种模式下程序的寻址方式发生了变化。 - -从 80386 开始,CPU 有三种工作方式:实模式,保护模式和虚拟 8086 模式。只有在刚刚启动的时候是实模式,等到操作系统运行起来以后就运行在保护模式。虚拟 8086 模式是运行在保护模式中的实模式,为了在 32 位保护模式下执行纯 16 位程序。它不是一个真正的 CPU 模式,还属于保护模式。CPU 启动环境为 16 位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式 - -## 2.保护模式与实模式的区别 - -### 寻址方式 - -#### 实模式的寻址方式与工作机理: - -8086 是 16 位的 CPU,只能访问地址在1M 以下的内存称为常规内存,我们把地址在 1M 以上的内存称为扩展内存。实模式下有着 16 位的寄存器/ 16 位数据总线/ 20 位地址总线。一个地址有段和偏移两部分组成,物理地址的计算公式为: - -``` -PhysicalAddress=Segment * 16 + Offset -``` - -其中,`Segment` 和 `Offset` 都是16位的。 -通过上述分段技术模式,能够表示的最大内存为: - -``` -FFFFh:FFFFh=FFFF0h+FFFFh=10FFEFh=1M+64K-16Bytes(1M多余出来的部分被称做高端内存区HMA) -``` - -但 8086/8088 只有 20 位地址线,只能够访问 1M 地址范围的数据,所以如果访问 `100000h~10FFEFh` 之间的内存(大于1M 空间),则必须有第 21 根地址线来参与寻址(8086/8088没有)。因此,当程序员给出超过 1M(100000H-10FFEFH)的地址时,因为逻辑上正常,系统并不认为其访问越界而产生异常,而是自动从0开始计算,也就是说系统计算实际地址的时候是按照对 1M 求模的方式进行的,这种技术被称为 `wrap-around`。 - 对于 80286 或以上的 CPU 通过 `A20GATE` 来控制 A20 地址线。 技术发展到了 80286,虽然系统的地址总线由原来的 20 根发展为 24 根,这样能够访问的内存可以达到 `2^24=16M` ,但是 Intel 在设计 80286 时提出的目标是向下兼容,所以在实模式下,系统所表现的行为应该和 8086/8088 所表现的完全一样,也就是说,在实模式下,80386 以及后续系列应该和 8086/8088 完全兼容仍然使用 A20 地址线。所以说 80286 芯片存在一个 BUG:它开设 A20 地址线。如果程序员访问 100000H-10FFEFH 之间的内存,系统将实际访问这块内存(没有 wrap-around 技术),而不是像 8086/8088 一样从0开始。 - -为了解决上述兼容性问题,IBM 使用键盘控制器上剩余的一些输出线来管理第 21 根地址线(从0开始数是第20根)的有效性,被称为 `A20Gate`: - -- 如果 `A20Gate` 被打开,则当程序员给出 100000H-10FFEFH 之间的地址的时候,系统将真正访问这块内存区域; - -- 如果 `A20Gate` 被禁止,则当程序员给出 100000H-10FFEFH 之间的地址的时候,系统仍然使用 8086/8088 的方式即取模方式(8086仿真)。绝大多数 IBMPC 兼容机默认的 A20Gate 是被禁止的。现在许多新型 PC 上存在直接通过 BIOS 功能调用来控制 A20Gate 的功能。 - -上面所述的内存访问模式都是实模式,在 80286 以及更高系列的 PC 中,即使 A20Gate 被打开,在实模式下所能够访问的内存最大也只能为 10FFEFH ,尽管它们的地址总线所能够访问的能力都大大超过这个限制。为了能够访问 10FFEFH 以上的内存,则必须进入保护模式。 - - -#### 保护模式寻址: - -从 80386 开始,进入 32 位 CPU 时代,有 32 位地址总线。但是,地址并没有用寄存器直接指定,仍然采用了“段+偏移”的模式。虽然段值仍然由原来的 16 位 cs/ds 等寄存器指定,但此时这些寄存器中存放的不再是段基址,而是一个索引:从这个索引,可以找到一个表项,里面存放了段基址等很多属性,这个表项称为段描述符,这个表就称为 GDT。 - -- 段大小 - - 实模式下面段的大小是固定的 64k,而保护模式则不是固定的。关于段基址,实模式下,第 16 位是 0; 保护模式下坚持 4K 对齐,就是说第 12b 是 0. - -- 段地址的存放地点 - - 实模式下在 cs/ds 等寄存器中,保护模式在段描述符中,而要取得段描述符号,又需要取得 CS 等中的段选择符。 - -- 对段的保护机制 - - 实模式下没有提供对段的保护,保护模式下面提供了对段的保护机制。 - -## 参考资料 - -[实模式与保护模式解惑之(一)——二者的起源与区别](https://blog.csdn.net/trochiluses/article/details/8954527) - -[CPU的实模式与保护模式(简介)](https://blog.csdn.net/yang_yulei/article/details/22613327) - - -[GDT(Global Descriptor Table)全局描述符表](http://www.cnblogs.com/starlitnext/archive/2013/03/07/2948929.html) - diff --git "a/related_docs/\346\216\247\345\210\266\345\257\204\345\255\230\345\231\250.pdf" "b/related_docs/\346\216\247\345\210\266\345\257\204\345\255\230\345\231\250.pdf" deleted file mode 100644 index 54aed2241..000000000 Binary files "a/related_docs/\346\216\247\345\210\266\345\257\204\345\255\230\345\231\250.pdf" and /dev/null differ diff --git "a/related_docs/\346\256\265\345\274\217\347\256\241\347\220\206.md" "b/related_docs/\346\256\265\345\274\217\347\256\241\347\220\206.md" deleted file mode 100644 index 8b3ec585d..000000000 --- "a/related_docs/\346\256\265\345\274\217\347\256\241\347\220\206.md" +++ /dev/null @@ -1,4 +0,0 @@ - -![屏幕快照 2018-06-22 12.40.54](http://p4uro3cva.bkt.clouddn.com/屏幕快照 2018-06-22 12.40.54.png) - - diff --git "a/related_docs/\351\242\234\350\211\262\350\256\276\347\275\256\344\270\216\344\275\215\350\277\220\347\256\227.md" "b/related_docs/\351\242\234\350\211\262\350\256\276\347\275\256\344\270\216\344\275\215\350\277\220\347\256\227.md" deleted file mode 100644 index d3c0f7c5f..000000000 --- "a/related_docs/\351\242\234\350\211\262\350\256\276\347\275\256\344\270\216\344\275\215\350\277\220\347\256\227.md" +++ /dev/null @@ -1,114 +0,0 @@ - -main.c - -``` -static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) -{ - return fg | (bg << 4); -} - -static inline uint16_t vga_entry(unsigned char uc, uint8_t color) -{ - return (uint16_t) uc | (uint16_t) color << 8; -} - -``` - -为什么设置个颜色,要用到位操作? - -## 背景知识 -### 颜色的表示 -首先,颜色各个分量一般是以每8位为一个单位。 - -8位,8bit,即一个字节,10进制数的取值范围是0~255,一般用16进制表示,0x开头,取值范围是0x00到0xFF(不区分大小写)。 - -颜色一般有24位和32位两种表示方法。 - -- 24位颜色 - - 每8位表示RGB中的一个分量。RGB颜色分量的值越大的时候最终颜色越偏向于这个颜色。 - -- 32位颜色 - -除了每8位表示RGB中的一个分量,还有一个8位用于表示透明度,表示为ARGB形式. - -A即alpha值,alpha值为0时颜色为透明,alpha值为最大值时颜色为完全不透明,即可完全覆盖处于它下面的其他颜色,无其他颜色可以透过它而显示出来。 - - -那么位移操作是怎么回事呢? -  如图: - -![屏幕快照 2018-05-18 19.34.59](http://p4uro3cva.bkt.clouddn.com/屏幕快照 2018-05-18 19.34.59.png) - - -  表示颜色分量的数要想转化成一个整个的颜色,就必须和其他的分量组合,每个分量放在自己应当处于的位置,就应该进行位移操作。 - - ![屏幕快照 2018-05-18 19.35.04](http://p4uro3cva.bkt.clouddn.com/屏幕快照 2018-05-18 19.35.04.png) - - -当然我开始的时候还小迷惑了一下这个资料中给出的例子:http://m.oschina.net/blog/104123, - -如果颜色值都是34,23,88等两位十进制数,而它所说的转换居然也就是把数字直接放过去了,那0到255的数字,255咋办?三位数呢? - -后来想了一下,作者的图是对的,但是文字配的有点问题。 - -图中的颜色值34,23和88都是十六进制表示的,所以移位操作的时候可以直接移动位置表示。 - -移位后就是整体移动相应的位数,一个字母代表四位。 - -R移动16位,G移动8位,B不需要移动。 - -如果有A值,则A需要向左移动24位。 - - - -需要注意的是,不管是用什么进制表示,十进制还是十六进制还是二进制,位移操作都是二进制范畴的。 - - -为什么说原作者有点小错误呢? - -十进制的34,用十六进制表示是0x22。 - -如果是十进制R34,G23,B88。移位操作后,得到的颜色数值应该是0x221758。 - - - -### 反向的转换-从颜色中提取分量 -反向的转换则是右移。 - -知道一个颜色整体值,想提取某一个颜色分量,方法就是向右移动相应的位数,然后做一个与运算,与0xFF做与运算可以提取最低的两位。 - -这一步参考资料说得很明白: - -直接把例子搬过来: - - - -现在我们知道了rgb的16进制值,那反过来呢?如果我们知道了一个颜色值,如何反向求解rgb值呢? - - - var color:uint = 0x342388; - - var r:uint = color >> 16;//右移16位,把2388移出,取0x34 - - var g:uint = color >> 8 & 0xff;//右移8位,把88移出,得0x3423,与0xff按位与操作,得0x23 - - var b:uint = color & 0xff;//得到0x88 - - - -我们再来看看32位的: - - - var color:uint = 0xff342388; - - var a:uint = color >>> 24 //注意这里是>>>,无符号右移位操作,右移24位,把342388移出,得到0xff - - var r:uint = color >> 16 & 0xff;//右移16位,把2388移出,取0x34 - - var g:uint = color >> 8 & 0xff;//右移8位,把88移出,得0x3423,与0xff按位与操作,得0x23 - - var b:uint = color & 0xff;//得到0x88 - - - diff --git a/run.sh b/run.sh new file mode 100644 index 000000000..504cc75ec --- /dev/null +++ b/run.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# run.sh for Simple-XX/SimpleKernel. +# 在虚拟机中运行内核 + +# shell 执行出错时终止运行 +set -e +# 输出实际执行内容 +#set -x + +source ./tools/env.sh +export PATH="${GRUB_PATH}:$PATH" + +# 重新编译 +mkdir -p ./build_${ARCH}/ +rm -rf ./build_${ARCH}/* +cd ./build_${ARCH} +cmake -DCMAKE_TOOLCHAIN_FILE=./cmake/${TOOLS} -DARCH=${ARCH} -DCMAKE_BUILD_TYPE=DEBUG .. +make +cd ../ + +# 如果是 i386/x86_64,需要判断是否符合 multiboot2 标准 +if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then + if ${GRUB_PATH}/grub-file --is-x86-multiboot2 ${kernel}; then + echo Multiboot2 Confirmed! + else + echo NOT Multiboot2! + exit + fi +fi + +# 如果是 riscv 64,需要使用 opensbi +if [ ${ARCH} == "riscv64" ]; then + # OPENSBI 不存在则编译 + if [ ! -f ${OPENSBI} ]; then + echo build opensbi. + cd ./tools/opensbi + mkdir -p build + export CROSS_COMPILE=${TOOLCHAIN_PREFIX} + export FW_JUMP=y + export FW_JUMP_ADDR=0x80200000 + export PLATFORM_RISCV_XLEN=64 + export PLATFORM=generic + make + cd ../.. + echo build opensbi done. + fi +fi + +# 检测路径是否合法,发生过 rm -rf -f /* 的惨剧 +if [ "${iso_boot}" == "" ]; then + echo iso_boot path error. +else + mkdir -p ${iso_boot} + rm -rf -f ${iso_boot}/* +fi + +# 制作 fatfs 镜像 +if [ ! -f ./fatfs.img ]; then + # osx 下需要手动制作 + echo NO fatfs.img! + bash ./tools/mkfatfs.sh +fi + +# 初始化 gdb +if [ ${DEBUG} == 1 ]; then + cp ./tools/gdbinit ./.gdbinit + echo "" >> ./.gdbinit + echo "file "${kernel} >> ./.gdbinit + if [ ${ARCH} == "riscv64" ]; then + echo "add-symbol-file "${OPENSBI} >> ./.gdbinit + fi + echo "target remote localhost:1234" >> ./.gdbinit + GDB_OPT='-S -gdb tcp::1234' + echo "Run gdb-multiarch in another shell" +fi + +# 设置 grub 相关数据 +if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then + mkdir -p ${iso_boot_grub} + cp ${kernel} ${iso_boot} + cp ./tools/grub.cfg ${iso_boot_grub}/ +fi + +# 运行虚拟机 +if [ ${ARCH} == "i386" ] || [ ${ARCH} == "x86_64" ]; then + qemu-system-x86_64 -cdrom ${iso} -m 128M \ + -monitor telnet::2333,server,nowait -serial stdio \ + ${GDB_OPT} +elif [ ${ARCH} == "aarch64" ]; then + qemu-system-aarch64 -machine virt -cpu cortex-a72 -kernel ${kernel} \ + -monitor telnet::2333,server,nowait -serial stdio -nographic \ + ${GDB_OPT} +elif [ ${ARCH} == "riscv64" ]; then + qemu-system-riscv64 -machine virt -bios ${OPENSBI} -kernel ${kernel} \ + -global virtio-mmio.force-legacy=false \ + -device virtio-blk-device,bus=virtio-mmio-bus.0,drive=fatfs \ + -drive file=fatfs.img,format=raw,id=fatfs \ + -device virtio-scsi-device,bus=virtio-mmio-bus.1,id=scsi \ + -drive file=fatfs.img,format=raw,id=scsi \ + -monitor telnet::2333,server,nowait -serial stdio -nographic \ + ${GDB_OPT} +fi + +# qemu-system-riscv64 -machine virt -bios ${OPENSBI} -kernel ${kernel} \ +# -global virtio-mmio.force-legacy=false \ +# -drive file=mydisk,if=none,format=raw,id=hd \ +# -device virtio-blk-device,drive=hd \ +# -monitor telnet::2333,server,nowait -serial stdio -nographic diff --git a/setup.sh b/setup.sh deleted file mode 100644 index 7cc9e9a6a..000000000 --- a/setup.sh +++ /dev/null @@ -1,100 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# setup.sh for MRNIU/SimpleKernel. - -#!/usr/bin/env bash -# shell 执行出错时终止运行 -set -e -# 输出实际执行内容 -# set -x - -# bochs 配置文件 -bochsrc="bochsrc.txt" -# 内核映像 -img='./src/kernel.kernel' -# 软盘 -disk='simplekernel.img' -# 安装目录 -boot_folder='./boot_folder/boot/' -# 挂载目录 -folder='./boot_folder' -# 工具目录 -tool='./tools' - -iso_boot='./iso/boot/kernel.kernel' -iso='./simplekernel.iso' -iso_folder='./iso/' -# 判断操作系统类型 -OS=0 -which_os=`uname -s` -if [ ${which_os} == "Darwin" ]; then - OS=0 -elif [ ${which_os} == "Darwin" ]; then - OS=1 -fi - -# 检测环境,如果没有安装需要的软件,则安装 -if ! [ -x "$(command -v bochs)" ]; then - echo 'Error: bochs is not installed.' - echo 'Install bochs...' - if [ ${OS} == 0 ]; then - brew install bochs - elif [ ${OS} == 1 ]; then - shell ${tool}/bochs.sh - fi -fi - -if ! [ -x "$(command -v i386-elf-ld)" ]; then - echo 'Error: i386-elf-binutils is not installed.' - echo 'Install i386-elf-binutils...' - if [ ${OS} == 0 ]; then - brew install i386-elf-binutils - elif [ ${OS} == 1 ]; then - shell ${tool}/i386-elf-binutils.sh - fi -fi - -if ! [ -x "$(command -v i386-elf-gcc)" ]; then - echo 'Error: i386-elf-gcc is not installed.' - echo 'Install i386-elf-gcc...' - if [ ${OS} == 0 ]; then - brew install i386-elf-gcc - elif [ ${OS} == 1 ]; then - shell ${tool}/i386-elf-gcc.sh - fi -fi - -# 重新编译 -cd src/ -make clean -make -cd ../ - -if i386-elf-grub-file --is-x86-multiboot2 ${img}; then - echo multiboot confirmed -else - echo the file is not multiboot - exit -fi - - - -# 把 boot.img 挂载到当前目录,然后将 kernel.img 写入 boot 目录,取消挂载。 -# 以 bochrc.txt 为配置文件运行 bochs。 -if [ ${OS} == 0 ]; then - # mac 下的命令与 linux 的不同 - # hdiutil attach -mountpoint ${folder} ${disk} - # cp ${img} ${boot_folder} - # hdiutil detach ${folder} - i386-elf-grub-mkrescue -o ${iso} ${iso_folder} - cp ${img} ${iso_boot} - bochs -q -f ${bochsrc} -elif [ ${OS} == 1 ]; then - mkdir ${folder} - mount ${disk} ${folder} - cp ${img} ${boot_folder} - unmount ${folder} - rm -rf ${folder} - bochs -q -f ${bochsrc} -fi diff --git a/simplekernel.img b/simplekernel.img deleted file mode 100755 index 6af2702f5..000000000 Binary files a/simplekernel.img and /dev/null differ diff --git a/simplekernel.iso b/simplekernel.iso deleted file mode 100644 index a157d58f4..000000000 Binary files a/simplekernel.iso and /dev/null differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 000000000..dfc8c095f --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,128 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 设置编译规则 + +# 根据 SimpleKernelArch 设置编译选项 +# 架构相关选项 +if (SimpleKernelArch STREQUAL ia32/i386) + set(CMAKE_C_FLAGS "-march=corei7 -mtune=corei7 -m32 -Di386") + set(CMAKE_CXX_FLAGS "-march=corei7 -mtune=corei7 -m32 -Di386") +elseif (SimpleKernelArch STREQUAL ia32/x86_64) + set(CMAKE_C_FLAGS "-march=corei7 -mtune=corei7 -m64 -mno-red-zone -Dx86_64") + set(CMAKE_CXX_FLAGS "-march=corei7 -mtune=corei7 -m64 -mno-red-zone -Dx86_64") +elseif (SimpleKernelArch STREQUAL aarch64) + set(CMAKE_C_FLAGS "-march=armv8-a -mtune=cortex-a72 -D${SimpleKernelArch}") +elseif (SimpleKernelArch STREQUAL riscv64) + set(CMAKE_C_FLAGS "-march=rv64imafdc -D${SimpleKernelArch}") + set(CMAKE_CXX_FLAGS "-march=rv64imafdc -D${SimpleKernelArch}") +else () + message(FATAL_ERROR "unexpected ARCH: ${SimpleKernelArch}") +endif () + +# 调试相关选项 +if (CMAKE_BUILD_TYPE STREQUAL DEBUG) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -ggdb") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -ggdb") + set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}") +elseif (CMAKE_BUILD_TYPE STREQUAL RELEASE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") + set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}") +else () + message(WARNING "unexpected CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}, using default value DEBUG") + set(CMAKE_BUILD_TYPE DEBUG) +endif () + +# 代码优化级别 +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") +set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}") + +# 通用选项 +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffreestanding -nostdlib -nostdinc -fexceptions -nostartfiles -fPIC -no-pie -Wall -Wextra -MMD") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffreestanding -nostdlib -nostdinc -fexceptions -nostartfiles -fPIC -no-pie -Wall -Wextra -MMD") +set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS}") + +# 输出相关信息 +message(STATUS "CMAKE_BUILD_TYPE is ${CMAKE_BUILD_TYPE}") +message(STATUS "CMAKE_C_FLAGS is ${CMAKE_C_FLAGS}") +message(STATUS "CMAKE_CXX_FLAGS is ${CMAKE_CXX_FLAGS}") +message(STATUS "CMAKE_ASM_FLAGS is ${CMAKE_ASM_FLAGS}") +message(STATUS "TOOLCHAIN_PREFIX is ${TOOLCHAIN_PREFIX}") +message(STATUS "CMAKE_OBJCOPY is ${CMAKE_OBJCOPY}") + +# 处理子目录下的 CMakeLists +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/arch) +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/kernel) +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/drv) +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/device) +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/fs) +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/libc) +add_subdirectory(${SimpleKernel_SOURCE_CODE_DIR}/libcxx) + +# 将各个子对象链接为内核文件 +add_executable(${KernelName} + $ + $ + $ + $ + $ + $ + $) + +# 指定链接脚本 +target_link_options(${KernelName} PRIVATE -T ${SimpleKernel_SOURCE_CODE_DIR}/arch/${SimpleKernelArch}/link.ld) +# 生成 map 文件 +target_link_options(${KernelName} PRIVATE -Wl,-Map,${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${KernelName}.map) + +# 其它链接选项 +if (SimpleKernelArch STREQUAL ia32/i386) + target_link_options(${KernelName} PRIVATE -Wl,-melf_i386) +elseif (SimpleKernelArch STREQUAL ia32/x86_64) + target_link_options(${KernelName} PRIVATE -Wl,-melf_x86_64 -Wl,-z,max-page-size=0x1000) +elseif (SimpleKernelArch STREQUAL aarch64) + target_link_options(${KernelName} PRIVATE -Wl,-maarch64elf) +elseif (SimpleKernelArch STREQUAL riscv64) + target_link_options(${KernelName} PRIVATE -Wl,-melf64lriscv) +endif () + +# objcopy --only-keep-debug foo foo.dbg 创建一个包含调试信息的文件 +add_custom_command(TARGET ${KernelName} + POST_BUILD + WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + COMMAND ${CMAKE_OBJCOPY} --only-keep-debug ${KernelName} ${KernelName}.debug + COMMENT "Generating kernel debug...") + +# objcopy --strip-debug foo 创建一个去掉调试信息的( strip 的)可执行文件 +# objcopy --add-gnu-debuglink=foo.dbg foo 为 strip 的文件添加调试信息链接 +add_custom_command(TARGET ${KernelName} + POST_BUILD + WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + COMMAND ${CMAKE_OBJCOPY} --strip-debug ${KernelName} + COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=${KernelName}.debug ${KernelName} + COMMENT "Generating raw kernel...") + +# nm +add_custom_command(TARGET ${KernelName} + POST_BUILD + WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + COMMAND ${CMAKE_NM} -a -A -C -l -n -s --special-syms --synthetic ${KernelName} + > ${KernelName}.nm + COMMENT "nm...") + +# readelf -a +add_custom_command(TARGET ${KernelName} + POST_BUILD + WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + COMMAND ${CMAKE_READELF} -a ${KernelName} > ${KernelName}.readelf || (exit 0) + COMMENT "readelf...") + +# objdump -D +add_custom_command(TARGET ${KernelName} + POST_BUILD + WORKING_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + COMMAND ${CMAKE_OBJDUMP} -D ${KernelName} > ${KernelName}.disassembly + COMMENT "Disassembling...") diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 1639f8f50..000000000 --- a/src/Makefile +++ /dev/null @@ -1,74 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# Makefile for MRNIU/SimpleKernel. - -BOOT_DIR= ./arch/i386/boot -HPP_DIR= ./include -LIBC_DIR= ./include/libc -ARCH_DIR= ./arch/i386 - -C_SOURCES = $(shell find . -name "*.c") -# CXX_SOURCES = $(shell find ./include/DataStructuer/ -name "*.cpp") -S_SOURCES = $(shell find . -name "*.s") -OBJ= $(patsubst %.c, %.o, $(C_SOURCES)) \ - $(patsubst %.s, %.o, $(S_SOURCES)) \ - $(patsubst %.cpp, %.o, $(CXX_SOURCES)) - -CXX= i386-elf-g++ -CXXFLAGS= -std=c++11 -ffreestanding -nostdinc -O2 \ - -Wall -Wextra -Wshadow -Wunreachable-code -Winline -Wsign-compare \ - -g -ggdb -C -c \ - -I$(LIBC_DIR) -I$(HPP_DIR) -I$(ARCH_DIR) -I$(ARCH_DIR)/include # -v - -CC= i386-elf-gcc -CFLAGS= -std=gnu99 -ffreestanding -nostdinc -O2 \ - -Wall -Wextra -Wshadow -Wunreachable-code -Winline -Wmissing-prototypes -Wsign-compare \ - -g -ggdb -C -c \ - -I$(LIBC_DIR) -I$(HPP_DIR) -I$(ARCH_DIR) -I$(ARCH_DIR)/include # -v - -LD= i386-elf-ld -LDFLAGS= -A elf32_i386 -T$(BOOT_DIR)/link.ld - -AS= i386-elf-as -ASFLAGS= -march=i386 - -# 生成 kernel -kernel.kernel: $(OBJ) - @echo 正在生成内核... $< - @$(LD) $(LDFLAGS) $^ -o $@ - -.c.o: - @echo 编译C文件... $< - @$(CC) $(CFLAGS) $< -o $@ - -.cpp.o: - @echo 编译C++文件... $< - @$(CXX) $(CXXFLAGS) $< -o $@ - -.s.o: - @echo 编译汇编文件... $< - @$(AS) $(ASFLAGS) $< -o $@ - -.PHONY: info -info: - @echo CC: $(CC) - @echo CFLAGS: $(CFLAGS) - @echo CXX: $(CXX) - @echo CXXFLAGS: $(CXXFLAGS) - @echo LD: $(LD) - @echo LDFLAGS: $(LDFLAGS) - @echo AS: $(AS) - @echo ASFLAGS: $(ASFLAGS) - -.PHONY:code_line_count -code_line_count: - find . -type f -name "*.[c|h|s|cpp|hpp]" -exec cat {} \; | wc -l - -# 删除源码外的所有文件 -.PHONY: clean -clean: - @echo 正在删除... $< - @find . -name "*.o" | xargs rm -f - @-rm -f kernel.kernel - @echo 删除完毕 diff --git a/src/READMD.md b/src/READMD.md deleted file mode 100644 index 09f928c94..000000000 --- a/src/READMD.md +++ /dev/null @@ -1,22 +0,0 @@ -# src/ - -- arch/ - - 存放平台相关代码的目录。 - -- include/ - - 用到的头文件。 - -- kernel/ - - 内核源代码。 - -- Makefile - - 指定内核映像的生成规则,最终生成 kernel.kernel. - -- kernel.kernel - - 最终的内核映像。 - diff --git a/src/arch/CMakeLists.txt b/src/arch/CMakeLists.txt new file mode 100644 index 000000000..e17ec2700 --- /dev/null +++ b/src/arch/CMakeLists.txt @@ -0,0 +1,14 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 根据 SimpleKernelArch 判断跳转到哪个目录 + +# 如果是 ia32/i386 或 ia32/x86_64,跳转到 ia32 目录 +if (SimpleKernelArch STREQUAL "ia32/i386" OR SimpleKernelArch STREQUAL "ia32/x86_64") + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ia32) +else () + # 其它情况跳转到与 SimpleKernelArch 同名目录即可 + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${SimpleKernelArch}) +endif () diff --git a/src/arch/README.md b/src/arch/README.md deleted file mode 100644 index 44ccc712c..000000000 --- a/src/arch/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# /src/arch -平台相关代码 - diff --git a/src/arch/aarch64/CMakeLists.txt b/src/arch/aarch64/CMakeLists.txt new file mode 100644 index 000000000..8cac90b45 --- /dev/null +++ b/src/arch/aarch64/CMakeLists.txt @@ -0,0 +1,14 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +PROJECT(arch ASM) + +find_asm_source_files(boot_asm_src ${arch_SOURCE_DIR}/boot) +set(boot_src ${boot_asm_src}) + +set(arch_src ${boot_src}) + +add_library(${PROJECT_NAME} OBJECT ${arch_src}) diff --git a/src/arch/aarch64/boot/boot.S b/src/arch/aarch64/boot/boot.S new file mode 100644 index 000000000..2504a4de0 --- /dev/null +++ b/src/arch/aarch64/boot/boot.S @@ -0,0 +1,32 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +// Based on https://wiki.osdev.org/Raspberry_Pi_Bare_Bones +// boot.S for Simple-XX/SimpleKernel. + +// clang-format off + +.section .init + +// Entry point for the kernel. +// r15 -> should begin execution at 0x8000. +// r0 -> 0x00000000 +// r1 -> 0x00000C42 - machine id +// r2 -> 0x00000100 - start of ATAGS +// preserve these registers as argument for kernel_main +.global _start +.type _start, @function +.extern kernel_main +// 规定起始地址 +.org 0x8000 +_start: + // 设置栈 + ldr x5, =_start + mov sp, x5 + // 进入 kernel_main + bl kernel_main + +// halt +halt: + wfe + b halt diff --git a/src/arch/aarch64/hardware.h b/src/arch/aarch64/hardware.h new file mode 100644 index 000000000..5a66f7338 --- /dev/null +++ b/src/arch/aarch64/hardware.h @@ -0,0 +1,96 @@ + +/** + * @file hardware.h + * @brief 硬件定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_HARDWARE_H +#define SIMPLEKERNEL_HARDWARE_H + +#include "cstdint" + +namespace HARDWARE { +// for raspi2 & 3 +static constexpr const uint32_t MMIO_BASE = 0x3F000000; +// The offsets for reach register. +static constexpr const uint32_t GPIO_BASE = MMIO_BASE + 0x200000; +// Controls actuation of pull up/down to ALL GPIO pins. +static constexpr const uint32_t GPPUD = GPIO_BASE + 0x94; +// Controls actuation of pull up/down for specific GPIO pin. +static constexpr const uint32_t GPPUDCLK0 = GPIO_BASE + 0x98; + +// 设备 id +static constexpr const uint32_t DEVICE_ID_SD_CARD = 0x00000000; +static constexpr const uint32_t DEVICE_ID_UART0 = 0x00000001; +static constexpr const uint32_t DEVICE_ID_UART1 = 0x00000002; +static constexpr const uint32_t DEVICE_ID_USB_HCD = 0x00000003; +static constexpr const uint32_t DEVICE_ID_I2C0 = 0x00000004; +static constexpr const uint32_t DEVICE_ID_I2C1 = 0x00000005; +static constexpr const uint32_t DEVICE_ID_I2C2 = 0x00000006; +static constexpr const uint32_t DEVICE_ID_SPI = 0x00000007; +static constexpr const uint32_t DEVICE_ID_CCP2TX = 0x00000008; + +// 时钟 id +static constexpr const uint32_t CLOCK_ID_RESERVED = 0x000000000; +static constexpr const uint32_t CLOCK_ID_EMMC = 0x000000001; +static constexpr const uint32_t CLOCK_ID_UART = 0x000000002; +static constexpr const uint32_t CLOCK_ID_ARM = 0x000000003; +static constexpr const uint32_t CLOCK_ID_CORE = 0x000000004; +static constexpr const uint32_t CLOCK_ID_V3D = 0x000000005; +static constexpr const uint32_t CLOCK_ID_H264 = 0x000000006; +static constexpr const uint32_t CLOCK_ID_ISP = 0x000000007; +static constexpr const uint32_t CLOCK_ID_SDRAM = 0x000000008; +static constexpr const uint32_t CLOCK_ID_PIXEL = 0x000000009; +static constexpr const uint32_t CLOCK_ID_PWM = 0x00000000a; +static constexpr const uint32_t CLOCK_ID_HEVC = 0x00000000b; +static constexpr const uint32_t CLOCK_ID_EMMC2 = 0x00000000c; +static constexpr const uint32_t CLOCK_ID_M2MC = 0x00000000d; +static constexpr const uint32_t CLOCK_ID_PIXEL_BVB = 0x00000000e; + +// 电压 id +static constexpr const uint32_t VOLTAGE_ID_RESERVED = 0x000000000; +static constexpr const uint32_t VOLTAGE_ID_CORE = 0x000000001; +static constexpr const uint32_t VOLTAGE_ID_SDRAM_C = 0x000000002; +static constexpr const uint32_t VOLTAGE_ID_SDRAM_P = 0x000000003; +static constexpr const uint32_t VOLTAGE_ID_SDRAM_I = 0x000000004; + +// mailbox 地址 +static constexpr const uint32_t MAILBOX_OFFSET = 0x0000B880; +static constexpr const uint32_t MAILBOX_READ_OFFSET = 0x0; +static constexpr const uint32_t MAILBOX_POLL_OFFSET = 0x10; +static constexpr const uint32_t MAILBOX_SENDER_OFFSET = 0x14; +static constexpr const uint32_t MAILBOX_STATUS_OFFSET = 0x18; +static constexpr const uint32_t MAILBOX_CONFIG_OFFSET = 0x1C; +static constexpr const uint32_t MAILBOX_WRITE_OFFSET = 0x20; +static constexpr const uint32_t MAILBOX_VIDEOCORE = MMIO_BASE + MAILBOX_OFFSET; +static constexpr const uint32_t MAILBOX_READ + = MAILBOX_VIDEOCORE + MAILBOX_READ_OFFSET; +static constexpr const uint32_t MAILBOX_POLL + = MAILBOX_VIDEOCORE + MAILBOX_POLL_OFFSET; +static constexpr const uint32_t MAILBOX_SENDER + = MAILBOX_VIDEOCORE + MAILBOX_SENDER_OFFSET; +static constexpr const uint32_t MAILBOX_STATUS + = MAILBOX_VIDEOCORE + MAILBOX_STATUS_OFFSET; +static constexpr const uint32_t MAILBOX_CONFIG + = MAILBOX_VIDEOCORE + MAILBOX_CONFIG_OFFSET; +static constexpr const uint32_t MAILBOX_WRITE + = MAILBOX_VIDEOCORE + MAILBOX_WRITE_OFFSET; +static constexpr const uint32_t MAILBOX_RESPONSE_SUCCESSFUL = 0x80000000; +static constexpr const uint32_t MAILBOX_RESPONSE_ERROR = 0x80000001; +// 1<<31 +static constexpr const uint32_t MAILBOX_FULL = 0x80000000; +// 1<<30 +static constexpr const uint32_t MAILBOX_EMPTY = 0x40000000; +}; // namespace HARDWARE + +#endif /* SIMPLEKERNEL_HARDWARE_H */ diff --git a/src/arch/aarch64/link.ld b/src/arch/aarch64/link.ld new file mode 100644 index 000000000..98c8d306a --- /dev/null +++ b/src/arch/aarch64/link.ld @@ -0,0 +1,56 @@ + +/* This file is a part of Simple-XX/SimpleKernel + * (https://github.com/Simple-XX/SimpleKernel). + * + * link.ld for Simple-XX/SimpleKernel. + * 链接脚本,指定生成的二进制文件的布局 + */ + +OUTPUT_FORMAT(elf64-littleaarch64) + +ENTRY(_start) + +SECTIONS +{ + /* 加载地址 */ + . = 0x8000; + + kernel_start = .; + kernel_text_start = .; + .text : ALIGN(4K) + { + *.(.text.init) + *(.text) + } + kernel_text_end = .; + + kernel_rodata_start = .; + .rodata : ALIGN(4K) + { + *(.rodata) + } + kernel_rodata_end = .; + + kernel_data_start = .; + .data : ALIGN(4K) + { + ctors_start = .; + *(.ctor*) + ctors_end = .; + dtors_start = .; + *(.dtor*) + dtors_end = .; + *(.data) + } + kernel_data_end = .; + + kernel_bss_start = .; + .bss : ALIGN(4K) + { + *(COMMON) + *(.bss) + } + kernel_bss_end = .; + + kernel_end = .; +} diff --git a/src/arch/aarch64/port/include/port.h b/src/arch/aarch64/port/include/port.h new file mode 100644 index 000000000..bd644de17 --- /dev/null +++ b/src/arch/aarch64/port/include/port.h @@ -0,0 +1,37 @@ + +/** + * @file port.h + * @brief arm 端口驱动 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_PORT_H +#define SIMPLEKERNEL_PORT_H + +#include "cstdint" + +namespace PORT { +// 端口读一个字节 +uint8_t inb(const uint32_t port); +// 端口读一个字 +uint16_t inw(const uint32_t port); +// 端口读一个双字 +uint32_t ind(const uint32_t port); +// 端口写一个字节 +void outb(const uint32_t port, const uint8_t data); +// 端口写一个字 +void outw(const uint32_t port, const uint16_t data); +// 端口写一个双字 +void outd(const uint32_t port, const uint32_t data); +}; // namespace PORT + +#endif /* SIMPLEKERNEL_PORT_H */ diff --git a/src/arch/aarch64/port/port.cpp b/src/arch/aarch64/port/port.cpp new file mode 100644 index 000000000..a52701cf6 --- /dev/null +++ b/src/arch/aarch64/port/port.cpp @@ -0,0 +1,44 @@ + +/** + * @file port.cpp + * @brief 串口驱动 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "port.h" + +uint8_t PORT::inb(const uint32_t port __attribute((unused))) { + return 0; +} + +uint16_t PORT::inw(const uint32_t port __attribute((unused))) { + return 0; +} + +uint32_t PORT::ind(const uint32_t port) { + return *(volatile uint32_t*)port; +} + +void PORT::outw(const uint32_t port __attribute((unused)), + const uint16_t data __attribute((unused))) { + return; +} + +void PORT::outb(const uint32_t port __attribute((unused)), + const uint8_t data __attribute((unused))) { + return; +} + +void PORT::outd(const uint32_t port, const uint32_t data) { + *(volatile uint32_t*)port = data; + return; +} diff --git a/src/arch/i386/README.md b/src/arch/i386/README.md deleted file mode 100644 index 3b2d88bc1..000000000 --- a/src/arch/i386/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# src/arch/i386/ -## 文件说明 - -- boot.s - - 启动代码,使用 Grub 引导。 - -- link.ld - - 链接脚本,规定了生成程序地址空间的布局。 - -## 参考资料 - -[系统初始化](https://wiki.osdev.org/Bare_Bones) - diff --git a/src/arch/i386/boot/boot.s b/src/arch/i386/boot/boot.s deleted file mode 100644 index 3edc21c5b..000000000 --- a/src/arch/i386/boot/boot.s +++ /dev/null @@ -1,41 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -# boot.s for MRNIU/SimpleKernel. - - -.set STACK_SIZE, 0x4000 - -.text -.align 8 -.global start, _start -.global multiboot2_info -.global multiboot2_magic -.extern kernel_main - -.align 8 -multiboot_header: - .long 0xe85250d6 - .long 0 - .long multiboot_header_end - multiboot_header - .long -(0xe85250d6 + 0 + multiboot_header_end - multiboot_header) - - .align 8 - .short 0 - .short 0 - .long 8 - -.align 8 -start: - -.align 8 -multiboot_header_end: - -.align 8 -multiboot_entry: - mov $(stack + STACK_SIZE), %esp - push $0 - popf - push %ebx - push %eax - call kernel_main -.comm stack, STACK_SIZE diff --git a/src/arch/i386/boot/link.ld b/src/arch/i386/boot/link.ld deleted file mode 100644 index af7a699ec..000000000 --- a/src/arch/i386/boot/link.ld +++ /dev/null @@ -1,44 +0,0 @@ -/* Based on osdev.org Bare_Bones:*/ -/* (https://wiki.osdev.org/Bare_Bones).*/ - -/* This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel).*/ -/* link.ld for MRNIU/SimpleKernel.*/ - -ENTRY(start) - -SECTIONS -{ - /* 指定内核从地址 1M 处开始 */ - . = 1M; - - PROVIDE(kernel_start = .); - PROVIDE(kernel_text_start = .); - - .text BLOCK(4K) : ALIGN(4K) - { - *(.multiboot_header) - *(.text) - } - PROVIDE(kernel_text_end = .); - - PROVIDE(kernel_data_start = .); - .rodata BLOCK(4K) : ALIGN(4K) - { - *(.rodata) - } - - .data BLOCK(4K) : ALIGN(4K) - { - *(.data) - } - PROVIDE(kernel_data_end = .); - - .bss BLOCK(4K) : ALIGN(4K) - { - *(COMMON) - *(.bss) - } - - PROVIDE(kernel_end = .); - -} diff --git a/src/arch/i386/debug/debug.c b/src/arch/i386/debug/debug.c deleted file mode 100644 index c1577d5c5..000000000 --- a/src/arch/i386/debug/debug.c +++ /dev/null @@ -1,35 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#multiboot_002eh -// debug.c for MRNIU/SimpleKernel. - -#include "debug.h" -#include "cpu.hpp" - - -void print_cur_status(){ - static int round = 0; - uint16_t reg1, reg2, reg3, reg4; - asm volatile ( "mov %%cs, %0;" - "mov %%ds, %1;" - "mov %%es, %2;" - "mov %%ss, %3;" - : "=m" (reg1), "=m" (reg2), "=m" (reg3), "=m" (reg4)); - - // 打印当前的运行级别 - printk("%d: @ring %d\n", round, reg1 & 0x3); - printk("%d: cs = %x\n", round, reg1); - printk("%d: ds = %x\n", round, reg2); - printk("%d: es = %x\n", round, reg3); - printk("%d: ss = %x\n", round, reg4); - ++round; -} - - -// void debug_init(uint64_t magic, multiboot_info_t * mb) { -// -// -// // 从 GRUB 提供的信息中获取到内核符号表和代码地址信息 -// -// return; -// } diff --git a/src/arch/i386/intr/README.md b/src/arch/i386/intr/README.md deleted file mode 100644 index b6307413d..000000000 --- a/src/arch/i386/intr/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# /src/arch/i386/intr - -## 文件说明 -- intr_s.s - - 主要涉及到中断服务的调用代码,包括了 idt 的加载 - -- intr.c - 设置中断描述符 - -- intr.h - 相关结构、常量的定义 - - -## 参考资料 - -[布尔类型](https://zh.wikipedia.org/wiki/布爾_(數據類型)) - -[eflags寄存器详解](https://blog.csdn.net/jn1158359135/article/details/7761011) - -[hurlex](http://wiki.0xffffff.org/posts/hurlex-8.html) - -[howerj/os](https://github.com/howerj/os) - -[cfenollosa/os-tutorial](https://github.com/cfenollosa/os-tutorial) - -[omarrx024/xos](https://github.com/omarrx024/xos) - - diff --git a/src/arch/i386/intr/intr.c b/src/arch/i386/intr/intr.c deleted file mode 100644 index 3a803522d..000000000 --- a/src/arch/i386/intr/intr.c +++ /dev/null @@ -1,248 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on http://wiki.0xffffff.org/posts/hurlex-kernel.html -// intr.c for MRNIU/SimpleKernel. - - -#include "intr.h" -#include "port.hpp" -#include "stdio.h" -#include "pic.hpp" -#include "cpu.hpp" - - -// 中断描述符表 -static idt_entry_t idt_entries[INTERRUPT_MAX] __attribute__ ((aligned(16))); - -static idt_ptr_t idt_ptr; // IDTR - -// 设置中断描述符 -static void idt_set_gate(uint8_t num, uint32_t base, uint16_t target, uint8_t flags){ - idt_entries[num].base_low = (base & 0xFFFF); - idt_entries[num].base_high = (base >> 16) & 0xFFFF; - idt_entries[num].selector = target; - idt_entries[num].zero = 0; - idt_entries[num].flags = flags; - // 0x8E: DPL=0 - // 0xEF: DPL=3 -} - - -// 中断处理函数指针数组 -static interrupt_handler_t interrupt_handlers[INTERRUPT_MAX] __attribute__ ((aligned(4))); - -static const char *intrname(uint32_t intrno){ - static const char *const intrnames[] = { - "Divide error", - "Debug", - "Non-Maskable Interrupt", - "Breakpoint", - "Overflow", - "BOUND Range Exceeded", - "Invalid Opcode", - "Device Not Available", - "Double Fault", - "Coprocessor Segment Overrun", - "Invalid TSS", - "Segment Not Present", - "Stack Fault", - "General Protection", - "Page Fault", - "(unknown trap)", - "x87 FPU Floating-Point Error", - "Alignment Check", - "Machine-Check", - "SIMD Floating-Point Exception" - }; - if(intrno < sizeof(intrnames)/sizeof(const char *const)) { - return intrnames[intrno]; - } - return "(unknown trap)"; -} - -// 调用中断处理函数 -void isr_handler(pt_regs_t *regs){ - if (interrupt_handlers[regs->int_no]) { - interrupt_handlers[regs->int_no](regs); - } - else { - printk("Unhandled interrupt: %d %s\n", regs->int_no, intrname(regs->int_no)); - cpu_hlt(); - } -} - -// 注册一个中断处理函数 -void register_interrupt_handler(uint8_t n, interrupt_handler_t h){ - interrupt_handlers[n] = h; -} - -// IRQ 处理函数 -void irq_handler(pt_regs_t *regs){ - clear_interrupt_chip(regs->int_no); // 重设PIC芯片 - if (interrupt_handlers[regs->int_no]) { - interrupt_handlers[regs->int_no](regs); - } -} - -// 中断处理函数指针数组 -static isr_irq_func_t isr_irq_func[INTERRUPT_MAX] = { - [0] = &isr0, [1] = &isr1, [2] = &isr2, [3] = &isr3, - [4] = &isr4, [5] = &isr5, [6] = &isr6, [7] = &isr7, - [8] = &isr8, [9] = &isr9, [10] = &isr10, [11] = &isr11, - [12] = &isr12, [13] = &isr13, [14] = &isr14, [15] = &isr15, - [16] = &isr16, [17] = &isr17, [18] = &isr18, [19] = &isr19, - [20] = &isr20, [21] = &isr21, [22] = &isr22, [23] = &isr23, - [24] = &isr24, [25] = &isr25, [26] = &isr26, [27] = &isr27, - [28] = &isr28, [29] = &isr29, [30] = &isr30, [31] = &isr31, - - [32] = &irq0, [33] = &irq1, [34] = &irq2, [35] = &irq3, - [36] = &irq4, [37] = &irq5, [38] = &irq6, [39] = &irq7, - [40] = &irq8, [41] = &irq9, [42] = &irq10, [43] = &irq11, - [44] = &irq12, [45] = &irq13, [46] = &irq14, [47] = &irq15, -}; - -// idt 初始化 -void idt_init(void){ - init_interrupt_chip(); - idt_ptr.limit = sizeof(idt_entry_t) * INTERRUPT_MAX -1; - idt_ptr.base = (uint32_t)&idt_entries; - - // 0-32: 用于 CPU 的中断处理 - // GD_KTEXT: 内核代码段 - // 0x8E: 10001110: DPL=0s - // 0x08: 0000 1000 - - for(uint32_t i=0; i<48; ++i) { - idt_set_gate(i, (uint32_t)isr_irq_func[i], 0x08, 0x8E); - } - // 128 (0x80) 将来用于实现系统调用 - // 0xEF: 1110 1111, DPL=3 - idt_set_gate(INT_DEBUG, (uint32_t)isr_irq_func[INT_DEBUG], 0x08, 0xEF); - idt_set_gate(INT_OVERFLOW, (uint32_t)isr_irq_func[INT_OVERFLOW], 0x08, 0xEF); - idt_set_gate(INT_BOUND, (uint32_t)isr_irq_func[INT_BOUND], 0x08, 0xEF); - idt_set_gate(128, (uint32_t)isr128, 0x08, 0xEF); - - idt_load((uint32_t)&idt_ptr); - - register_interrupt_handler(INT_DIVIDE_ERROR, ÷_error); - register_interrupt_handler(INT_DEBUG, &debug); - register_interrupt_handler(INT_NMI, &nmi); - register_interrupt_handler(INT_BREAKPOINT, &breakpoint); - register_interrupt_handler(INT_OVERFLOW, &overflow); - register_interrupt_handler(INT_BOUND, &bound); - register_interrupt_handler(INT_INVALID_OPCODE, &invalid_opcode); - register_interrupt_handler(INT_DEVICE_NOT_AVAIL, &device_not_available); - register_interrupt_handler(INT_DOUBLE_FAULT, &double_fault); - register_interrupt_handler(INT_COPROCESSOR, &coprocessor_error); - register_interrupt_handler(INT_INVALID_TSS, &invalid_TSS); - register_interrupt_handler(INT_SEGMENT, &segment_not_present); - register_interrupt_handler(INT_STACK_FAULT, &stack_segment); - register_interrupt_handler(INT_GENERAL_PROTECT, &general_protection); - register_interrupt_handler(INT_PAGE_FAULT, &page_fault); -} - -static void die(char * str, uint32_t oesp, uint32_t int_no){ - // uint32_t * old_esp = (uint32_t *)oesp; - pt_regs_t * old_esp = (pt_regs_t *) oesp; - printk_color(red, "%s\t: %d\n\r", str, int_no); - printk_color(light_red, "die_Unuseable.\n"); - // cs::EIP - // oss:oesp - // printk_color(red, "EIP:\t%08x:%p\nEFLAGS:\t%08x\nESP:\t%08x:%p\n", - // old_esp[1], read_eflags(), read_eflags(), old_esp[4], old_esp[3]); - // printk_color(red, "EIP:\t%08x:%p\nEFLAGS:\t%08x\nESP:\t%08x:%p\n", - // &old_esp[1], &old_esp[0], &old_esp[2], &old_esp[4], &old_esp[3]); - // printk_color(red, "EIP:\t%08x:%08X\nEFLAGS:\t%08x\nESP:\t%08x:%08X\n", - // old_esp->cs, old_esp->eip, old_esp->eflags, old_esp->ss, old_esp->old_esp); - printk_color(red, "gs: %08x\tfs: %08x\tes: %08x\tds: %08x\n", - old_esp->gs, old_esp->fs, old_esp->es, old_esp->ds); - printk_color(red, "edi: %08x\tesi: %08x\tebp: %08x\told_esp: %08x\n", - old_esp->edi, old_esp->esi, old_esp->ebp, old_esp->old_esp); - printk_color(red, "ebx: %08x\tedx: %08x\tecx: %08x\teax: %08x\n", - old_esp->ebx, old_esp->edx, old_esp->ecx, old_esp->eax); - printk_color(red, "int_no: %08X\terr_code: %08X\teip: %08x\tcs: %08x\n", - old_esp->int_no, old_esp->err_code, old_esp->eip, old_esp->cs); - printk_color(red, "eflags: %08x\tuser_esp: %08x\tss: %08x\n", - old_esp->eflags, old_esp->user_esp, old_esp->user_ss); - printk_color(red, "addr: %08x, %08X\n", &old_esp->gs, &old_esp->user_ss); - - cpu_hlt(); -} - - -void divide_error(pt_regs_t * regs){ - die("Divide Error.", regs->old_esp, regs->int_no); -} - -void debug(pt_regs_t * regs){ - uint32_t tr; - uint32_t * old_esp = (uint32_t *)regs->old_esp; - - // 取任务寄存器值->tr - asm volatile ("str %%ax" - : "=a" (tr) - : "0" (0)); - printk_color(light_red, "Unuseable.\n"); - - printk_color(red, "eax\t\tebx\t\tecx\t\tedx\n\r%08X\t%08X\t%08X\t%08X\n\r", - regs->eax, regs->ebx, regs->ecx, regs->edx); - printk_color(red, "esi\t\tedi\t\tebp\t\tesp\n\r%08X\t%08X\t%08X\t%08X\n\r", - regs->esi, regs->edi, regs->ebp, (uint32_t) regs->user_esp); - printk_color(red, "\n\rds\tes\tfs\tgs\n\r%04X\t%04X\t%04X\t%04X\n\r", - regs->ds, regs->es, regs->fs, regs->gs); - printk_color(red, "EIP: %08X EFLAGS: %08X CS: %04X\n\r", - //old_esp[0], old_esp[1], old_esp[2]); - old_esp[0], read_eflags(), old_esp[2]); -} - -void nmi(pt_regs_t * regs){ - die("NMI.", regs->old_esp, regs->int_no); -} - -void breakpoint(pt_regs_t * regs){ - die("Breakpoint.", regs->old_esp, regs->int_no); -} - -void overflow(pt_regs_t * regs){ - die("Overflow.", regs->old_esp, regs->int_no); -} - -void bound(pt_regs_t * regs){ - die("Bound.", regs->old_esp, regs->int_no); -} - -void invalid_opcode(pt_regs_t * regs){ - die("Invalid Opcode.", regs->old_esp, regs->int_no); -} - -void device_not_available(pt_regs_t * regs){ - die("Device Not Available.", regs->old_esp, regs->int_no); -} - -void double_fault(pt_regs_t * regs){ - die("Double Fault.", regs->old_esp, regs->int_no); -} - -void coprocessor_error(pt_regs_t * regs){ - die("Coprocessor Error.", regs->old_esp, regs->int_no); -} - -void invalid_TSS(pt_regs_t * regs){ - die("Invalid TSS.", regs->old_esp, regs->int_no); -} - -void segment_not_present(pt_regs_t * regs){ - die("Segment Not Present.", regs->old_esp, regs->int_no); -} - -void stack_segment(pt_regs_t * regs){ - die("Stack Segment.", regs->old_esp, regs->int_no); -} - -void general_protection(pt_regs_t * regs){ - die("General Protection.", regs->old_esp, regs->int_no); -} - -void page_fault(pt_regs_t * regs){ - die("Page Fault.", regs->old_esp, regs->int_no); -} diff --git a/src/arch/i386/intr/intr.h b/src/arch/i386/intr/intr.h deleted file mode 100644 index ea23811ef..000000000 --- a/src/arch/i386/intr/intr.h +++ /dev/null @@ -1,196 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// intr.h for MRNIU/SimpleKernel. - - -#ifndef _INTR_H_ -#define _INTR_H_ - -#include "stdint.h" - -#define INTERRUPT_MAX 256 // 中断表最大值 - -// 定义IRQ -#define IRQ0 32 // 电脑系统计时器 -#define IRQ1 33 // 键盘 -#define IRQ2 34 // 与 IRQ9 相接,MPU-401 MD 使用 -#define IRQ3 35 // 串口设备 -#define IRQ4 36 // 串口设备 -#define IRQ5 37 // 建议声卡使用 -#define IRQ6 38 // 软驱传输控制使用 -#define IRQ7 39 // 打印机传输控制使用 -#define IRQ8 40 // 即时时钟 -#define IRQ9 41 // 与 IRQ2 相接,可设定给其他硬件 -#define IRQ10 42 // 建议网卡使用 -#define IRQ11 43 // 建议 AGP 显卡使用 -#define IRQ12 44 // 接 PS/2 鼠标,也可设定给其他硬件 -#define IRQ13 45 // 协处理器使用 -#define IRQ14 46 // IDE0 传输控制使用 -#define IRQ15 47 // IDE1 传输控制使用 - -// 中断号定义 -#define INT_DIVIDE_ERROR 0 -#define INT_DEBUG 1 -#define INT_NMI 2 -#define INT_BREAKPOINT 3 -#define INT_OVERFLOW 4 -#define INT_BOUND 5 -#define INT_INVALID_OPCODE 6 -#define INT_DEVICE_NOT_AVAIL 7 -#define INT_DOUBLE_FAULT 8 -#define INT_COPROCESSOR 9 -#define INT_INVALID_TSS 10 -#define INT_SEGMENT 11 -#define INT_STACK_FAULT 12 -#define INT_GENERAL_PROTECT 13 -#define INT_PAGE_FAULT 14 - -#define INT_X87_FPU 16 -#define INT_ALIGNMENT 17 -#define INT_MACHINE_CHECK 18 -#define INT_SIMD_FLOAT 19 -#define INT_VIRTUAL_EXCE 20 - -typedef - struct pt_regs_t { -/* segment registers */ - uint32_t gs; // 16 bits - uint32_t fs; // 16 bits - uint32_t es; // 16 bits - uint32_t ds; // 16 bits - -/* registers save by pusha */ - uint32_t edi; - uint32_t esi; - uint32_t ebp; - uint32_t old_esp; - uint32_t ebx; - uint32_t edx; - uint32_t ecx; - uint32_t eax; - - uint32_t int_no; -/* save by `int` instruction */ - uint32_t err_code; -// 以下指令由cpu压入,参见x86/x64 532页 - uint32_t eip; // 指向产生异常的指令 - uint32_t cs; // 16 bits - uint32_t eflags; -// 如果发生了特权级切换,CPU 会压入以下两个参数 - uint32_t user_esp; - uint32_t user_ss; // 16 bits -} pt_regs_t; - -// 中断描述符 -typedef - struct idt_entry_t { - uint16_t base_low; // 中断处理函数地址 15~0 位 - uint16_t selector; // 目标代码段描述符选择子 - uint8_t zero; // 置 0 段 - uint8_t flags; // 一些标志,文档有解释 - uint16_t base_high; // 中断处理函数地址 31~16 位 -} __attribute__((packed)) idt_entry_t; - -// IDTR -typedef - struct idt_ptr_t { - uint16_t limit; // 限长 - uint32_t base; // 基址 -} __attribute__((packed)) idt_ptr_t; - -// 声明中断处理函数 0 ~ 19 属于 CPU 的异常中断 -// ISR:中断服务程序(interrupt service routine) -extern void isr0(); // 0 #DE 除 0 异常 -extern void isr1(); // 1 #DB 调试异常 -extern void isr2(); // 2 NMI -extern void isr3(); // 3 BP 断点异常 -extern void isr4(); // 4 #OF 溢出 -extern void isr5(); // 5 #BR 对数组的引用超出边界 -extern void isr6(); // 6 #UD 无效或未定义的操作码 -extern void isr7(); // 7 #NM 设备不可用(无数学协处理器) -extern void isr8(); // 8 #DF 双重故障(有错误代码) -extern void isr9(); // 9 协处理器跨段操作 -extern void isr10(); // 10 #TS 无效TSS(有错误代码) -extern void isr11(); // 11 #NP 段不存在(有错误代码) -extern void isr12(); // 12 #SS 栈错误(有错误代码) -extern void isr13(); // 13 #GP 常规保护(有错误代码) -extern void isr14(); // 14 #PF 页故障(有错误代码) -extern void isr15(); // 15 CPU 保留 -extern void isr16(); // 16 #MF 浮点处理单元错误 -extern void isr17(); // 17 #AC 对齐检查 -extern void isr18(); // 18 #MC 机器检查 -extern void isr19(); // 19 #XM SIMD(单指令多数据)浮点异常 - -// 20 ~ 31 Intel 保留 -extern void isr20(); -extern void isr21(); -extern void isr22(); -extern void isr23(); -extern void isr24(); -extern void isr25(); -extern void isr26(); -extern void isr27(); -extern void isr28(); -extern void isr29(); -extern void isr30(); -extern void isr31(); - -// 32 ~ 255 用户自定义异常 -extern void isr128(); // 0x80 用于实现系统调用 - -// 声明 IRQ 函数 -// IRQ:中断请求(Interrupt Request) -extern void irq0(); // 电脑系统计时器 -extern void irq1(); // 键盘 -extern void irq2(); // 与 IRQ9 相接,MPU-401 MD 使用 -extern void irq3(); // 串口设备 -extern void irq4(); // 串口设备 -extern void irq5(); // 建议声卡使用 -extern void irq6(); // 软驱传输控制使用 -extern void irq7(); // 打印机传输控制使用 -extern void irq8(); // 即时时钟 -extern void irq9(); // 与 IRQ2 相接,可设定给其他硬件 -extern void irq10(); // 建议网卡使用 -extern void irq11(); // 建议 AGP 显卡使用 -extern void irq12(); // 接 PS/2 鼠标,也可设定给其他硬件 -extern void irq13(); // 协处理器使用 -extern void irq14(); // IDE0 传输控制使用 -extern void irq15(); // IDE1 传输控制使用 - - -void irq_handler(pt_regs_t * regs); // IRQ 处理函数 - -typedef void (*interrupt_handler_t)(pt_regs_t *); // 定义中断处理函数指针 - -void isr_handler(pt_regs_t *regs); // 调用中断处理函数 - -void register_interrupt_handler(uint8_t n, interrupt_handler_t h); // 注册一个中断处理函数 - -extern void idt_load(uint32_t); // 声明加载 IDTR 的函数 - -typedef void (*isr_irq_func_t)(); // 中断处理函数指针类型 - -void idt_init(void); // idt 初始化 - -extern void clear_interrupt_chip(uint32_t intr_no); // 重置 8259A - -// 系统中断 -void divide_error(pt_regs_t * regs); -void debug(pt_regs_t * regs); -void nmi(pt_regs_t * regs); -void breakpoint(pt_regs_t * regs); -void overflow(pt_regs_t * regs); -void bound(pt_regs_t * regs); -void invalid_opcode(pt_regs_t * regs); -void device_not_available(pt_regs_t * regs); -void double_fault(pt_regs_t * regs); -void coprocessor_error(pt_regs_t * regs); -void invalid_TSS(pt_regs_t * regs); -void segment_not_present(pt_regs_t * regs); -void stack_segment(pt_regs_t * regs); -void general_protection(pt_regs_t * regs); -void page_fault(pt_regs_t * regs); - - -#endif diff --git a/src/arch/i386/intr/intr_s.s b/src/arch/i386/intr/intr_s.s deleted file mode 100644 index bcebfb033..000000000 --- a/src/arch/i386/intr/intr_s.s +++ /dev/null @@ -1,151 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# intr_s.s for MRNIU/SimpleKernel. - -# 加载 idt -.global idt_load -idt_load: - mov 4(%esp), %eax # 参数保存在 eax - lidt (%eax) - ret - -# 定义两个构造中断处理函数的宏(有的中断有错误代码,有的没有) -# 用于没有错误代码的中断 - -.macro ISR_NOERRCODE no -.global isr\no -isr\no: - cli # 首先关闭中断 - push $0 # push 无效的中断错误代码,占位用 - push $\no # push 中断号 - jmp isr_common_stub -.endm - -# 用于有错误代码的中断 -.macro ISR_ERRCODE no -.global isr\no -isr\no: - cli # 关闭中断 - push $\no # push 中断号 - jmp isr_common_stub -.endm - -# 定义中断处理函数 -ISR_NOERRCODE 0 # 0 #DE 除 0 异常 -ISR_NOERRCODE 1 # 1 #DB 调试异常 -ISR_NOERRCODE 2 # 2 NMI -ISR_NOERRCODE 3 # 3 BP 断点异常 -ISR_NOERRCODE 4 # 4 #OF 溢出 -ISR_NOERRCODE 5 # 5 #BR 对数组的引用超出边界 -ISR_NOERRCODE 6 # 6 #UD 无效或未定义的操作码 -ISR_NOERRCODE 7 # 7 #NM 设备不可用(无数学协处理器) -ISR_ERRCODE 8 # 8 #DF 双重故障(有错误代码) -ISR_NOERRCODE 9 # 9 协处理器跨段操作 -ISR_ERRCODE 10 # 10 #TS 无效TSS(有错误代码) -ISR_ERRCODE 11 # 11 #NP 段不存在(有错误代码) -ISR_ERRCODE 12 # 12 #SS 栈错误(有错误代码) -ISR_ERRCODE 13 # 13 #GP 常规保护(有错误代码) -ISR_ERRCODE 14 # 14 #PF 页故障(有错误代码) -ISR_NOERRCODE 15 # 15 CPU 保留 -ISR_NOERRCODE 16 # 16 #MF 浮点处理单元错误 -ISR_ERRCODE 17 # 17 #AC 对齐检查 -ISR_NOERRCODE 18 # 18 #MC 机器检查 -ISR_NOERRCODE 19 # 19 #XM SIMD(单指令多数据)浮点异常 - -# 20 ~ 31 Intel 保留 -ISR_NOERRCODE 20 -ISR_NOERRCODE 21 -ISR_NOERRCODE 22 -ISR_NOERRCODE 23 -ISR_NOERRCODE 24 -ISR_NOERRCODE 25 -ISR_NOERRCODE 26 -ISR_NOERRCODE 27 -ISR_NOERRCODE 28 -ISR_NOERRCODE 29 -ISR_NOERRCODE 30 -ISR_NOERRCODE 31 -# 32 ~ 255 用户自定义 -# 128=0x80 用于系统调用 -ISR_NOERRCODE 128 - - -# 中断服务程序 -.global isr_common_stub -.extern isr_handler -isr_common_stub: - pusha - push %ds - push %es - push %fs - push %gs - - mov $0x10, %ax # 加载内核数据段描述符表, 0x10:内核数据段标识符 - mov %ax, %ds - mov %ax, %es - mov %ax, %fs - mov %ax, %gs - mov %ax, %ss - - push %esp - call isr_handler - add $4, %esp # 清除压入的参数 - call forkret_s - -# 构造中断请求的宏 -.macro IRQ name, no -.global irq\name -irq\name: - cli - push $0 - push $\no - jmp irq_common_stub -.endm - -IRQ 0, 32 # 电脑系统计时器 -IRQ 1, 33 # 键盘 -IRQ 2, 34 # 与 IRQ9 相接,MPU-401 MD 使用 -IRQ 3, 35 # 串口设备 -IRQ 4, 36 # 串口设备 -IRQ 5, 37 # 建议声卡使用 -IRQ 6, 38 # 软驱传输控制使用 -IRQ 7, 39 # 打印机传输控制使用 -IRQ 8, 40 # 即时时钟 -IRQ 9, 41 # 与 IRQ2 相接,可设定给其他硬件 -IRQ 10, 42 # 建议网卡使用 -IRQ 11, 43 # 建议 AGP 显卡使用 -IRQ 12, 44 # 接 PS/2 鼠标,也可设定给其他硬件 -IRQ 13, 45 # 协处理器使用 -IRQ 14, 46 # IDE0 传输控制使用 -IRQ 15, 47 # IDE1 传输控制使用 - -.global irq_common_stub -.global forkret_s -.extern irq_handler -irq_common_stub: - pusha - push %ds - push %es - push %fs - push %gs - - mov $0x10, %ax # 加载内核数据段描述符表, 0x10:内核数据段标识符 - mov %ax, %ds - mov %ax, %es - mov %ax, %fs - mov %ax, %gs - mov %ax, %ss - - push %esp - call irq_handler - add $0x04, %esp # 清除压入的参数 - -forkret_s: - pop %gs - pop %fs - pop %es - pop %ds - popa # Pops edi,esi,ebp... - add $0x08, %esp # 清理压栈的 错误代码 和 ISR 编号 - iret # 出栈 CS, EIP, EFLAGS, SS, ESP diff --git a/src/arch/i386/mm/README.md b/src/arch/i386/mm/README.md deleted file mode 100644 index d14f7af1b..000000000 --- a/src/arch/i386/mm/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# /src/arch/i386/mm - -## 文件说明 - -## 参考资料 - diff --git a/src/arch/i386/mm/gdt.c b/src/arch/i386/mm/gdt.c deleted file mode 100644 index a5dd1d11f..000000000 --- a/src/arch/i386/mm/gdt.c +++ /dev/null @@ -1,46 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// gdt.c for MRNIU/SimpleKernel. - -#include "gdt.h" - -static void tss_set_gate(int32_t num, uint16_t ss0, uint32_t esp0){ - // 获取 TSS 描述符的位置和长度 - uint32_t base = (uint32_t)&tss_entry; - uint32_t limit = base + sizeof(tss_entry); - - // 在 GDT 表中增加 TSS 段描述 - gdt_set_gate(num, base, limit, 0x89, 0x40); - - // 设置内核栈的地址 - tss_entry.ts_ss0 = ss0; - tss_entry.ts_esp0 = esp0; - tss_entry.ts_cs = USER_CS; - tss_entry.ts_ss = USER_DS; - tss_entry.ts_ds = USER_DS; - tss_entry.ts_es = USER_DS; - tss_entry.ts_fs = USER_DS; - tss_entry.ts_gs = USER_DS; -} - -// 初始化全局描述符表 -void gdt_init(void){ - // 全局描述符表界限 从 0 开始,所以总长要 - 1 - gdt_ptr.limit = sizeof(gdt_entry_t) * GDT_LENGTH - 1; - gdt_ptr.base = (uint32_t)&gdt_entries; - - // 采用 Intel 平坦模型 - // 0xC0: 粒度为 4096? - gdt_set_gate(SEG_NULL, 0x0, 0x0, 0x0, 0x0); // Intel 文档要求首个描述符全 0 - gdt_set_gate(SEG_KTEXT, 0x0, 0xFFFFFFFF, KREAD_EXEC, 0xC0); // 内核指令段 - gdt_set_gate(SEG_KDATA, 0x0, 0xFFFFFFFF, KREAD_WRITE, 0xC0); // 内核数据段 - gdt_set_gate(SEG_UTEXT, 0x0, 0xFFFFFFFF, UREAD_EXEC, 0xC0); // 用户模式代码段 - gdt_set_gate(SEG_UDATA, 0x0, 0xFFFFFFFF, UREAD_WRITE, 0xC0); // 用户模式数据段 - tss_set_gate(SEG_TSS, KERNEL_DS, 0); - - // 加载全局描述符表地址到 GDTR 寄存器 - gdt_load((uint32_t)&gdt_ptr); - // 加载任务寄存器 - tss_load(); -} diff --git a/src/arch/i386/mm/gdt.h b/src/arch/i386/mm/gdt.h deleted file mode 100644 index 2df993373..000000000 --- a/src/arch/i386/mm/gdt.h +++ /dev/null @@ -1,131 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on http://wiki.0xffffff.org/posts/hurlex-6.html -// gdt.h for MRNIU/SimpleKernel. - -#ifndef _GDT_H_ -#define _GDT_H_ - -#include "stdint.h" - -#define GDT_LENGTH 6 // 全局描述符表长度 -// 各个内存段所在全局描述符表下标 -#define SEG_NULL 0 -#define SEG_KTEXT 1 -#define SEG_KDATA 2 -#define SEG_UTEXT 3 -#define SEG_UDATA 4 -#define SEG_TSS 5 -#define GD_KTEXT ((SEG_KTEXT) << 3) // 内核代码段 0x08 -#define GD_KDATA ((SEG_KDATA) << 3) // 内核数据段 -#define GD_UTEXT ((SEG_UTEXT) << 3) // 用户代码段 -#define GD_UDATA ((SEG_UDATA) << 3) // 用户数据段 -#define GD_TSS ((SEG_TSS) << 3) // 任务段 -// 段描述符 DPL -#define DPL_KERNEL (0) // 内核级 -#define DPL_USER (3) // 用户级 - -// 各个段的全局描述符表的选择子 -#define KERNEL_CS ((GD_KTEXT) | DPL_KERNEL) -#define KERNEL_DS ((GD_KDATA) | DPL_KERNEL) -#define USER_CS ((GD_UTEXT) | DPL_USER) -#define USER_DS ((GD_UDATA) | DPL_USER) - -// 访问权限 -#define KREAD_EXEC 0x9A -#define KREAD_WRITE 0x92 -#define UREAD_EXEC 0xFA -#define UREAD_WRITE 0xF2 - - -// 全局描述符类型 -typedef - struct gdt_entry_t { - uint16_t limit_low; // 段界限 15~0 - uint16_t base_low; // 段基地址 15~0 - uint8_t base_middle; // 段基地址 23~16 - uint8_t access; // 段存在位、描述符特权级、描述符类型、描述符子类别 - uint8_t granularity; // 其他标志、段界限 19~16 (unsigned limit_high: 4;unsigned flags: 4;) - uint8_t base_high; // 段基地址 31~24 -} __attribute__((packed)) gdt_entry_t; - -// 全局描述符表定义 -static gdt_entry_t gdt_entries[GDT_LENGTH] __attribute__ ((aligned(8))); - -// GDTR -typedef - struct gdt_ptr_t { - uint16_t limit; // 全局描述符表限长 - uint32_t base; // 全局描述符表 32位 基地址 -} __attribute__((packed)) gdt_ptr_t; - -// GDTR -static gdt_ptr_t gdt_ptr; - -/* - TSS 状态段由两部分组成: - 1、 动态部分(处理器在每次任务切换时会设置这些字段值) - 通用寄存器(EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI) - 段寄存器(ES,CS,SS,DS,FS,GS) - 状态寄存器(EFLAGS) - 指令指针(EIP) - 前一个执行的任务的TSS段的选择子(只有当要返回时才更新) - 2、 静态字段(处理器读取,但从不更改) - 任务的LDT选择子 - 页目录基址寄存器(PDBR)(当启用分页时,只读) - 内层堆栈指针,特权级 0-2 - T-位,指示了处理器在任务切换时是否引发一个调试异常 - I/O 位图基址 - */ -// TSS(任务状态段) 描述符 -// TSS的使用是为了解决调用门中特权级变换时堆栈发生的变化. -typedef - struct tss_entry_t { - uint32_t ts_link; // old ts selector - uint32_t ts_esp0; // stack pointers and segment selectors - uint32_t ts_ss0; // after an increase in privilege level - uint32_t ts_esp1; - uint32_t ts_ss1; - uint32_t ts_esp2; - uint32_t ts_ss2; - uint32_t ts_cr3; // page directory base - uint32_t ts_eip; // saved state from last task switch - uint32_t ts_eflags; - uint32_t ts_eax; // more saved state (registers) - uint32_t ts_ecx; - uint32_t ts_edx; - uint32_t ts_ebx; - uint32_t ts_esp; - uint32_t ts_ebp; - uint32_t ts_esi; - uint32_t ts_edi; - uint32_t ts_es; // even more saved state (segment selectors) - uint32_t ts_cs; - uint32_t ts_ss; - uint32_t ts_ds; - uint32_t ts_fs; - uint32_t ts_gs; - uint32_t ts_ldt; - uint32_t ts_t; // trap on task switch - uint32_t ts_iomb; // i/o map base address -} __attribute__((packed)) tss_entry_t; - -// TSS 段定义 -static tss_entry_t tss_entry __attribute__ ((aligned(8))); - -// 全局描述符表构造函数,根据下标构造 -// 参数: num-数组下标、base-基地址、limit-限长、access-访问标志,gran-粒度 -static void gdt_set_gate(int32_t num, uint32_t base, uint32_t limit, uint8_t access, uint8_t gran){ - gdt_entries[num].base_low = (base & 0xFFFF); - gdt_entries[num].base_middle = (base >> 16) & 0xFF; - gdt_entries[num].base_high = (base >> 24) & 0xFF; - gdt_entries[num].limit_low = (limit & 0xFFFF); - gdt_entries[num].granularity = (limit >> 16) & 0x0F; - gdt_entries[num].granularity |= gran & 0xF0; - gdt_entries[num].access = access; -} - -extern void gdt_load(); // GDT 加载到 GDTR 的函数 -extern void tss_load(); // TSS 刷新[汇编实现] -void gdt_init(void); // 初始化全局描述符表 -#endif diff --git a/src/arch/i386/mm/gdt_s.s b/src/arch/i386/mm/gdt_s.s deleted file mode 100644 index 7d246b014..000000000 --- a/src/arch/i386/mm/gdt_s.s +++ /dev/null @@ -1,29 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# gdt.s for MRNIU/SimpleKernel. - -.global gdt_load - -gdt_load: - mov 4(%esp), %eax #参数存入 eax 寄存器 - lgdt (%eax) # 加载到 GDTR [修改原先GRUB设置] - - mov $0x10, %ax # 加载数据段描述符 - mov %ax, %ds # 更新所有可以更新的段寄存器 - mov %ax, %es - mov %ax, %fs - mov %ax, %gs - mov %ax, %ss - jmp $0x08, $flush # 远跳转,0x08是代码段描述符 - # 远跳目的是清空流水线并串行化处理器 - -flush: - ret - -.global tss_load # TSS 刷新 - -tss_load: - mov $0x28, %ax # TSS 在全局描述符表里是第 5 个故而 00101000B 即就是 0x28 - ltr %ax # 加载到 TR 寄存器 - ret diff --git a/src/arch/ia32/CMakeLists.txt b/src/arch/ia32/CMakeLists.txt new file mode 100644 index 000000000..49e2c1707 --- /dev/null +++ b/src/arch/ia32/CMakeLists.txt @@ -0,0 +1,62 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 架构相关子模块的编译规则 + +# 设置子模块名与使用的语言 +PROJECT(arch CXX ASM) + +# 根据 SimpleKernelArch 判断添加哪些文件 +# 32 位 +if (${SimpleKernelArch} STREQUAL "ia32/i386") + # 寻找汇编文件 + find_asm_source_files(boot_asm_src ${arch_SOURCE_DIR}/i386/boot) + # 添加到 boot_src + set(boot_src ${boot_asm_src}) + + find_asm_source_files(gdt_asm_src ${arch_SOURCE_DIR}/i386/gdt) + aux_source_directory(${arch_SOURCE_DIR}/i386/gdt gdt_cpp_src) + set(gdt_src ${gdt_asm_src} ${gdt_cpp_src}) + + find_asm_source_files(intr_asm_src ${arch_SOURCE_DIR}/i386/intr) + aux_source_directory(${arch_SOURCE_DIR}/i386/intr intr_cpp_src) + set(intr_src ${intr_asm_src} ${intr_cpp_src}) + + # 64 位 +elseif (${SimpleKernelArch} STREQUAL "ia32/x86_64") + # 寻找汇编文件 + find_asm_source_files(boot_asm_src ${arch_SOURCE_DIR}/x86_64/boot) + # 添加到 boot_src + set(boot_src ${boot_asm_src}) + + find_asm_source_files(gdt_asm_src ${arch_SOURCE_DIR}/x86_64/gdt) + aux_source_directory(${arch_SOURCE_DIR}/x86_64/gdt gdt_cpp_src) + set(gdt_src ${gdt_asm_src} ${gdt_cpp_src}) + + find_asm_source_files(intr_asm_src ${arch_SOURCE_DIR}/x86_64/intr) + aux_source_directory(${arch_SOURCE_DIR}/x86_64/intr intr_cpp_src) + set(intr_src ${intr_asm_src} ${intr_cpp_src}) +endif () + +# 寻找 CXX 文件 +aux_source_directory(${arch_SOURCE_DIR}/port port_cpp_src) +# 添加到 port_src +set(port_src ${port_cpp_src}) + +aux_source_directory(${arch_SOURCE_DIR}/apic apic_cpp_src) +set(apic_src ${apic_cpp_src}) + +# 设置子模块所有的源码 +set(arch_src ${boot_src} ${port_src} ${gdt_src} ${intr_src} ${apic_src}) + +# 添加子模块 +add_library(${PROJECT_NAME} OBJECT ${arch_src}) + +# 添加头文件搜索路径 +target_include_arch_header_files(${PROJECT_NAME}) +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) +target_include_drv_header_files(${PROJECT_NAME}) diff --git a/src/arch/ia32/apic/apic.cpp b/src/arch/ia32/apic/apic.cpp new file mode 100644 index 000000000..41fbf84f9 --- /dev/null +++ b/src/arch/ia32/apic/apic.cpp @@ -0,0 +1,39 @@ + +/** + * @file apic.cpp + * @brief APIC 抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "apic.h" +#include "cstdio" +#include "intr.h" + +// 64-ia-32-architectures-software-developer-vol-3a-manual#10 + +/// @todo 完善,加入内核 +APIC::APIC(void) { + return; +} + +APIC::~APIC(void) { + return; +} + +/// @see 64-ia-32-architectures-software-developer-vol-3a-manual#10.4.3 + +int32_t APIC::init(void) { + LOCAL_APIC::init(); + IO_APIC::init(); + info("apic init.\n"); + return 0; +} diff --git a/src/arch/ia32/apic/include/apic.h b/src/arch/ia32/apic/include/apic.h new file mode 100644 index 000000000..e5dc5e87c --- /dev/null +++ b/src/arch/ia32/apic/include/apic.h @@ -0,0 +1,66 @@ + +/** + * @file apic.h + * @brief APIC 抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef _APIC_H_ +#define _APIC_H_ + +#include "cstdint" + +/** + * @brief APIC 抽象 + */ +class APIC { +private: + +protected: + +public: + APIC(void); + ~APIC(void); + static int32_t init(void); +}; + +/** + * @brief 本地 APIC + */ +class LOCAL_APIC { +private: + +protected: + +public: + LOCAL_APIC(void); + ~LOCAL_APIC(void); + static int32_t init(void); +}; + +/** + * @brief IO APIC + */ +class IO_APIC { +private: + +protected: + +public: + IO_APIC(void); + ~IO_APIC(void); + static int32_t init(void); +}; + +static APIC apic; + +#endif /* _APIC_H_ */ diff --git a/src/arch/ia32/apic/io_apic.cpp b/src/arch/ia32/apic/io_apic.cpp new file mode 100644 index 000000000..a96e5df37 --- /dev/null +++ b/src/arch/ia32/apic/io_apic.cpp @@ -0,0 +1,34 @@ + +/** + * @file io_apic.cpp + * @brief IOAPIC 抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "apic.h" +#include "cpu.hpp" +#include "intr.h" + +/// @todo + +IO_APIC::IO_APIC(void) { + return; +} + +IO_APIC::~IO_APIC(void) { + return; +} + +int32_t IO_APIC::init(void) { + info("io apic init.\n"); + return 0; +} \ No newline at end of file diff --git a/src/arch/ia32/apic/local_apic.cpp b/src/arch/ia32/apic/local_apic.cpp new file mode 100644 index 000000000..5c8923409 --- /dev/null +++ b/src/arch/ia32/apic/local_apic.cpp @@ -0,0 +1,71 @@ + +/** + * @file loacl_apic.cpp + * @brief loacl APIC 抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "apic.h" +#include "cpu.hpp" +#include "cstdio" +#include "intr.h" + +/// @see 64-ia-32-architectures-software-developer-vol-3a-manual#10 + +/// @todo 完善,加入内核 +LOCAL_APIC::LOCAL_APIC(void) { + return; +} + +LOCAL_APIC::~LOCAL_APIC(void) { + return; +} + +/// @see 64-ia-32-architectures-software-developer-vol-3a-manual#10.4.3 + +int32_t LOCAL_APIC::init(void) { + // 先判断 cpu 是否支持 + CPU::CPUID cpuid; + if (cpuid.xapic() == false) { + warn("Not support LOCAL_APIC&xAPIC.\n"); + } + if (cpuid.x2apic() == false) { + warn("Not support x2APIC.\n"); + } + uint64_t msr = CPU::READ_MSR(CPU::IA32_APIC_BASE); + // 开启 xAPIC 与 x2APIC + msr |= (CPU::IA32_APIC_BASE_GLOBAL_ENABLE_BIT + | CPU::IA32_APIC_BASE_X2APIC_ENABLE_BIT); + CPU::WRITE_MSR(CPU::IA32_APIC_BASE, msr); + // 设置 SIVR + msr = CPU::READ_MSR(CPU::IA32_X2APIC_SIVR); + if (cpuid.eoi() == true) { + msr |= CPU::IA32_X2APIC_SIVR_EOI_ENABLE_BIT; + } + msr |= CPU::IA32_X2APIC_SIVR_APIC_ENABLE_BIT; + CPU::WRITE_MSR(CPU::IA32_X2APIC_SIVR, msr); + + // 屏蔽所有 LVT + msr = 0; + msr |= CPU::IA32_X2APIC_LVT_MASK_BIT; + msr = 0x10000; + CPU::WRITE_MSR(CPU::IA32_X2APIC_CMCI, msr); + CPU::WRITE_MSR(CPU::IA32_X2APIC_LVT_TIMER, msr); + CPU::WRITE_MSR(CPU::IA32_X2APIC_LVT_THERMAL, msr); + CPU::WRITE_MSR(CPU::IA32_X2APIC_LVT_PMI, msr); + CPU::WRITE_MSR(CPU::IA32_X2APIC_LVT_LINT0, msr); + CPU::WRITE_MSR(CPU::IA32_X2APIC_LVT_LINT1, msr); + CPU::WRITE_MSR(CPU::IA32_X2APIC_LVT_ERROR, msr); + + info("local apic init.\n"); + return 0; +} diff --git a/src/arch/ia32/cpu.hpp b/src/arch/ia32/cpu.hpp new file mode 100644 index 000000000..395848f1a --- /dev/null +++ b/src/arch/ia32/cpu.hpp @@ -0,0 +1,555 @@ + +/** + * @file cpu.hpp + * @brief cpu 相关定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_CPU_HPP +#define SIMPLEKERNEL_CPU_HPP + +#include "cstdbool" +#include "cstdint" +#include "cstdio" +#include "cstring" + +/** + * @brief cpu 相关 + * @todo CPUID 相关操作,补全寄存器操作,数据地址等 + */ +namespace CPU { +// CR0:包含当前处理器运行的控制标志。 +// CR1:保留。 +// CR2:包含发生页面错误时的线性地址。 +// CR3:页面目录表(Page Directory Table)的物理地址。 +// 虚拟地址启用且CR0中PG位设置为1的情况下,CR3可以协助处理器将线性地址转换为物理地址。一般情况下为MMU提供页表的入口实现。 +// CR4:包含处理器扩展功能的标志位。 +// CR8:提供对任务优先级寄存器(Task Priority +// Register)的读写(仅在64位模式下存在)。 对控制寄存器的读写是通过MOV +// CRn指令来实现 + +/// PE:CR0的位0是启用保护(Protection +// Enable)标志。当设置该位时即开启了保护模式; +// 当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。 +static constexpr const uint32_t CR0_PE = 0x00000001; +static constexpr const uint32_t CR0_MP = 0x00000002; +static constexpr const uint32_t CR0_EM = 0x00000004; +static constexpr const uint32_t CR0_TS = 0x00000008; +static constexpr const uint32_t CR0_ET = 0x00000010; + +/// NE:对于 Intel 80486或以上的CPU,CR0 的位5是协处理器错误(Numeric +// Error)标志。 当设置该标志时,就启用了 x87 +// 协处理器错误的内部报告机制;若复位该标志,那么就使用 PC 形式的 x87 +// 协处理器错误报告机制。 当NE为复位状态并且 CPU 的 IGNNE +// 输入引脚有信号时,那么数学协处理器 x87 错误将被忽略。 当NE为复位状态并且 +// CPU 的 IGNNE 输入引脚无信号时,那么非屏蔽的数学协处理器 x87 +// 错误将导致处理器通过 FERR 引脚在外部产生一个中断, +// 并且在执行下一个等待形式浮点指令或 WAIT/FWAIT 指令之前立刻停止指令执行。 +// CPU 的 FERR 引脚用于仿真外部协处理器 80387 的 ERROR 引脚, +// 因此通常连接到中断控制器输入请求引脚上。NE 标志、IGNNE 引脚和 FERR +// 引脚用于利用外部逻辑来实现 PC 形式的外部错误报告机制。 +static constexpr const uint32_t CR0_NE = 0x00000020; + +/// WP:对于Intel 80486或以上的CPU,CR0的位16是写保护(Write +/// Proctect)标志。 +// 当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。该标志有利于UNIX类操作系统在创建进程时实现写时复制(Copy +// on Write)技术。 +static constexpr const uint32_t CR0_WP = 0x00010020; +static constexpr const uint32_t CR0_AM = 0x00040020; +static constexpr const uint32_t CR0_NW = 0x20000000; +static constexpr const uint32_t CR0_CD = 0x40000000; + +/// PG:CR0的位31是分页(Paging)标志。当设置该位时即开启了分页机制; +// 当复位时则禁止分页机制,此时所有线性地址等同于物理地址。在开启这个标志之前必须已经或者同时开启PE标志。即若要启用分页机制,那么PE和PG标志都要置位。 +static constexpr const uint32_t CR0_PG = 0x80000000; + +/// 启用保护模式PE(Protected +// Enable)位(位0)和开启分页PG(Paging)位(位31)分别用于控制分段和分页机制。 +// PE用于控制分段机制。如果PE=1,处理器就工作在开启分段机制环境下,即运行在保护模式下。 +// 如果PE=0,则处理器关闭了分段机制,并如同8086工作于实地址模式下。PG用于控制分页机制。如果PG=1,则开启了分页机制。 +// 如果PG=0,分页机制被禁止,此时线性地址被直接作为物理地址使用。 +// 如果PE=0、PG=0,处理器工作在实地址模式下;如果PG=0、PE=1,处理器工作在没有开启分页机制的保护模式下; +// 如果PG=1、PE=0,此时由于不在保护模式下不能启用分页机制,因此处理器会产生一个一般保护异常,即这种标志组合无效; +// 如果PG=1、PE=1,则处理器工作在开启了分页机制的保护模式下。 + +static constexpr const uint32_t CR3_PWT = 0x00000008; +static constexpr const uint32_t CR3_PCD = 0x00000010; + +static constexpr const uint32_t CR4_VME = 0x00000001; +static constexpr const uint32_t CR4_PVI = 0x00000002; +static constexpr const uint32_t CR4_TSD = 0x00000004; +static constexpr const uint32_t CR4_DE = 0x00000008; +// PSE 为 1 时,32bits 的页面大小变为 4MB +// 32bits 模式的分页模式支持物理地址宽度超过 +// 32bit,这种情况下的页面大小必须是 4MB,并且处理器必须支持 PSE-3 +static constexpr const uint32_t CR4_PSE = 0x00000010; +// 物理地址拓展 +// 32bits 下寻址变为三级 +static constexpr const uint32_t CR4_PAE = 0x00000020; +static constexpr const uint32_t CR4_MCE = 0x00000040; +static constexpr const uint32_t CR4_PGE = 0x00000080; +static constexpr const uint32_t CR4_PCE = 0x00000100; +static constexpr const uint32_t CR4_OSFXSR = 0x00000200; +static constexpr const uint32_t CR4_OSXMMEXCPT = 0x00000400; +static constexpr const uint32_t CR4_VMXE = 0x00002000; +static constexpr const uint32_t CR4_SMXE = 0x00004000; +static constexpr const uint32_t CR4_PCIDE = 0x00020000; +static constexpr const uint32_t CR4_OSXSAVE = 0x00040000; +static constexpr const uint32_t CR4_SMEP = 0x00100000; + +static constexpr const uint32_t IA32_APIC_BASE = 0x1B; +static constexpr const uint32_t IA32_APIC_BASE_BSP_BIT = 1 << 8; +static constexpr const uint32_t IA32_APIC_BASE_X2APIC_ENABLE_BIT = 1 << 10; +static constexpr const uint32_t IA32_APIC_BASE_GLOBAL_ENABLE_BIT = 1 << 11; + +// x2APIC ID Register (R/O) +static constexpr const uint32_t IA32_X2APIC_APICID = 0x802; +// x2APIC Version Register (R/O) +static constexpr const uint32_t IA32_X2APIC_VERSION = 0x803; +// Support for EOI-broadcast suppression +static constexpr const uint32_t IA32_X2APIC_VERSION_EOI_SUPPORT_BIT = 1 << 24; +// x2APIC Task Priority Register (R/W) +static constexpr const uint32_t IA32_X2APIC_TPR = 0x808; +// x2APIC Processor Priority Register (R/O) +static constexpr const uint32_t IA32_X2APIC_PPR = 0x80A; +// x2APIC EOI Register (W/O) +static constexpr const uint32_t IA32_X2APIC_EOI = 0x80B; +// x2APIC Logical Destination Register (R/O) +static constexpr const uint32_t IA32_X2APIC_LDR = 0x80D; +// x2APIC Spurious Interrupt Vector Register (R/W) +static constexpr const uint32_t IA32_X2APIC_SIVR = 0x80F; +// 伪中断向量号 +static constexpr const uint32_t IA32_X2APIC_SIVR_NO_BIT = 0x0; +// APIC 软件使能 1:enable +static constexpr const uint32_t IA32_X2APIC_SIVR_APIC_ENABLE_BIT = 1 << 8; +// 焦点处理器 0:disable +static constexpr const uint32_t IA32_X2APIC_SIVR_FOCUS_ENABLE_BIT = 1 << 9; +// 禁止广播 EOI 消息使能 1:enable +static constexpr const uint32_t IA32_X2APIC_SIVR_EOI_ENABLE_BIT = 1 << 12; +// x2APIC In-Service Register Bits 31:0 (R/O) +static constexpr const uint32_t IA32_X2APIC_ISR0 = 0x810; +static constexpr const uint32_t IA32_X2APIC_ISR1 = 0x811; +static constexpr const uint32_t IA32_X2APIC_ISR2 = 0x812; +static constexpr const uint32_t IA32_X2APIC_ISR3 = 0x813; +static constexpr const uint32_t IA32_X2APIC_ISR4 = 0x814; +static constexpr const uint32_t IA32_X2APIC_ISR5 = 0x815; +static constexpr const uint32_t IA32_X2APIC_ISR6 = 0x816; +// x2APIC In-Service Register Bits 255:224 (R/O) +static constexpr const uint32_t IA32_X2APIC_ISR7 = 0x817; +// x2APIC Trigger Mode Register Bits 31:0 (R/O) +static constexpr const uint32_t IA32_X2APIC_TMR0 = 0x818; +static constexpr const uint32_t IA32_X2APIC_TMR1 = 0x819; +static constexpr const uint32_t IA32_X2APIC_TMR2 = 0x81A; +static constexpr const uint32_t IA32_X2APIC_TMR3 = 0x81B; +static constexpr const uint32_t IA32_X2APIC_TMR4 = 0x81C; +static constexpr const uint32_t IA32_X2APIC_TMR5 = 0x81D; +static constexpr const uint32_t IA32_X2APIC_TMR6 = 0x81E; +// x2APIC Trigger Mode Register Bits 255:224 (R/O) +static constexpr const uint32_t IA32_X2APIC_TMR7 = 0x81F; +// x2APIC Interrupt Request Register Bits 31:0 (R/O) +static constexpr const uint32_t IA32_X2APIC_IRR0 = 0x820; +static constexpr const uint32_t IA32_X2APIC_IRR1 = 0x821; +static constexpr const uint32_t IA32_X2APIC_IRR2 = 0x822; +static constexpr const uint32_t IA32_X2APIC_IRR3 = 0x823; +static constexpr const uint32_t IA32_X2APIC_IRR4 = 0x824; +static constexpr const uint32_t IA32_X2APIC_IRR5 = 0x825; +static constexpr const uint32_t IA32_X2APIC_IRR6 = 0x826; +// x2APIC Interrupt Request Register Bits 255:224 (R/O) +static constexpr const uint32_t IA32_X2APIC_IRR7 = 0x827; +// x2APIC Error Status Register (R/W) +static constexpr const uint32_t IA32_X2APIC_ESR = 0x828; +// x2APIC LVT Corrected Machine Check Interrupt Register (R/W) +static constexpr const uint32_t IA32_X2APIC_CMCI = 0x82F; +// x2APIC Interrupt Command Register (R/W) +static constexpr const uint32_t IA32_X2APIC_ICR = 0x830; +// x2APIC LVT Timer Interrupt Register (R/W) +static constexpr const uint32_t IA32_X2APIC_LVT_TIMER = 0x832; +// x2APIC LVT Thermal Sensor Interrupt Register (R/W) +static constexpr const uint32_t IA32_X2APIC_LVT_THERMAL = 0x833; +// x2APIC LVT Performance Monitor Interrupt Register (R/W) +static constexpr const uint32_t IA32_X2APIC_LVT_PMI = 0x834; +// x2APIC LVT LINT0 Register (R/W) +static constexpr const uint32_t IA32_X2APIC_LVT_LINT0 = 0x835; +// x2APIC LVT LINT1 Register (R/W) +static constexpr const uint32_t IA32_X2APIC_LVT_LINT1 = 0x836; +// x2APIC LVT Error Register (R/W) +static constexpr const uint32_t IA32_X2APIC_LVT_ERROR = 0x837; +// Bits 0-7 The vector number +static constexpr const uint32_t IA32_X2APIC_LVT_NO_BIT = 0x0; +// Bits 8-11 (reserved for timer) 100b if NMI +static constexpr const uint32_t IA32_X2APIC_LVT_NMI_BIT = 1 << 8; +// Bit 12 Set if interrupt pending. +static constexpr const uint32_t IA32_X2APIC_LVT_PENDING_BIT = 1 << 12; +// Bit 13 (reserved for timer) Polarity, set is low triggered +static constexpr const uint32_t IA32_X2APIC_LVT_POLAR_BIT = 1 << 13; +// Bit 14 (reserved for timer) Remote IRR +static constexpr const uint32_t IA32_X2APIC_LVT_REMOTE_IRR_BIT = 1 << 14; +// Bit 15 (reserved for timer) trigger mode, set is level triggered +static constexpr const uint32_t IA32_X2APIC_LVT_TRIGGER_BIT = 1 << 15; +// Bit 16 Set to mask +static constexpr const uint32_t IA32_X2APIC_LVT_MASK_BIT = 1 << 16; +// Bits 17-31 Reserved + +// x2APIC Initial Count Register(R/W) +static constexpr const uint32_t IA32_X2APIC_TIMER_INIT_COUNT = 0x838; +// x2APIC Current Count Register (R/O) +static constexpr const uint32_t IA32_X2APIC_TIMER_CUR_COUNT = 0x839; +// x2APIC Divide Configuration Register (R/W) +static constexpr const uint32_t IA32_X2APIC_DIV_CONF = 0x83E; +// x2APIC Self IPI Register (W/O) +static constexpr const uint32_t IA32_X2APIC_SELF_IPI = 0x83F; + +// 段描述符 DPL +/// 内核级 +static constexpr const uint32_t DPL0 = 0x00; +static constexpr const uint32_t DPL1 = 0x01; +static constexpr const uint32_t DPL2 = 0x02; +/// 用户级 +static constexpr const uint32_t DPL3 = 0x03; + +/** + * @brief 执行CPU空操作 + */ +inline static void hlt(void) { + __asm__ volatile("hlt"); + return; +} + +/** + * @brief 开启中断 + */ +inline static void ENABLE_INTR(void) { + __asm__ volatile("sti" ::: "memory"); + return; +} + +/** + * @brief 关闭中断 + */ +inline static void DISABLE_INTR(void) { + __asm__ volatile("cli" ::: "memory"); + return; +} + +/** + * @brief 触发 debug 中断 + */ +inline static void debug_intr(void) { + __asm__ volatile("int $0x01"); + return; +} + +/** + * @brief 读取 EFLAGS + * @return uint32_t eflags 值 + */ +inline static uint32_t READ_EFLAGS(void) { + uint32_t eflags; + __asm__ volatile("pushf\n\t" + "pop %0\n\t" + : "=r"(eflags)); + return eflags; +} + +/** + * @brief 读取 CR0 + * @return uint32_t CR0 值 + */ +inline static uint32_t READ_CR0(void) { + uint32_t cr0; + __asm__ volatile("mov %%cr0, %0" : "=b"(cr0)); + return cr0; +} + +/** + * @brief 读取 CR2 + * @return uint32_t CR2 值 + */ +inline static uint32_t READ_CR2(void) { + uint32_t cr2; + __asm__ volatile("mov %%cr2, %0" : "=b"(cr2)); + return cr2; +} + +/** + * @brief 设置 页目录 + * @param _pgd 要设置的页表 + * @return true 成功 + * @return false 失败 + */ +inline static bool SET_PGD(uintptr_t _pgd) { + __asm__ volatile("mov %0, %%cr3" : : "r"(_pgd)); + return true; +} + +/** + * @brief 获取页目录 CR3 + * @return uintptr_t CR3 值 + */ +inline static uintptr_t GET_PGD(void) { + uintptr_t cr3; + __asm__ volatile("mov %%cr3, %0" : "=b"(cr3)); + return cr3; +} + +/** + * @brief 切换内核栈 + * @param _stack_top 要切换的栈顶地址 + */ +inline static void switch_stack(void* _stack_top) { + asm("mov %0, %%esp" : : "r"(_stack_top)); + asm("xor %%ebp, %%ebp" : :); + return; +} + +/** + * @brief 读取 CR4 + * @return uint32_t CR4 值 + */ +inline static uint32_t READ_CR4(void) { + uint32_t cr4; + __asm__ volatile("mov %%cr4, %0" : "=b"(cr4)); + return cr4; +} + +/** + * @brief 刷新页表缓存 + * @param _addr 要刷新的地址 + */ +inline static void VMM_FLUSH(uintptr_t _addr) { + __asm__ volatile("invlpg (%0)" : : "r"(_addr) : "memory"); + return; +} + +// 开启 PG +inline static bool ENABLE_PG(void) { + uintptr_t cr0 = 0; + __asm__ volatile("mov %%cr0, %0" : "=r"(cr0)); + // 最高位 PG 位置 1,分页开启 + cr0 |= (1u << 31); + __asm__ volatile("mov %0, %%cr0" : : "r"(cr0)); + info("paging enabled.\n"); + return true; +} + +/** + * @brief 页表结构 32 位分页 + * @note Use of CR3 with 32-Bit Paging + */ +class cr3_t { +public: + // Ignored + uint32_t ignore1 : 3; + // Page-level write-through; indirectly determines the memory type + // used to access the page directory during linear-address + // translation + uint32_t pwt : 1; + // Page-level cache disable; indirectly determines the memory type + // used to access the page directory during linear-address + // translation + uint32_t pcd : 1; + // Ignored + uint32_t ignore2 : 7; + // Physical address of the 4-KByte aligned page directory used for + // linear-address translation + uint32_t addr : 20; +}; + +/** + * @brief 读 MSR + * @param _idx 要读的索引 + * @return uint64_t 读取的值 + */ +inline static uint64_t READ_MSR(uint32_t _idx) { + uint32_t low; + uint32_t high; + __asm__ volatile("rdmsr" : "=a"(low), "=d"(high) : "c"(_idx)); + return ((uint64_t)high << 32) | low; +} + +/** + * @brief 写 MSR + * @param _idx 要写的索引 + * @param _msr 要写的值 + */ +inline static void WRITE_MSR(uint32_t _idx, uint64_t _msr) { + uint32_t low = _msr; + uint32_t high = _msr >> 32; + __asm__ volatile("wrmsr" : : "a"(low), "d"(high), "c"(_idx)); + return; +} + +/// @todo 改为 static +class CPUID { +private: + static constexpr const uint32_t VENDOR_LEN = 16; + static constexpr const uint32_t BRAND_LEN = 50; + static constexpr const uint32_t FAMILY_LEN = 50; + static constexpr const uint32_t MODEL_LEN = 50; + // Vendor-strings. + static constexpr const char* VENDOR_OLDAMD = "AMDisbetter!"; + // early engineering samples of AMD K5 processor + static constexpr const char* VENDOR_AMD = "AuthenticAMD"; + static constexpr const char* VENDOR_INTEL = "GenuineIntel"; + static constexpr const char* VENDOR_Centaur = "CentaurHauls"; + static constexpr const char* VENDOR_OLDTRANSMETA = "TransmetaCPU"; + static constexpr const char* VENDOR_TRANSMETA = "GenuineTMx86"; + static constexpr const char* VENDOR_CYRIX = "CyrixInstead"; + static constexpr const char* VENDOR_CENTAUR = "CentaurHauls"; + static constexpr const char* VENDOR_NEXGEN = "NexGenDriven"; + static constexpr const char* VENDOR_UMC = "UMC UMC UMC "; + static constexpr const char* VENDOR_SIS = "SiS SiS SiS "; + static constexpr const char* VENDOR_NSC = "Geode by NSC"; + static constexpr const char* VENDOR_RISE = "RiseRiseRise"; + static constexpr const char* VENDOR_VORTEX = "Vortex86 SoC"; + static constexpr const char* VENDOR_VIA = "VIA VIA VIA "; + // Vendor-strings from Virtual Machines. + static constexpr const char* VENDOR_VMWARE = "VMwareVMware"; + static constexpr const char* VENDOR_XENHVM = "XenVMMXenVMM"; + static constexpr const char* VENDOR_MICROSOFT_HV = "Microsoft Hv"; + static constexpr const char* VENDOR_PARALLELS = " lrpepyh vr"; + + static constexpr const uint32_t FEAT_ECX_SSE3 = 1 << 0; + static constexpr const uint32_t FEAT_ECX_PCLMUL = 1 << 1; + static constexpr const uint32_t FEAT_ECX_DTES64 = 1 << 2; + static constexpr const uint32_t FEAT_ECX_MONITOR = 1 << 3; + static constexpr const uint32_t FEAT_ECX_DS_CPL = 1 << 4; + static constexpr const uint32_t FEAT_ECX_VMX = 1 << 5; + static constexpr const uint32_t FEAT_ECX_SMX = 1 << 6; + static constexpr const uint32_t FEAT_ECX_EST = 1 << 7; + static constexpr const uint32_t FEAT_ECX_TM2 = 1 << 8; + static constexpr const uint32_t FEAT_ECX_SSSE3 = 1 << 9; + static constexpr const uint32_t FEAT_ECX_CID = 1 << 10; + static constexpr const uint32_t FEAT_ECX_FMA = 1 << 12; + static constexpr const uint32_t FEAT_ECX_CX16 = 1 << 13; + static constexpr const uint32_t FEAT_ECX_ETPRD = 1 << 14; + static constexpr const uint32_t FEAT_ECX_PDCM = 1 << 15; + static constexpr const uint32_t FEAT_ECX_PCIDE = 1 << 17; + static constexpr const uint32_t FEAT_ECX_DCA = 1 << 18; + static constexpr const uint32_t FEAT_ECX_SSE4_1 = 1 << 19; + static constexpr const uint32_t FEAT_ECX_SSE4_2 = 1 << 20; + static constexpr const uint32_t FEAT_ECX_x2APIC = 1 << 21; + static constexpr const uint32_t FEAT_ECX_MOVBE = 1 << 22; + static constexpr const uint32_t FEAT_ECX_POPCNT = 1 << 23; + static constexpr const uint32_t FEAT_ECX_AES = 1 << 25; + static constexpr const uint32_t FEAT_ECX_XSAVE = 1 << 26; + static constexpr const uint32_t FEAT_ECX_OSXSAVE = 1 << 27; + static constexpr const uint32_t FEAT_ECX_AVX = 1 << 28; + static constexpr const uint32_t FEAT_EDX_FPU = 1 << 0; + static constexpr const uint32_t FEAT_EDX_VME = 1 << 1; + static constexpr const uint32_t FEAT_EDX_DE = 1 << 2; + static constexpr const uint32_t FEAT_EDX_PSE = 1 << 3; + static constexpr const uint32_t FEAT_EDX_TSC = 1 << 4; + static constexpr const uint32_t FEAT_EDX_MSR = 1 << 5; + static constexpr const uint32_t FEAT_EDX_PAE = 1 << 6; + static constexpr const uint32_t FEAT_EDX_MCE = 1 << 7; + static constexpr const uint32_t FEAT_EDX_CX8 = 1 << 8; + static constexpr const uint32_t FEAT_EDX_APIC = 1 << 9; + static constexpr const uint32_t FEAT_EDX_SEP = 1 << 11; + static constexpr const uint32_t FEAT_EDX_MTRR = 1 << 12; + static constexpr const uint32_t FEAT_EDX_PGE = 1 << 13; + static constexpr const uint32_t FEAT_EDX_MCA = 1 << 14; + static constexpr const uint32_t FEAT_EDX_CMOV = 1 << 15; + static constexpr const uint32_t FEAT_EDX_PAT = 1 << 16; + static constexpr const uint32_t FEAT_EDX_PSE36 = 1 << 17; + static constexpr const uint32_t FEAT_EDX_PSN = 1 << 18; + static constexpr const uint32_t FEAT_EDX_CLF = 1 << 19; + static constexpr const uint32_t FEAT_EDX_DTES = 1 << 21; + static constexpr const uint32_t FEAT_EDX_ACPI = 1 << 22; + static constexpr const uint32_t FEAT_EDX_MMX = 1 << 23; + static constexpr const uint32_t FEAT_EDX_FXSR = 1 << 24; + static constexpr const uint32_t FEAT_EDX_SSE = 1 << 25; + static constexpr const uint32_t FEAT_EDX_SSE2 = 1 << 26; + static constexpr const uint32_t FEAT_EDX_SS = 1 << 27; + static constexpr const uint32_t FEAT_EDX_HTT = 1 << 28; + static constexpr const uint32_t FEAT_EDX_TM1 = 1 << 29; + static constexpr const uint32_t FEAT_EDX_IA64 = 1 << 30; + static constexpr const uint32_t FEAT_EDX_PBE = 1 << 31; + + enum : uint32_t { + GET_VENDOR = 0x00, + GET_FEATURES, + GET_TLB, + GET_SERIAL, + INTEL_EXTENDED = 0x80000000, + INTEL_FEATURES, + INTEL_BRANDSTRING, + INTEL_BRANDSTRINGMORE, + INTEL_BRANDSTRINGEND, + }; + + // TODO: 获取字符串信息 + char vendor[VENDOR_LEN]; + char brand[BRAND_LEN]; + char family_name[FAMILY_LEN]; + char model_name[MODEL_LEN]; + // 系列 + uint32_t family; + // 型号 + uint32_t model; + // 类型 + uint32_t type; + // 频率 + uint32_t stepping; + // cpu 基本信息 + uint32_t max_cpuid; + // cpu 拓展信息 + uint32_t max_cpuidex; + + void cpuid(uint32_t Mop, uint32_t Sop, uint32_t* eax, uint32_t* ebx, + uint32_t* ecx, uint32_t* edx) { + __asm__ volatile("cpuid" + : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) + : "0"(Mop), "2"(Sop)); + } + +public: + CPUID(void) { + uint32_t eax, ebx, ecx, edx; + // 获取 vendor ID 与基本信息 + cpuid(GET_VENDOR, 0, &eax, &ebx, &ecx, &edx); + max_cpuid = eax; + memcpy(vendor, &ebx, 4); + memcpy(vendor + 4, &edx, 4); + memcpy(vendor + 8, &ecx, 4); + vendor[12] = '\0'; + // 获取拓展信息 + cpuid(INTEL_EXTENDED, 0, &eax, &ebx, &ecx, &edx); + max_cpuidex = eax; + return; + } + + ~CPUID(void) { + return; + } + + bool xapic(void) { + uint32_t eax, ebx, ecx, edx; + cpuid(GET_FEATURES, 0, &eax, &ebx, &ecx, &edx); + return edx & FEAT_EDX_APIC; + } + + bool x2apic(void) { + uint32_t eax, ebx, ecx, edx; + cpuid(GET_FEATURES, 0, &eax, &ebx, &ecx, &edx); + return ecx & FEAT_ECX_x2APIC; + } + + bool eoi(void) { + uint64_t version = READ_MSR(IA32_X2APIC_VERSION); + return version & IA32_X2APIC_SIVR_EOI_ENABLE_BIT; + } +}; + +}; // namespace CPU + +#endif /* SIMPLEKERNEL_CPU_HPP */ diff --git a/src/arch/ia32/e820.h b/src/arch/ia32/e820.h new file mode 100644 index 000000000..50d6dc537 --- /dev/null +++ b/src/arch/ia32/e820.h @@ -0,0 +1,63 @@ + +/** + * @file e820.h + * @brief e820 相关定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_E820_H +#define SIMPLEKERNEL_E820_H + +#include "cstddef" +#include "cstdint" + +/// 最大数量 +static constexpr const uint32_t E820_MAX = 8; +/// RAM 标记 +static constexpr const uint32_t E820_RAM = 1; +/// 保留 标记 +static constexpr const uint32_t E820_RESERVED = 2; +/// ACPI 标记 +static constexpr const uint32_t E820_ACPI = 3; +/// NVS 标记 +static constexpr const uint32_t E820_NVS = 4; +/// 不可用 标记 +static constexpr const uint32_t E820_UNUSABLE = 5; + +/** + * @brief e820 项 + */ +struct e820entry_t { + // 数据类型由位数决定 + uintptr_t addr; + size_t length; + uint32_t type; +}; + +/** + * @brief e820 表 + */ +struct e820map_t { + e820map_t(void) { + nr_map = 0; + return; + } + + ~e820map_t(void) { + return; + } + + uint32_t nr_map; + e820entry_t map[E820_MAX]; +}; + +#endif /* SIMPLEKERNEL_E820_H */ diff --git a/src/arch/ia32/i386/boot/boot.S b/src/arch/ia32/i386/boot/boot.S new file mode 100644 index 000000000..c3397e50f --- /dev/null +++ b/src/arch/ia32/i386/boot/boot.S @@ -0,0 +1,151 @@ + +/** + * @file boot.S + * @brief 启动代码,进行一些设置后跳转到 kernel_main + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-01-02MRNIU迁移到 doxygen + *
+ */ + +// 以下是来自 multiboot2 规范的定义 +// How many bytes from the start of the file we search for the header. +#define MULTIBOOT_SEARCH 32768 +#define MULTIBOOT_HEADER_ALIGN 8 + +// The magic field should contain this. +#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 + +// This should be in %eax. +#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289 + +// Alignment of multiboot modules. +#define MULTIBOOT_MOD_ALIGN 0x00001000 + +// Alignment of the multiboot info structure. +#define MULTIBOOT_INFO_ALIGN 0x00000008 + +// Flags set in the 'flags' member of the multiboot header. + +#define MULTIBOOT_TAG_ALIGN 8 +#define MULTIBOOT_TAG_TYPE_END 0 +#define MULTIBOOT_TAG_TYPE_CMDLINE 1 +#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 +#define MULTIBOOT_TAG_TYPE_MODULE 3 +#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 +#define MULTIBOOT_TAG_TYPE_BOOTDEV 5 +#define MULTIBOOT_TAG_TYPE_MMAP 6 +#define MULTIBOOT_TAG_TYPE_VBE 7 +#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 +#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 +#define MULTIBOOT_TAG_TYPE_APM 10 +#define MULTIBOOT_TAG_TYPE_EFI32 11 +#define MULTIBOOT_TAG_TYPE_EFI64 12 +#define MULTIBOOT_TAG_TYPE_SMBIOS 13 +#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 +#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 +#define MULTIBOOT_TAG_TYPE_NETWORK 16 +#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 +#define MULTIBOOT_TAG_TYPE_EFI_BS 18 +#define MULTIBOOT_TAG_TYPE_EFI32_IH 19 +#define MULTIBOOT_TAG_TYPE_EFI64_IH 20 +#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 + +#define MULTIBOOT_HEADER_TAG_END 0 +#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1 +#define MULTIBOOT_HEADER_TAG_ADDRESS 2 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3 +#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4 +#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5 +#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6 +#define MULTIBOOT_HEADER_TAG_EFI_BS 7 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 +#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 + +#define MULTIBOOT_ARCHITECTURE_I386 0 +#define MULTIBOOT_ARCHITECTURE_MIPS32 4 +#define MULTIBOOT_HEADER_TAG_OPTIONAL 1 + +#define MULTIBOOT_LOAD_PREFERENCE_NONE 0 +#define MULTIBOOT_LOAD_PREFERENCE_LOW 1 +#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2 + +#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1 +#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2 + +// clang-format off + +// 声明这一段代码以 32 位模式编译 +.code32 +// multiboot2 文件头 +// 计算头长度 +.SET HEADER_LENGTH, multiboot_header_end - multiboot_header +// 计算校验和 +.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + HEADER_LENGTH) +// 8 字节对齐 +.align MULTIBOOT_HEADER_ALIGN +// 声明所属段 +.section .text.boot +multiboot_header: + // 魔数 + .long MULTIBOOT2_HEADER_MAGIC + // 架构 + .long MULTIBOOT_ARCHITECTURE_I386 + // 头长度 + .long HEADER_LENGTH + // 校验和 + .long CHECKSUM + // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf + .short MULTIBOOT_HEADER_TAG_END + // 结束标记 + .short 0 + .long 8 +multiboot_header_end: + +// 声明所属段 +.section .text.boot +// 全局可见 +.global _start +// 声明类型 +.type _start, @function +// 声明外部定义 +.extern kernel_main +.extern cpp_init +// 在 multiboot2.cpp 中定义 +.extern boot_info_addr +.extern multiboot2_magic +_start: + // 关中断 + cli + // multiboot2_info 结构体指针 + mov %ebx, boot_info_addr + // 魔数 + mov %eax, multiboot2_magic + // 设置栈地址 + mov $stack_top, %esp + // 栈地址按照 16 字节对齐 + and $0xFFFFFFF0, %esp + // 帧指针修改为 0 + mov $0, %ebp + // 初始化 C++ + call cpp_init + call kernel_main + hlt + ret + +// 声明所属段 +.section .bss.boot +// 16 字节对齐 +.align 16 +.global stack_top +// 栈 +stack_top: + // 跳过 16KB + .space 4096 * 4 diff --git a/src/arch/ia32/i386/gdt/gdt.cpp b/src/arch/ia32/i386/gdt/gdt.cpp new file mode 100644 index 000000000..e1be6b36d --- /dev/null +++ b/src/arch/ia32/i386/gdt/gdt.cpp @@ -0,0 +1,77 @@ + +/** + * @file gdt.cpp + * @brief 描述符抽象实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "gdt.h" +#include "cstdint" +#include "cstdio" + +namespace GDT { +/// 加载 GDTR +extern "C" void gdt_load(uint32_t); +/// 全局 gdt 指针 +static gdt_ptr_t gdt_ptr; +/// 全局描述符表定义 +static gdt_entry_t gdt_entries[GDT_LENGTH] __attribute__((aligned(8))); + +void set_gdt(const uint8_t idx, const uint32_t base, const uint32_t limit, + const uint8_t type, const uint8_t s, const uint8_t dpl, + const uint8_t p, const uint8_t avl, const uint8_t l, + const uint8_t db, const uint8_t g) { + gdt_entries[idx].limit1 = (limit & 0xFFFF); + gdt_entries[idx].base_addr1 = (base & 0xFFFF); + gdt_entries[idx].base_addr2 = (base >> 16) & 0xFF; + gdt_entries[idx].type = type; + gdt_entries[idx].s = s; + gdt_entries[idx].dpl = dpl; + gdt_entries[idx].p = p; + gdt_entries[idx].limit2 = (limit >> 16) & 0x0F; + gdt_entries[idx].avl = avl; + gdt_entries[idx].l = l; + gdt_entries[idx].db = db; + gdt_entries[idx].g = g; + gdt_entries[idx].base_addr3 = (base >> 24) & 0xFF; + return; +} + +int32_t init(void) { + // 全局描述符表界限 从 0 开始,所以总长要 - 1 + gdt_ptr.limit = sizeof(gdt_entry_t) * GDT_LENGTH - 1; + gdt_ptr.base = (uint32_t)&gdt_entries; + // 采用 Intel 平坦模型 + // Intel 文档要求首个描述符全 0 + set_gdt(GDT_NULL, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); + // 内核指令段 + set_gdt(GDT_KERNEL_CODE, BASE, LIMIT, TYPE_CODE_EXECUTE_READ, S_CODE_DATA, + CPU::DPL0, SEGMENT_PRESENT, AVL_NOT_AVAILABLE, L_32BIT, + DB_EXECUTABLE_CODE_SEGMENT_32, G_4KB); + // 内核数据段 + set_gdt(GDT_KERNEL_DATA, BASE, LIMIT, TYPE_DATA_READ_WRITE, S_CODE_DATA, + CPU::DPL0, SEGMENT_PRESENT, AVL_NOT_AVAILABLE, L_32BIT, + DB_EXPAND_DOWN_DATA_SEGMENT_4GB, G_4KB); + // 用户模式代码段 + set_gdt(GDT_USER_CODE, BASE, LIMIT, TYPE_CODE_EXECUTE_READ, S_CODE_DATA, + CPU::DPL3, SEGMENT_PRESENT, AVL_NOT_AVAILABLE, L_32BIT, + DB_EXECUTABLE_CODE_SEGMENT_32, G_4KB); + // 用户模式数据段 + set_gdt(GDT_USER_DATA, BASE, LIMIT, TYPE_DATA_READ_WRITE, S_CODE_DATA, + CPU::DPL3, SEGMENT_PRESENT, AVL_NOT_AVAILABLE, L_32BIT, + DB_EXPAND_DOWN_DATA_SEGMENT_4GB, G_4KB); + // 加载全局描述符表地址到 GDTR 寄存器 + gdt_load((uint32_t)&gdt_ptr); + info("gdt init.\n"); + return 0; +} +}; // namespace GDT diff --git a/src/arch/ia32/i386/gdt/gdt_s.S b/src/arch/ia32/i386/gdt/gdt_s.S new file mode 100644 index 000000000..94dfc85c4 --- /dev/null +++ b/src/arch/ia32/i386/gdt/gdt_s.S @@ -0,0 +1,33 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +// +// gdt_s.S for Simple-XX/SimpleKernel. + +// clang-format off + +.code32 + +.section .text +.global gdt_load +gdt_load: + cli + // 参数存入 eax 寄存器 + mov 4(%esp), %eax + // 加载到 GDTR [修改原先GRUB设置] + lgdt (%eax) + + // 加载数据段描述符 + mov $0x10, %ax + // 更新所有可以更新的段寄存器 + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + mov %ax, %ss + // 远跳转,0x08是代码段描述符 + jmp $0x08, $flush + // 远跳目的是清空流水线并串行化处理器 + +flush: + ret diff --git a/src/arch/ia32/i386/gdt/include/gdt.h b/src/arch/ia32/i386/gdt/include/gdt.h new file mode 100644 index 000000000..e23ffe4f4 --- /dev/null +++ b/src/arch/ia32/i386/gdt/include/gdt.h @@ -0,0 +1,297 @@ + +/** + * @file gdt.h + * @brief 描述符抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_GDT_H +#define SIMPLEKERNEL_GDT_H + +#include "cpu.hpp" +#include "cstdint" + +/** + * @brief GDT 接口 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual Chapter3 + */ +namespace GDT { +/// 全局描述符表长度 +static constexpr const uint32_t GDT_LENGTH = 5; +/// 各个内存段所在全局描述符表下标 +static constexpr const uint32_t GDT_NULL = 0; +/// 内核代码段 +static constexpr const uint32_t GDT_KERNEL_CODE = 1; +/// 内核数据段 +static constexpr const uint32_t GDT_KERNEL_DATA = 2; +/// 用户代码段 +static constexpr const uint32_t GDT_USER_CODE = 3; +/// 用户数据段 +static constexpr const uint32_t GDT_USER_DATA = 4; +/// 内核代码段选择子 0x08 +static constexpr const uint32_t SEG_KERNEL_CODE = GDT_KERNEL_CODE << 3; +/// 内核数据段选择子 +static constexpr const uint32_t SEG_KERNEL_DATA = GDT_KERNEL_DATA << 3; +/// 用户代码段选择子 +static constexpr const uint32_t SEG_USER_CODE = GDT_USER_CODE << 3; +/// 用户数据段选择子 +static constexpr const uint32_t SEG_USER_DATA = GDT_USER_DATA << 3; + +// type 类型 +// Code- and Data-Segment Types, S=1 +/// 数据段 只读 +static constexpr const uint32_t TYPE_DATA_READ_ONLY = 0x00; +/// 数据段 只读,可访问 +static constexpr const uint32_t TYPE_DATA_READ_ONLY_ACCESSED = 0x01; +/// 数据段 读写 +static constexpr const uint32_t TYPE_DATA_READ_WRITE = 0x02; +/// 数据段,读写,可访问 +static constexpr const uint32_t TYPE_DATA_READ_WRITE_ACCESSED = 0x03; +/// 数据段,只读,? +static constexpr const uint32_t TYPE_DATA_READ_ONLY_EXPAND_DOWN = 0x04; +/// 数据段,只读,?,可访问 +static constexpr const uint32_t TYPE_DATA_READ_ONLY_EXPAND_DOWN_ACCESSED = 0x05; +/// 数据段,读写,? +static constexpr const uint32_t TYPE_DATA_READ_WRITE_EXPAND_DOWN = 0x06; +/// 数据段,读写,?可访问 +static constexpr const uint32_t TYPE_DATA_READ_WRITE_EXPAND_DOWN_ACCESSED + = 0x07; +/// 代码段,仅执行 +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY = 0x08; +/// 代码段,仅执行,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY_ACCESSED = 0x09; +/// 代码段,可执行,可读 +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ = 0x0A; +/// 代码段,可执行,可读,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ_ACCESSED = 0x0B; +/// 代码段,仅执行,? +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY_CONFORMING = 0x0C; +/// 代码段,仅执行,?,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY_CONFORMING_ACCESSED + = 0x0D; +/// 代码段,可执行,可读,? +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ_CONFORMING = 0x0E; +/// 代码段,可执行,可读,?,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ_CONFORMING_ACCESSED + = 0x0F; + +// System-Segment and Gate-Descriptor Types, 32bit, when S=0 +/// 保留 +static constexpr const uint32_t TYPE_SYSTEM_16_RESERVESD1 = 0x00; +/// 16 位 TSS +static constexpr const uint32_t TYPE_SYSTEM_16_TSS_AVAILABLE = 0x01; +/// LDT +static constexpr const uint32_t TYPE_SYSTEM_LDT = 0x02; +/// 16 位 TSS,在用 +static constexpr const uint32_t TYPE_SYSTEM_16_TSS_BUSY = 0x03; +/// 16 位调用门 +static constexpr const uint32_t TYPE_SYSTEM_16_CALL_GATE = 0x04; +/// 任务门 +static constexpr const uint32_t TYPE_SYSTEM_TASK_GATE = 0x05; +/// 16 位 中断门 +static constexpr const uint32_t TYPE_SYSTEM_16_INTERRUPT_GATE = 0x06; +/// 16 位 陷阱门 +static constexpr const uint32_t TYPE_SYSTEM_16_TRAP_GATE = 0x07; +/// 保留 +static constexpr const uint32_t TYPE_SYSTEM_32_RESERVESD2 = 0x08; +/// 32 位 TSS +static constexpr const uint32_t TYPE_SYSTEM_32_TSS_AVAILABLE = 0x09; +/// 保留 +static constexpr const uint32_t TYPE_SYSTEM_32_RESERVESD3 = 0x0A; +/// 32 位,在用 +static constexpr const uint32_t TYPE_SYSTEM_32_TSS_BUSY = 0x0B; +/// 32 位 调用门 +static constexpr const uint32_t TYPE_SYSTEM_32_CALL_GATE = 0x0C; +/// 保留 +static constexpr const uint32_t TYPE_SYSTEM_RESERVESD4 = 0x0D; +/// 32 位 中断门 +static constexpr const uint32_t TYPE_SYSTEM_32_INTERRUPT_GATE = 0x0E; +/// 32 位 陷阱门 +static constexpr const uint32_t TYPE_SYSTEM_32_TRAP_GATE = 0x0F; + +// S 位 +/// 系统段 +static constexpr const uint32_t S_SYSTEM = 0x00; +/// 代码/数据段 +static constexpr const uint32_t S_CODE_DATA = 0x01; + +// 各个段的全局描述符表的选择子 +/// 内核代码段 +static constexpr const uint32_t KERNEL_CS = SEG_KERNEL_CODE | CPU::DPL0; +/// 内核数据段 +static constexpr const uint32_t KERNEL_DS = SEG_KERNEL_DATA | CPU::DPL0; +/// 用户代码段 +static constexpr const uint32_t USER_CS = SEG_USER_CODE | CPU::DPL3; +/// 用户数据段 +static constexpr const uint32_t USER_DS = SEG_USER_DATA | CPU::DPL3; + +// P 位 +/// 无效 +static constexpr const uint32_t SEGMENT_NOT_PRESENT = 0x00; +/// 有效 +static constexpr const uint32_t SEGMENT_PRESENT = 0x01; +// AVL +/// 无效 +static constexpr const uint32_t AVL_NOT_AVAILABLE = 0x00; +/// 有效 +static constexpr const uint32_t AVL_AVAILABLE = 0x01; +// L 位 +/// 32 位 +static constexpr const uint32_t L_32BIT = 0x00; +/// 64 位 +static constexpr const uint32_t L_64BIT = 0x01; +// D/B +/// @todo +static constexpr const uint32_t DB_EXECUTABLE_CODE_SEGMENT_16 = 0x00; +/// @todo +static constexpr const uint32_t DB_EXECUTABLE_CODE_SEGMENT_32 = 0x01; +/// @todo +static constexpr const uint32_t DB_STACK_SEGMENT_STACK_POINTER_16 = 0x00; +/// @todo +static constexpr const uint32_t DB_STACK_SEGMENT_STACK_POINTER_32 = 0x01; +/// @todo +static constexpr const uint32_t DB_EXPAND_DOWN_DATA_SEGMENT_64KB = 0x00; +/// @todo +static constexpr const uint32_t DB_EXPAND_DOWN_DATA_SEGMENT_4GB = 0x01; +// G +/// 字节粒度 +static constexpr const uint32_t G_BYTE = 0x00; +/// 4KB 粒度 +static constexpr const uint32_t G_4KB = 0x01; + +// 访问权限 +/// 内核读,执行 +static constexpr const uint32_t KREAD_EXEC = 0x9A; +/// 内核写 +static constexpr const uint32_t KREAD_WRITE = 0x92; +/// 用户读,执行 +static constexpr const uint32_t UREAD_EXEC = 0xFA; +/// 用户写 +static constexpr const uint32_t UREAD_WRITE = 0xF2; + +/// 段基址 +static constexpr const uint32_t BASE = 0x00; +/// 段长度 +static constexpr const uint32_t LIMIT = 0xFFFFFFFF; + +/** + * @brief 全局描述符 + */ +struct gdt_entry_t { + /// 段界限 15:00 + uint64_t limit1 : 16; + /// 基址 15:00 + uint64_t base_addr1 : 16; + /// 基址 23:16 + uint64_t base_addr2 : 8; + /// 类型 + uint64_t type : 4; + /// Descriptor type (0 = system; 1 = code or data) + uint64_t s : 1; + /// Specifies the privilege level of the segment + uint64_t dpl : 2; + /// Indicates whether the segment is present in memory (set) or not + /// present (clear). + uint64_t p : 1; + /// 段界限 19:16 + uint64_t limit2 : 4; + /// Available for use by system software + uint64_t avl : 1; + /// 64-bit code segment (IA-32e mode only) + uint64_t l : 1; + /// Default operation size(0 = 16 - bit segment; 1 = 32 - bit segment) + uint64_t db : 1; + /// Determines the scaling of the segment limit field. When the + /// granularity flag is clear, the segment limit is interpreted in + /// byte units; when flag is set, the segment limit is interpreted in + /// 4-KByte units. + uint64_t g : 1; + /// 基址 31:24 + uint64_t base_addr3 : 8; +} __attribute__((packed)); + +/** + * @brief 全剧描述符寄存器 + */ +struct gdt_ptr_t { + /// 全局描述符表限长 + uint16_t limit; + /// 全局描述符表 32位 基地址 + uint32_t base; +} __attribute__((packed)); + +/** + * @brief 32 位 tss + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#7.2.1 + * @note 目前没有使用 + */ +struct tss32_t { + uint16_t prev_task_link; + uint16_t reserved0; + uint32_t esp0; + uint16_t ss0; + uint32_t reserved1; + uint32_t esp1; + uint16_t ss1; + uint32_t reserved2; + uint32_t esp2; + uint16_t ss2; + uint32_t reserved3; + uint32_t cr3; + uint32_t eip; + uint32_t eflags; + uint32_t eax; + uint32_t ecx; + uint32_t edx; + uint32_t ebx; + uint32_t esp; + uint32_t ebp; + uint32_t esi; + uint32_t edi; + uint16_t es; + uint16_t reserved4; + uint16_t cs; + uint16_t reserved5; + uint16_t ss; + uint16_t reserved6; + uint16_t ds; + uint16_t reserved7; + uint16_t fs; + uint16_t reserved8; + uint16_t gs; + uint16_t reserved9; + uint16_t ldt_segment_selector; + uint16_t reserved10; + uint32_t t : 1; + uint32_t reserved11 : 15; + uint32_t io_map_base_addr : 16; +} __attribute__((packed)); + +/** + * @brief 全局描述符表构造函数 + * @param _num 描述符索引 + * @param _base 基地 + * @param _limit 长度 + * @param _access 访问权限 + * @param _gran 粒度 + */ +void set_gdt(int32_t _num, uint32_t _base, uint32_t _limit, uint8_t _access, + uint8_t _gran); + +/** + * @brief 初始化 + * @return int32_t 成功返回 0 + */ +int32_t init(void); +}; // namespace GDT + +#endif /* SIMPLEKERNEL_GDT_H */ diff --git a/src/arch/ia32/i386/intr/include/intr.h b/src/arch/ia32/i386/intr/include/intr.h new file mode 100644 index 000000000..b48ba4bf1 --- /dev/null +++ b/src/arch/ia32/i386/intr/include/intr.h @@ -0,0 +1,339 @@ + +/** + * @file intr.h + * @brief 中断抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_INTR_H +#define SIMPLEKERNEL_INTR_H + +#include "cstdint" + +/// @todo 升级为 APIC +class INTR { +public: + /** + * @brief 错误码结构 + */ + struct error_code_t { + uint32_t ext : 1; + uint32_t idt : 1; + uint32_t ti : 1; + uint32_t sec_idx : 28; + }; + + /** + * @brief 缺页错误码结构 + */ + struct page_fault_error_code_t { + uint32_t p : 1; + uint32_t wr : 1; + uint32_t us : 1; + uint32_t rsvd : 1; + uint32_t id : 1; + uint32_t pk : 1; + uint32_t reserved1 : 9; + uint32_t sgx : 1; + uint32_t reserved2 : 16; + }; + + /** + * @brief 中断上下文结构 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.12.1 + */ + struct intr_context_t { + // segment registers + // 16 bits + uint32_t ss; + // 16 bits + uint32_t gs; + // 16 bits + uint32_t fs; + // 16 bits + uint32_t es; + // 16 bits + uint32_t ds; + + // pusha,popa 跟这个相反 + // Temporary = ESP; + // push(EAX); + // push(ECX); + // push(EDX); + // push(EBX); + // push(Temporary); + // push(EBP); + // push(ESI); + // push(EDI); + // 这几个寄存器由 pusha 压入 + uint32_t edi; + uint32_t esi; + uint32_t ebp; + uint32_t esp; + uint32_t ebx; + uint32_t edx; + uint32_t ecx; + uint32_t eax; + + // 错误代码,如果有,由 cpu 压入 + uint32_t err_code; + // 以下指令由cpu压入,参见x86/x64 532页 + // 指向产生异常的指令 + uint32_t eip; + // 16 bits + uint32_t cs; + uint32_t eflags; + // 如果发生了特权级切换,CPU 会压入以下两个参数 + uint32_t old_esp; + uint32_t old_ss; + }; + + // 定义中断处理函数指针 + typedef void (*interrupt_handler_t)(intr_context_t*); + +private: + /// 中断表最大值 + static constexpr const uint32_t INTERRUPT_MAX = 256; + /// 8259A 相关定义 + /// Master (IRQs 0-7) + static constexpr const uint32_t IO_PIC1 = 0x20; + /// Slave (IRQs 8-15) + static constexpr const uint32_t IO_PIC2 = 0xA0; + static constexpr const uint32_t IO_PIC1C = IO_PIC1 + 1; + static constexpr const uint32_t IO_PIC2C = IO_PIC2 + 1; + /// End-of-interrupt command code + static constexpr const uint32_t PIC_EOI = 0x20; + + /// 中断名数组 + static constexpr const char* const intrnames[] = { + "Divide Error", + "Debug Exception", + "NMI Interrupt", + "Breakpoint", + "Overflow", + "BOUND Range Exceeded", + "Invalid Opcode (Undefined Opcode)", + "Device Not Available (No Math Coprocessor)", + "Double Fault", + "Coprocessor Segment Overrun (reserved)", + "Invalid TSS", + "Segment Not Present", + "Stack-Segment Fault", + "General Protection", + "Page Fault", + "(Intel reserved. Do not use.)", + "x87 FPU Floating-Point Error (Math Fault)", + "Alignment Check", + "Machine Check", + "SIMD Floating-Point Exception", + "Virtualization Exception", + }; + + /** + * @brief 中断描述符结构 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.11 + */ + struct idt_entry32_t { + // 低位地址 + uint64_t offset0 : 16; + // 选择子 + uint64_t selector : 16; + // 保留 + uint64_t reserved : 4; + // 填充 0 + uint64_t zero : 4; + // 类型 + uint64_t type : 5; + // 权限 + uint64_t dpl : 2; + // 存在位 + uint64_t p : 1; + // 中段地址 + uint64_t offset1 : 16; + } __attribute__((packed)); + + /** + * @brief 中断向量寄存器结构 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.10 + */ + struct idt_ptr_t { + // 限长 + uint16_t limit; + // 基址 + uint32_t base; + } __attribute__((packed)); + + /// 中断处理函数指针数组 + static interrupt_handler_t interrupt_handlers[INTERRUPT_MAX] + __attribute__((aligned(4))); + /// 中断描述符表 + static idt_entry32_t idt_entry32[INTERRUPT_MAX] + __attribute__((aligned(16))); + /// IDTR + static idt_ptr_t idt_ptr; + + /** + * @brief 设置中断描述符 + * @param _num 中断号 + * @param _base 基址 + * @param _selector ? + * @param _type ? + * @param _dpl ? + * @param _p ? + */ + void set_idt(uint8_t _num, uint32_t _base, uint16_t _selector, + uint8_t _type, uint8_t _dpl, uint8_t _p); + + /** + * @brief 8259A 芯片初始化 + */ + void init_interrupt_chip(void); + + /** + * @brief 重设 8259A 芯片 + * @param _no 要重设的中断号 + */ + void clear_interrupt_chip(uint8_t _no); + + /** + * @brief 关闭 8259A 芯片的所有中断,为启动 APIC 作准备 + */ + void disable_interrupt_chip(void); + +public: + // External(hardware generated) interrupts. + /// @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.3.1 + static constexpr const uint32_t INT_DIVIDE_ERROR = 0; + static constexpr const uint32_t INT_DEBUG = 1; + static constexpr const uint32_t INT_NMI = 2; + static constexpr const uint32_t INT_BREAKPOINT = 3; + static constexpr const uint32_t INT_OVERFLOW = 4; + static constexpr const uint32_t INT_BOUND = 5; + static constexpr const uint32_t INT_INVALID_OPCODE = 6; + static constexpr const uint32_t INT_DEVICE_NOT_AVAIL = 7; + static constexpr const uint32_t INT_DOUBLE_FAULT = 8; + static constexpr const uint32_t INT_COPROCESSOR = 9; + static constexpr const uint32_t INT_INVALID_TSS = 10; + static constexpr const uint32_t INT_SEGMENT = 11; + static constexpr const uint32_t INT_STACK_FAULT = 12; + static constexpr const uint32_t INT_GENERAL_PROTECT = 13; + static constexpr const uint32_t INT_PAGE_FAULT = 14; + // 15 没有使用 + static constexpr const uint32_t INT_X87_FPU = 16; + static constexpr const uint32_t INT_ALIGNMENT = 17; + static constexpr const uint32_t INT_MACHINE_CHECK = 18; + static constexpr const uint32_t INT_SIMD_FLOAT = 19; + static constexpr const uint32_t INT_VIRTUAL_EXCE = 20; + // 21~31 保留 + + // 定义IRQ + // 电脑系统计时器 + static constexpr const uint32_t IRQ0 = 32; + // 键盘 + static constexpr const uint32_t IRQ1 = 33; + // 与 IRQ9 相接,MPU-401 MD 使用 + static constexpr const uint32_t IRQ2 = 34; + // 串口设备 + static constexpr const uint32_t IRQ3 = 35; + // 串口设备 + static constexpr const uint32_t IRQ4 = 36; + // 建议声卡使用 + static constexpr const uint32_t IRQ5 = 37; + // 软驱传输控制使用 + static constexpr const uint32_t IRQ6 = 38; + // 打印机传输控制使用 + static constexpr const uint32_t IRQ7 = 39; + // 即时时钟 + static constexpr const uint32_t IRQ8 = 40; + // 与 IRQ2 相接,可设定给其他硬件 + static constexpr const uint32_t IRQ9 = 41; + // 建议网卡使用 + static constexpr const uint32_t IRQ10 = 42; + // 建议 AGP 显卡使用 + static constexpr const uint32_t IRQ11 = 43; + // 接 PS/2 鼠标,也可设定给其他硬件 + static constexpr const uint32_t IRQ12 = 44; + // 协处理器使用 + static constexpr const uint32_t IRQ13 = 45; + // SATA 主硬盘 + static constexpr const uint32_t IRQ14 = 46; + // SATA 从硬盘 + static constexpr const uint32_t IRQ15 = 47; + // 系统调用 + static constexpr const uint32_t IRQ128 = 128; + + /** + * @brief 获取单例 + * @return INTR& 静态对象 + */ + static INTR& get_instance(void); + + /** + * @brief 中断初始化 + * @return int32_t desc + */ + int32_t init(void); + + /** + * @brief 执行中断 + * @param _no 中断号 + * @param _intr_context 上下文 + * @return int32_t 保存中断处理后的返回值 + */ + int32_t call_irq(uint8_t _no, intr_context_t* _intr_context); + + int32_t call_isr(uint8_t _no, intr_context_t* _intr_context); + + /** + * @brief 注册一个中断处理函数 + * @param _no 中断号 + * @param _handler 中断处理函数 + */ + void register_interrupt_handler(uint8_t _no, interrupt_handler_t _handler); + /** + * @brief 打开指定中断 + * @param _no 要允许的中断号 + */ + void enable_irq(uint8_t _no); + + /** + * @brief 关闭指定中断 + * @param _no 要允许的中断号 + */ + void disable_irq(uint8_t _no); + + /** + * @brief 返回中断名 + * @param _no 中断号 + * @return const char* 对应的中断名 + */ + const char* get_intr_name(uint8_t _no); +}; + +/** + * @brief 时钟抽象 + */ +class TIMER { +public: + /** + * @brief 获取单例 + * @return TIMER& 静态对象 + */ + static TIMER& get_instance(void); + + /** + * @brief 初始化 + */ + void init(void); +}; + +#endif /* SIMPLEKERNEL_INTR_H */ diff --git a/src/arch/ia32/i386/intr/intr.cpp b/src/arch/ia32/i386/intr/intr.cpp new file mode 100644 index 000000000..ae6c7d6bc --- /dev/null +++ b/src/arch/ia32/i386/intr/intr.cpp @@ -0,0 +1,417 @@ + +/** + * @file intr.cpp + * @brief 中断抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://wiki.0xffffff.org/posts/hurlex-kernel.html + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "intr.h" +#include "apic.h" +#include "cpu.hpp" +#include "cstdio" +#include "gdt.h" +#include "io.h" +#include "keyboard.h" + +// 声明中断处理函数 0 ~ 19 属于 CPU 的异常中断 +// ISR:中断服务程序(interrupt service routine) +/// 0 #DE 除 0 异常 +extern "C" void isr0(void); +/// 1 #DB 调试异常 +extern "C" void isr1(void); +/// 2 NMI +extern "C" void isr2(void); +/// 3 BP 断点异常 +extern "C" void isr3(void); +/// 4 #OF 溢出 +extern "C" void isr4(void); +/// 5 #BR 对数组的引用超出边界 +extern "C" void isr5(void); +/// 6 #UD 无效或未定义的操作码 +extern "C" void isr6(void); +/// 7 #NM 设备不可用(无数学协处理器) +extern "C" void isr7(void); +/// 8 #DF 双重故障(有错误代码) +extern "C" void isr8(void); +/// 9 协处理器跨段操作 +extern "C" void isr9(void); +/// 10 #TS 无效TSS(有错误代码) +extern "C" void isr10(void); +/// 11 #NP 段不存在(有错误代码) +extern "C" void isr11(void); +/// 12 #SS 栈错误(有错误代码) +extern "C" void isr12(void); +/// 13 #GP 常规保护(有错误代码) +extern "C" void isr13(void); +/// 14 #PF 页故障(有错误代码) +extern "C" void isr14(void); +/// 15 没有使用 +/// 16 #MF 浮点处理单元错误 +extern "C" void isr16(void); +/// 17 #AC 对齐检查 +extern "C" void isr17(void); +/// 18 #MC 机器检查 +extern "C" void isr18(void); +/// 19 #XM SIMD(单指令多数据)浮点异常 +extern "C" void isr19(void); +extern "C" void isr20(void); +/// 21 ~ 31 Intel 保留 +/// 32 ~ 255 用户自定义异常 +/// 0x80 用于实现系统调用 +extern "C" void isr128(void); + +/// IRQ:中断请求(Interrupt Request) +/// 电脑系统计时器 +extern "C" void irq0(void); +/// 键盘 +extern "C" void irq1(void); +/// 与 IRQ9 相接,MPU-401 MD 使用 +extern "C" void irq2(void); +/// 串口设备 +extern "C" void irq3(void); +/// 串口设备 +extern "C" void irq4(void); +/// 建议声卡使用 +extern "C" void irq5(void); +/// 软驱传输控制使用 +extern "C" void irq6(void); +/// 打印机传输控制使用 +extern "C" void irq7(void); +/// 即时时钟 +extern "C" void irq8(void); +/// 与 IRQ2 相接,可设定给其他硬件 +extern "C" void irq9(void); +/// 建议网卡使用 +extern "C" void irq10(void); +/// 建议 AGP 显卡使用 +extern "C" void irq11(void); +/// 接 PS/2 鼠标,也可设定给其他硬件 +extern "C" void irq12(void); +/// 协处理器使用 +extern "C" void irq13(void); +/// IDE0 传输控制使用 +extern "C" void irq14(void); +/// IDE1 传输控制使用 +extern "C" void irq15(void); +/// 声明加载 IDTR 的函数 +extern "C" void idt_load(uint32_t); + +/** + * @brief IRQ 处理函数 + */ +extern "C" void irq_handler(uint8_t _no, INTR::intr_context_t* _intr_context) { + INTR::get_instance().call_irq(_no, _intr_context); + return; +} + +/** + * @brief ISR 处理函数 + */ +extern "C" void isr_handler(uint8_t _no, INTR::intr_context_t* _intr_context, + INTR::error_code_t* _err_code) { + (void)_err_code; + INTR::get_instance().call_isr(_no, _intr_context); + return; +} + +// 默认处理函数 +static void handler_default(INTR::intr_context_t*) { + while (1) { + ; + } + return; +} + +// 中断处理函数指针数组 +INTR::interrupt_handler_t INTR::interrupt_handlers[INTERRUPT_MAX]; +// 中断描述符表 +INTR::idt_entry32_t INTR::idt_entry32[INTERRUPT_MAX]; +// IDTR +INTR::idt_ptr_t INTR::idt_ptr; + +// 64-ia-32-architectures-software-developer-vol-3a-manual#6.11 +void INTR::set_idt(uint8_t _num, uint32_t _base, uint16_t _selector, + uint8_t _type, uint8_t _dpl, uint8_t _p) { + idt_entry32[_num].offset0 = _base & 0xFFFF; + idt_entry32[_num].selector = _selector; + idt_entry32[_num].reserved = 0; + idt_entry32[_num].zero = 0; + idt_entry32[_num].type = _type; + idt_entry32[_num].dpl = _dpl; + idt_entry32[_num].p = _p; + idt_entry32[_num].offset1 = (_base >> 16) & 0xFFFF; + return; +} + +void INTR::init_interrupt_chip(void) { + // 重新映射 IRQ 表 + // 两片级联的 Intel 8259A 芯片 + // 主片端口 0x20 0x21 + // 从片端口 0xA0 0xA1 + + // 初始化主片、从片 + // 0001 0001 + IO::get_instance().outb(IO_PIC1, 0x11); + // 设置主片 IRQ 从 0x20(32) 号中断开始 + IO::get_instance().outb(IO_PIC1C, IRQ0); + // 设置主片 IR2 引脚连接从片 + IO::get_instance().outb(IO_PIC1C, 0x04); + // 设置主片按照 EOI 的方式工作 + // 在这种模式下,中断处理完后需要通知 8259A 重置 ISR 寄存器 + // 即调用 clear_interrupt_chip() + IO::get_instance().outb(IO_PIC1C, 0x01); + + IO::get_instance().outb(IO_PIC2, 0x11); + // 设置从片 IRQ 从 0x28(40) 号中断开始 + IO::get_instance().outb(IO_PIC2C, IRQ8); + // 告诉从片输出引脚和主片 IR2 号相连 + IO::get_instance().outb(IO_PIC2C, 0x02); + // 设置从片按照 EOI 的方式工作 + IO::get_instance().outb(IO_PIC2C, 0x01); + + // 默认关闭所有中断 + IO::get_instance().outb(IO_PIC1C, 0xFF); + IO::get_instance().outb(IO_PIC2C, 0xFF); + return; +} + +void INTR::clear_interrupt_chip(uint8_t _no) { + // 发送中断结束信号给 PICs + // 按照我们的设置,从 32 号中断起为用户自定义中断 + // 因为单片的 Intel 8259A 芯片只能处理 8 级中断 + // 故大于等于 40 的中断号是由从片处理的 + if (_no >= IRQ8) { + // 发送重设信号给从片 + IO::get_instance().outb(IO_PIC2, PIC_EOI); + } + // 发送重设信号给主片 + IO::get_instance().outb(IO_PIC1, PIC_EOI); + return; +} + +void INTR::disable_interrupt_chip(void) { + // 屏蔽所有中断 + IO::get_instance().outb(IO_PIC1C, 0xFF); + IO::get_instance().outb(IO_PIC2C, 0xFF); + return; +} + +INTR& INTR::get_instance(void) { + /// 定义全局 INTR 对象 + static INTR intr; + return intr; +} + +int32_t INTR::init(void) { + // 填充中断描述符 + idt_ptr.limit = sizeof(idt_entry32_t) * INTERRUPT_MAX - 1; + idt_ptr.base = (uintptr_t)&idt_entry32; + + // 先全部填充 + for (uint32_t i = 0; i < INTERRUPT_MAX; i++) { + set_idt(i, 0x0, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + } + + // 设置软中断 + set_idt(INT_DIVIDE_ERROR, (uintptr_t)isr0, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_DEBUG, (uintptr_t)isr1, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_NMI, (uintptr_t)isr2, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_BREAKPOINT, (uintptr_t)isr3, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_OVERFLOW, (uintptr_t)isr4, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_BOUND, (uintptr_t)isr5, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_INVALID_OPCODE, (uintptr_t)isr6, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_DEVICE_NOT_AVAIL, (uintptr_t)isr7, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_DOUBLE_FAULT, (uintptr_t)isr8, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_COPROCESSOR, (uintptr_t)isr9, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_INVALID_TSS, (uintptr_t)isr10, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_SEGMENT, (uintptr_t)isr11, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_STACK_FAULT, (uintptr_t)isr12, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_GENERAL_PROTECT, (uintptr_t)isr13, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_PAGE_FAULT, (uintptr_t)isr14, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_X87_FPU, (uintptr_t)isr16, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_ALIGNMENT, (uintptr_t)isr17, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_MACHINE_CHECK, (uintptr_t)isr18, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_SIMD_FLOAT, (uintptr_t)isr19, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_VIRTUAL_EXCE, (uintptr_t)isr20, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + + // 设置外部中断 + set_idt(IRQ0, (uintptr_t)irq0, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ1, (uintptr_t)irq1, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ2, (uintptr_t)irq2, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ3, (uintptr_t)irq3, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ4, (uintptr_t)irq4, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ5, (uintptr_t)irq5, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ6, (uintptr_t)irq6, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ7, (uintptr_t)irq7, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ8, (uintptr_t)irq8, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ9, (uintptr_t)irq9, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ10, (uintptr_t)irq10, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ11, (uintptr_t)irq11, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ12, (uintptr_t)irq12, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ13, (uintptr_t)irq13, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ14, (uintptr_t)irq14, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ15, (uintptr_t)irq15, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + // 填充系统调用中断 + set_idt(IRQ128, (uintptr_t)isr128, GDT::SEG_KERNEL_CODE, + GDT::TYPE_SYSTEM_32_INTERRUPT_GATE, CPU::DPL3, + GDT::SEGMENT_PRESENT); + // 所有中断设为默认 + for (uint32_t i = 0; i < INTERRUPT_MAX; i++) { + register_interrupt_handler(i, handler_default); + } + // idt 初始化 + init_interrupt_chip(); + // 加载 idt + idt_load((uintptr_t)&idt_ptr); + // APIC 初始化 + apic.init(); + // 键盘初始化 + KEYBOARD::get_instance().init(); + info("intr init.\n"); + return 0; +} + +int32_t INTR::call_irq(uint8_t _no, intr_context_t* _intr_context) { + // 重设PIC芯片 + clear_interrupt_chip(_no); + if (interrupt_handlers[_no] != nullptr) { + interrupt_handlers[_no](_intr_context); + } + return 0; +} + +int32_t INTR::call_isr(uint8_t _no, intr_context_t* _intr_context) { + if (interrupt_handlers[_no] != nullptr) { + interrupt_handlers[_no](_intr_context); + } + else { + warn("Unhandled interrupt: %d %s\n", _no, get_intr_name(_no)); + CPU::hlt(); + } + return 0; +} + +void INTR::register_interrupt_handler(uint8_t _no, + interrupt_handler_t _handler) { + interrupt_handlers[_no] = _handler; + return; +} + +void INTR::enable_irq(uint8_t _no) { + uint8_t mask = 0; + // printk_color(green, "enable_irq mask: %X", mask); + if (_no >= IRQ8) { + mask = ((IO::get_instance().inb(IO_PIC2C)) & (~(1 << (_no % 8)))); + IO::get_instance().outb(IO_PIC2C, mask); + } + else { + mask = ((IO::get_instance().inb(IO_PIC1C)) & (~(1 << (_no % 8)))); + IO::get_instance().outb(IO_PIC1C, mask); + } + return; +} + +void INTR::disable_irq(uint8_t _no) { + uint8_t mask = 0; + // printk_color(green, "disable_irq mask: %X", mask); + if (_no >= IRQ8) { + mask = ((IO::get_instance().inb(IO_PIC2C)) | (1 << (_no % 8))); + IO::get_instance().outb(IO_PIC2C, mask); + } + else { + mask = ((IO::get_instance().inb(IO_PIC1C)) | (1 << (_no % 8))); + IO::get_instance().outb(IO_PIC1C, mask); + } + return; +} + +const char* INTR::get_intr_name(uint8_t _no) { + if (_no < sizeof(intrnames) / sizeof(const char* const)) { + return intrnames[_no]; + } + return "(unknown trap)"; +} diff --git a/src/arch/ia32/i386/intr/intr_s.S b/src/arch/ia32/i386/intr/intr_s.S new file mode 100644 index 000000000..429ef3cf6 --- /dev/null +++ b/src/arch/ia32/i386/intr/intr_s.S @@ -0,0 +1,243 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +# +// intr_s.s for Simple-XX/SimpleKernel. + +// clang-format off + +.code32 + +// 加载 idt +.section .text +.global idt_load +idt_load: + // 参数保存在 eax + mov 4(%esp), %eax + lidt 0(%eax) + ret + +// 定义两个构造中断处理函数的宏(有的中断有错误代码,有的没有) +// 用于没有错误代码的中断 +.macro ISR_NO_ERROR_CODE no +.global isr\no +isr\no: + // 关中断 + cli + // 这时候栈的情况 + // EIP + // CS + // EFLAGS + // old_esp(特权级切换时 cpu 压入) + // old_ss(特权级切换时 cpu 压入) + // 压入错误代码,但这里没有传递,所以用 0 占位 + push $0 + // 压入寄存器信息 + pusha + // 压入段寄存器 + push %ds + push %es + push %fs + push %gs + push %ss + // 传递参数 2:错误代码,但这里没有传递,所以用 0 占位 + push $0 + // 传递参数 1:intr_context_t + push %esp + // 传递参数 0:中断号 + push $\no + // 调用处理函数 + call isr_handler + // 恢复现场 + // 弹出中断号 + add $4, %esp + // 弹出 intr_context_t + add $4, %esp + // 弹出占位的 0 + add $4, %esp + // 弹出寄存器 + pop %ss + pop %gs + pop %fs + pop %es + pop %ds + popa + // 弹出占位的 0 + add $4, %esp + iret +.endm + +// 用于有错误代码的中断 +.macro ISR_ERROR_CODE no +.global isr\no +isr\no: + // 关中断 + cli + // 这时候栈的情况 + // err_code + // EIP + // CS + // EFLAGS + // old_esp(特权级切换时 cpu 压入) + // old_ss(特权级切换时 cpu 压入) + // 压入寄存器信息 + pusha + // 压入段寄存器 + push %ds + push %es + push %fs + push %gs + push %ss + // 传递参数 2:错误代码,位于栈地址+52 + push 52(%esp) + // 传递参数 1:intr_context_t + push %esp + // 传递参数 0:中断号 + push $\no + // 调用处理函数 + call isr_handler + // 恢复现场 + // 弹出参数 0:中断号 + add $4, %esp + // 弹出参数 1: intr_context_t + add $4, %esp + // 弹出参数 2:错误代码 + add $4, %esp + // 弹出寄存器 + pop %ss + pop %gs + pop %fs + pop %es + pop %ds + popa + // TODO: 不知道这个是为啥,没有的话就会挂 + // 怀疑是错误代码,iret 没有将它弹出 + add $4, %esp + iret +.endm + +// 定义中断处理函数 +// 64-ia-32-architectures-software-developer-vol-3a-manual#Table 6-1 +// 0 #DE 除 0 异常 +ISR_NO_ERROR_CODE 0 +// 1 #DB 调试异常 +ISR_NO_ERROR_CODE 1 +// 2 NMI +ISR_NO_ERROR_CODE 2 +// 3 BP 断点异常 +ISR_NO_ERROR_CODE 3 +// 4 #OF 溢出 +ISR_NO_ERROR_CODE 4 +// 5 #BR 对数组的引用超出边界 +ISR_NO_ERROR_CODE 5 +// 6 #UD 无效或未定义的操作码 +ISR_NO_ERROR_CODE 6 +// 7 #NM 设备不可用(无数学协处理器) +ISR_NO_ERROR_CODE 7 +// 8 #DF 双重故障(有错误代码) +ISR_ERROR_CODE 8 +// 9 协处理器跨段操作 +ISR_NO_ERROR_CODE 9 +// 10 #TS 无效TSS(有错误代码) +ISR_ERROR_CODE 10 +// 11 #NP 段不存在(有错误代码) +ISR_ERROR_CODE 11 +// 12 #SS 栈错误(有错误代码) +ISR_ERROR_CODE 12 +// 13 #GP 常规保护(有错误代码) +ISR_ERROR_CODE 13 +// 14 #PF 页故障(有错误代码) +ISR_ERROR_CODE 14 +// 15 没有使用 +// 16 #MF 浮点处理单元错误 +ISR_NO_ERROR_CODE 16 +// 17 #AC 对齐检查 +ISR_ERROR_CODE 17 +// 18 #MC 机器检查 +ISR_NO_ERROR_CODE 18 +// 19 #XM SIMD(单指令多数据)浮点异常 +ISR_NO_ERROR_CODE 19 +// 20 #VE 虚拟化异常 +ISR_NO_ERROR_CODE 20 +// 21 ~ 31 保留 +// 32 ~ 255 用户自定义 +// 128=0x80 用于系统调用 +ISR_NO_ERROR_CODE 128 + +// 构造中断请求的宏 +.macro IRQ name, no +.global irq\name +irq\name: + // 关中断 + cli + // 这时候栈的情况 + // EIP + // CS + // EFLAGS + // old_esp(特权级切换时 cpu 压入) + // old_ss(特权级切换时 cpu 压入) + // 压入错误代码,但这里没有传递,所以用 0 占位 + push $0 + // 压入寄存器信息 + pusha + // 压入段寄存器 + push %ds + push %es + push %fs + push %gs + push %ss + // 传递参数 1:intr_context_t + push %esp + // 传递参数 0:中断号 + push $\no + // 调用处理函数 + call irq_handler + // 恢复现场 + // 弹出中断号 + add $4, %esp + // 弹出 intr_context_t + add $4, %esp + // 弹出寄存器 + pop %ss + pop %gs + pop %fs + pop %es + pop %ds + popa + # 弹出占位的 0 + add $4, %esp + iret +.endm + +// 电脑系统计时器 +IRQ 0, 32 +// 键盘 +IRQ 1, 33 +// 与 IRQ9 相接,MPU-401 MD 使用 +IRQ 2, 34 +// 串口设备 +IRQ 3, 35 +// 串口设备 +IRQ 4, 36 +// 建议声卡使用 +IRQ 5, 37 +// 软驱传输控制使用 +IRQ 6, 38 +// 打印机传输控制使用 +IRQ 7, 39 +// 即时时钟 +IRQ 8, 40 +// 与 IRQ2 相接,可设定给其他硬件 +IRQ 9, 41 +// 建议网卡使用 +IRQ 10, 42 +// 建议 AGP 显卡使用 +IRQ 11, 43 +// 接 PS/2 鼠标,也可设定给其他硬件 +IRQ 12, 44 +// 协处理器使用 +IRQ 13, 45 +// IDE0 传输控制使用 +IRQ 14, 46 +// IDE1 传输控制使用 +IRQ 15, 47 diff --git a/src/arch/ia32/i386/intr/timer.cpp b/src/arch/ia32/i386/intr/timer.cpp new file mode 100644 index 000000000..e5a0b8aa1 --- /dev/null +++ b/src/arch/ia32/i386/intr/timer.cpp @@ -0,0 +1,41 @@ + +/** + * @file timer.cpp + * @brief 时钟中断实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2022-01-06 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2022-01-06MRNIU新增文件 + *
+ */ + +#include "cstdio" +#include "intr.h" + +/** + * @brief 时钟中断 + */ +void timer_intr(INTR::intr_context_t*) { + printf("timer.\n"); + return; +} + +TIMER& TIMER::get_instance(void) { + /// 定义全局 TIMER 对象 + static TIMER timer; + return timer; +} + +void TIMER::init(void) { + // 注册中断函数 + INTR::get_instance().register_interrupt_handler(INTR::IRQ0, timer_intr); + // 开启时钟中断 + INTR::get_instance().enable_irq(INTR::IRQ0); + info("timer init.\n"); + return; +} diff --git a/src/arch/ia32/i386/link.ld b/src/arch/ia32/i386/link.ld new file mode 100644 index 000000000..24c1bd9ab --- /dev/null +++ b/src/arch/ia32/i386/link.ld @@ -0,0 +1,245 @@ + +/* This file is a part of Simple-XX/SimpleKernel + * (https://github.com/Simple-XX/SimpleKernel). + * + * link.ld for Simple-XX/SimpleKernel. + * 链接脚本,指定生成的二进制文件的布局 + */ + +/* Script for -z combreloc -z separate-code */ +/* Copyright (C) 2014-2022 Free Software Foundation, Inc. + Copying and distribution of this script, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. */ +/* 指定输出格式 */ +OUTPUT_FORMAT( + "elf32-i386", + "elf32-i386", + "elf32-i386" +) +/* 指定输出架构 */ +OUTPUT_ARCH(i386) +/* 设置入口点 */ +ENTRY(_start) +/* 设置各个 section */ +SECTIONS { + PROVIDE (__executable_start = SEGMENT_START("text-segment", 1M)); + . = SEGMENT_START("text-segment", 1M); + .boot : { *(.text.boot) *(.data.boot) *(.bss.boot) } + .interp : { *(.interp) } + .note.gnu.build-id : { *(.note.gnu.build-id) } + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rela.dyn : { + *(.rela.init) + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + *(.rela.fini) + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + *(.rela.ctors) + *(.rela.dtors) + *(.rela.got) + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + *(.rela.ldata .rela.ldata.* .rela.gnu.linkonce.l.*) + *(.rela.lbss .rela.lbss.* .rela.gnu.linkonce.lb.*) + *(.rela.lrodata .rela.lrodata.* .rela.gnu.linkonce.lr.*) + *(.rela.ifunc) + } + .rela.plt : { + *(.rela.plt) + PROVIDE_HIDDEN (__rela_iplt_start = .); + *(.rela.iplt) + PROVIDE_HIDDEN (__rela_iplt_end = .); + } + .relr.dyn : { *(.relr.dyn) } + . = ALIGN(CONSTANT (MAXPAGESIZE)); + .init : { + KEEP (*(SORT_NONE(.init))) + } + .plt : { *(.plt) *(.iplt) } + .plt.got : { *(.plt.got) } + .plt.sec : { *(.plt.sec) } + .text : { + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(SORT(.text.sorted.*)) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf.em. */ + *(.gnu.warning) + } + .fini : { + KEEP (*(SORT_NONE(.fini))) + } + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + . = ALIGN(CONSTANT (MAXPAGESIZE)); + /* Adjust the address for the rodata segment. We want to adjust up to + the same address within the page on the next page up. */ + . = SEGMENT_START("rodata-segment", ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1))); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } + /* These sections are generated by the Sun/Oracle C++ compiler. */ + .exception_ranges : ONLY_IF_RO { *(.exception_ranges*) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gnu_extab : ONLY_IF_RW { *(.gnu_extab) } + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } + .exception_ranges : ONLY_IF_RW { *(.exception_ranges*) } + /* Thread Local Storage sections */ + .tdata : { + PROVIDE_HIDDEN (__tdata_start = .); + *(.tdata .tdata.* .gnu.linkonce.td.*) + } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .preinit_array : { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + .init_array : { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } + .dynamic : { *(.dynamic) } + .got : { *(.got) *(.igot) } + . = DATA_SEGMENT_RELRO_END (SIZEOF (.got.plt) >= 24 ? 24 : 0, .); + .got.plt : { *(.got.plt) *(.igot.plt) } + .data : { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + _edata = .; PROVIDE (edata = .); + . = .; + __bss_start = .; + .bss : { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we do not + pad the .data section. */ + . = ALIGN(. != 0 ? 64 / 8 : 1); + } + .lbss : { + *(.dynlbss) + *(.lbss .lbss.* .gnu.linkonce.lb.*) + *(LARGE_COMMON) + } + . = ALIGN(64 / 8); + . = SEGMENT_START("ldata-segment", .); + .lrodata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : { + *(.lrodata .lrodata.* .gnu.linkonce.lr.*) + } + .ldata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : { + *(.ldata .ldata.* .gnu.linkonce.l.*) + . = ALIGN(. != 0 ? 64 / 8 : 1); + } + . = ALIGN(64 / 8); + _end = .; PROVIDE (end = .); + . = DATA_SEGMENT_END (.); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1. */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions. */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2. */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2. */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions. */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3. */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /* DWARF 5. */ + .debug_addr 0 : { *(.debug_addr) } + .debug_line_str 0 : { *(.debug_line_str) } + .debug_loclists 0 : { *(.debug_loclists) } + .debug_macro 0 : { *(.debug_macro) } + .debug_names 0 : { *(.debug_names) } + .debug_rnglists 0 : { *(.debug_rnglists) } + .debug_str_offsets 0 : { *(.debug_str_offsets) } + .debug_sup 0 : { *(.debug_sup) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} diff --git a/src/arch/ia32/port/include/port.h b/src/arch/ia32/port/include/port.h new file mode 100644 index 000000000..24dd94fba --- /dev/null +++ b/src/arch/ia32/port/include/port.h @@ -0,0 +1,75 @@ + +/** + * @file port.h + * @brief IA32 端口读写 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_PORT_H +#define SIMPLEKERNEL_PORT_H + +#include "cstdint" + +/** + * @brief 端口读写封装 + */ +namespace PORT { +/** + * @brief 读一个字节 + * @param _port 要读的端口 + * @return uint8_t 读取到的数据 + * @warning 不处理执行失败的问题 + */ +uint8_t inb(const uint32_t _port); + +/** + * @brief 读一个字 + * @param _port 要读的端口 + * @return uint16_t 读取到的数据 + * @warning 不处理执行失败的问题 + */ +uint16_t inw(const uint32_t _port); + +/** + * @brief 读一个双字 + * @param _port 要读的端口 + * @return uint32_t 读取到的数据 + * @warning 不处理执行失败的问题 + */ +uint32_t ind(const uint32_t _port); + +/** + * @brief 写一个字节 + * @param _port 要写的端口 + * @param _data 要写的数据 + * @warning 不处理执行失败的问题 + */ +void outb(const uint32_t _port, const uint8_t _data); + +/** + * @brief 写一个字 + * @param _port 要写的端口 + * @param _data 要写的数据 + * @warning 不处理执行失败的问题 + */ +void outw(const uint32_t _port, const uint16_t _data); + +/** + * @brief 写一个双字 + * @param _port 要写的端口 + * @param _data 要写的数据 + * @warning 不处理执行失败的问题 + */ +void outd(const uint32_t _port, const uint32_t _data); +}; // namespace PORT + +#endif /* SIMPLEKERNEL_PORT_H */ diff --git a/src/arch/ia32/port/port.cpp b/src/arch/ia32/port/port.cpp new file mode 100644 index 000000000..addafc572 --- /dev/null +++ b/src/arch/ia32/port/port.cpp @@ -0,0 +1,50 @@ + +/** + * @file port.cpp + * @brief IA32 端口读写实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "port.h" + +uint8_t PORT::inb(const uint32_t _port) { + uint8_t ret; + __asm__ volatile("inb %1, %0" : "=a"(ret) : "dN"(_port)); + return ret; +} + +uint16_t PORT::inw(const uint32_t _port) { + uint16_t ret; + __asm__ volatile("inw %1, %0" : "=a"(ret) : "dN"(_port)); + return ret; +} + +uint32_t PORT::ind(const uint32_t _port) { + uint32_t ret; + __asm__ volatile("inl %1, %0" : "=a"(ret) : "dN"(_port)); + return ret; +} + +void PORT::outw(const uint32_t _port, const uint16_t _data) { + __asm__ volatile("outw %1, %0" : : "dN"(_port), "a"(_data)); + return; +} + +void PORT::outb(const uint32_t _port, const uint8_t _data) { + __asm__ volatile("outb %1, %0" : : "dN"(_port), "a"(_data)); + return; +} + +void PORT::outd(const uint32_t _port, const uint32_t _data) { + __asm__ volatile("outl %1, %0" : : "dN"(_port), "a"(_data)); + return; +} diff --git a/src/arch/ia32/x86_64/boot/boot.S b/src/arch/ia32/x86_64/boot/boot.S new file mode 100644 index 000000000..6e434d7fb --- /dev/null +++ b/src/arch/ia32/x86_64/boot/boot.S @@ -0,0 +1,281 @@ + +/** + * @file boot.S + * @brief 启动代码,进行一些设置后跳转到 kernel_main + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-01-02MRNIU迁移到 doxygen + *
+ */ + +// 以下是来自 multiboot2 规范的定义 +// How many bytes from the start of the file we search for the header. +#define MULTIBOOT_SEARCH 32768 +#define MULTIBOOT_HEADER_ALIGN 8 + +// The magic field should contain this. +#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 + +// This should be in %eax. +#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289 + +// Alignment of multiboot modules. +#define MULTIBOOT_MOD_ALIGN 0x00001000 + +// Alignment of the multiboot info structure. +#define MULTIBOOT_INFO_ALIGN 0x00000008 + +// Flags set in the 'flags' member of the multiboot header. + +#define MULTIBOOT_TAG_ALIGN 8 +#define MULTIBOOT_TAG_TYPE_END 0 +#define MULTIBOOT_TAG_TYPE_CMDLINE 1 +#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 +#define MULTIBOOT_TAG_TYPE_MODULE 3 +#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 +#define MULTIBOOT_TAG_TYPE_BOOTDEV 5 +#define MULTIBOOT_TAG_TYPE_MMAP 6 +#define MULTIBOOT_TAG_TYPE_VBE 7 +#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 +#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 +#define MULTIBOOT_TAG_TYPE_APM 10 +#define MULTIBOOT_TAG_TYPE_EFI32 11 +#define MULTIBOOT_TAG_TYPE_EFI64 12 +#define MULTIBOOT_TAG_TYPE_SMBIOS 13 +#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 +#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 +#define MULTIBOOT_TAG_TYPE_NETWORK 16 +#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 +#define MULTIBOOT_TAG_TYPE_EFI_BS 18 +#define MULTIBOOT_TAG_TYPE_EFI32_IH 19 +#define MULTIBOOT_TAG_TYPE_EFI64_IH 20 +#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 + +#define MULTIBOOT_HEADER_TAG_END 0 +#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1 +#define MULTIBOOT_HEADER_TAG_ADDRESS 2 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3 +#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4 +#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5 +#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6 +#define MULTIBOOT_HEADER_TAG_EFI_BS 7 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 +#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 +#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 + +#define MULTIBOOT_ARCHITECTURE_I386 0 +#define MULTIBOOT_ARCHITECTURE_MIPS32 4 +#define MULTIBOOT_HEADER_TAG_OPTIONAL 1 + +#define MULTIBOOT_LOAD_PREFERENCE_NONE 0 +#define MULTIBOOT_LOAD_PREFERENCE_LOW 1 +#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2 + +#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1 +#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2 + +// 直接用 -m64 编译出来的是 64 位代码, +// 但是启动后的机器是 32 位的,相当于在 32 位机器上跑 64 位程序。 +// 得加一层跳转到 64 位的 -m32 代码,开启 long 模式后再跳转到以 -m64 +// 编译的代码中 对于 +// x86_64,需要在启动阶段进入长模式(IA32E),这意味着需要一个临时页表 See +// https://wiki.osdev.org/Creating_a_64-bit_kernel: With a 32-bit bootstrap in +// your kernel + +// clang-format off + +// 这部分是从保护模式启动 long 模式的代码 +// 工作在 32bit +// 声明这一段代码以 32 位模式编译 +.code32 +// multiboot2 文件头 +// 计算头长度 +.SET HEADER_LENGTH, multiboot_header_end - multiboot_header +// 计算校验和 +.SET CHECKSUM, -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT_ARCHITECTURE_I386 + HEADER_LENGTH) +// 8 字节对齐 +.align MULTIBOOT_HEADER_ALIGN +// 声明所属段 +.section .text.boot +multiboot_header: + // 魔数 + .long MULTIBOOT2_HEADER_MAGIC + // 架构 + .long MULTIBOOT_ARCHITECTURE_I386 + // 头长度 + .long HEADER_LENGTH + // 校验和 + .long CHECKSUM + // 添加其它内容在此,详细信息见 Multiboot2 Specification version 2.0.pdf + .short MULTIBOOT_HEADER_TAG_END + // 结束标记 + .short 0 + .long 8 +multiboot_header_end: + +// 临时页表 4KB/页 +.section .data.boot +.align 0x1000 +pml4: + .skip 0x1000 +pdpt: + .skip 0x1000 +pd: + .skip 0x1000 +pt: + .skip 0x1000 + +// 临时 GDT +.align 16 +gdt64: +null_desc: + .short 0xFFFF + .short 0 + .byte 0 + .byte 0 + .byte 0 + .byte 0 +code_desc: + .short 0 + .short 0 + .byte 0 + .byte 0x9A + .byte 0x20 + .byte 0 +data_desc: + .short 0 + .short 0 + .byte 0 + .byte 0x92 + .byte 0 + .byte 0 +user_code_desc: + .short 0 + .short 0 + .byte 0 + .byte 0xFA + .byte 0x20 + .byte 0 +user_data_desc: + .short 0 + .short 0 + .byte 0 + .byte 0xF2 + .byte 0 + .byte 0 +gdt64_pointer: + .short gdt64_pointer-gdt64-1 + .quad gdt64 +gdt64_pointer64: + .short gdt64_pointer-gdt64-1 + .quad gdt64 + +.section .text.boot +.global _start +.type _start, @function +// 在 multiboot2.cpp 中定义 +.extern boot_info_addr +.extern multiboot2_magic +_start: + // 关中断 + cli + // multiboot2_info 结构体指针 + mov %ebx, boot_info_addr + // 魔数 + mov %eax, multiboot2_magic + // 从保护模式跳转到长模式 + // 1. 允许 PAE + mov %cr4, %eax + or $(1<<5), %eax + mov %eax, %cr4 + // 2. 设置临时页表 + // 最高级 + mov $pml4, %eax + mov $pdpt, %ebx + or $0x3, %ebx + mov %ebx, 0(%eax) + // 次级 + mov $pdpt, %eax + mov $pd, %ebx + or $0x3, %ebx + mov %ebx, 0(%eax) + // 次低级 + mov $pd, %eax + mov $pt, %ebx + or $0x3, %ebx + mov %ebx, 0(%eax) + // 最低级 + // 循环 512 次,填满一页 + mov $512, %ecx + mov $pt, %eax + mov $0x3, %ebx +.fill_pt: + mov %ebx, 0(%eax) + add $0x1000, %ebx + add $8, %eax + loop .fill_pt + // 填写 CR3 + mov $pml4, %eax + mov %eax, %cr3 + // 3. 切换到 long 模式 + mov $0xC0000080, %ecx + rdmsr + or $(1<<8), %eax + wrmsr + // 4. 开启分页 + mov %cr0, %eax + or $(1<<31), %eax + mov %eax, %cr0 + // 5. 重新设置 GDT + mov $gdt64_pointer, %eax + lgdt 0(%eax) + // 6. 跳转到 64 位代码执行 + jmp $0x8, $_start64 + hlt + ret + +.code64 +.section .text.boot +.global _start64 +.type _start64, @function +.extern kernel_main +.extern cpp_init +_start64: + // 从这里开始就是 long 模式了 + // 加载 64 位 gdt + mov $gdt64_pointer64, %rax + lgdt 0(%rax) + // 更新 + mov $0x10, %rax + mov %rax, %ds + mov %rax, %es + mov %rax, %fs + mov %rax, %gs + mov %rax, %ss + // 设置栈地址 + mov $stack_top, %rsp + // 栈地址按照 4096 字节对齐 + and $0xFFFFFFFFFFFFF000, %rsp + // 帧指针修改为 0 + mov $0, %rbp + // 初始化 C++ + call cpp_init + call kernel_main + hlt + ret + +// 声明所属段 +.section .bss.boot +// 16 字节对齐 +.align 16 +.global stack_top +// 栈 +stack_top: + // 跳过 16KB + .space 4096 * 4 diff --git a/src/arch/ia32/x86_64/gdt/gdt.cpp b/src/arch/ia32/x86_64/gdt/gdt.cpp new file mode 100644 index 000000000..487534388 --- /dev/null +++ b/src/arch/ia32/x86_64/gdt/gdt.cpp @@ -0,0 +1,72 @@ + +/** + * @file gdt.cpp + * @brief 描述符抽象实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "gdt.h" +#include "cstdint" +#include "cstdio" + +namespace GDT { +// 加载 GDTR +extern "C" void gdt_load(uint32_t); +// 全局 gdt 指针 +static gdt_ptr64_t gdt_ptr64; +// 全局描述符表定义 +static gdt_entry_t gdt_entries[GDT_LENGTH] __attribute__((aligned(8))); + +void set_gdt(uint8_t _idx, uint32_t _base, uint32_t _limit, uint8_t _type, + uint8_t _s, uint8_t _dpl, uint8_t _p, uint8_t _avl, uint8_t _l, + uint8_t _db, uint8_t _g) { + gdt_entries[_idx].limit1 = (_limit & 0xFFFF); + gdt_entries[_idx].base_addr1 = (_base & 0xFFFF); + gdt_entries[_idx].base_addr2 = (_base >> 16) & 0xFF; + gdt_entries[_idx].type = _type; + gdt_entries[_idx].s = _s; + gdt_entries[_idx].dpl = _dpl; + gdt_entries[_idx].p = _p; + gdt_entries[_idx].limit2 = (_limit >> 16) & 0x0F; + gdt_entries[_idx].avl = _avl; + gdt_entries[_idx].l = _l; + gdt_entries[_idx].db = _db; + gdt_entries[_idx].g = _g; + gdt_entries[_idx].base_addr3 = (_base >> 24) & 0xFF; + return; +} + +int32_t init(void) { + // 全局描述符表界限 从 0 开始,所以总长要 - 1 + gdt_ptr64.limit = sizeof(gdt_entry_t) * GDT_LENGTH - 1; + gdt_ptr64.base = (uint64_t)&gdt_entries; + // 采用 Intel 平坦模型 + // Intel 文档要求首个描述符全 0 + set_gdt(GDT_NULL, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0); + // 内核指令段 + set_gdt(GDT_KERNEL_CODE, 0x0, 0x0, TYPE_CODE_EXECUTE_READ, S_CODE_DATA, + CPU::DPL0, SEGMENT_PRESENT, 0x0, L_64BIT, 0x0, 0x0); + // 内核数据段 + set_gdt(GDT_KERNEL_DATA, 0x0, 0x0, TYPE_DATA_READ_WRITE, S_CODE_DATA, + CPU::DPL0, SEGMENT_PRESENT, 0x0, L_64BIT, 0x0, 0x0); + // 用户模式代码段 + set_gdt(GDT_USER_CODE, 0x0, 0x0, TYPE_CODE_EXECUTE_READ, S_CODE_DATA, + CPU::DPL3, SEGMENT_PRESENT, 0x0, L_64BIT, 0x0, 0x0); + // 用户模式数据段 + set_gdt(GDT_USER_DATA, 0x0, 0x0, TYPE_DATA_READ_WRITE, S_CODE_DATA, + CPU::DPL3, SEGMENT_PRESENT, 0x0, L_64BIT, 0x0, 0x0); + // 加载全局描述符表地址到 GDTR 寄存器 + gdt_load((uint64_t)&gdt_ptr64); + info("gdt init.\n"); + return 0; +} +}; // namespace GDT diff --git a/src/arch/ia32/x86_64/gdt/gdt_s.S b/src/arch/ia32/x86_64/gdt/gdt_s.S new file mode 100644 index 000000000..db91c40ce --- /dev/null +++ b/src/arch/ia32/x86_64/gdt/gdt_s.S @@ -0,0 +1,29 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +// +// gdt_s.S for Simple-XX/SimpleKernel. + +// clang-format off + +.code64 + +.section .text +.global gdt_load +gdt_load: + cli + // 加载到 GDTR,修改 boot.S 中的设置 + lgdt (%rdi) + + // 加载数据段描述符 + mov $0x10, %rax + // 更新所有可以更新的段寄存器 + mov %rax, %ds + mov %rax, %es + mov %rax, %fs + mov %rax, %gs + mov %rax, %ss + call flush + +flush: + ret diff --git a/src/arch/ia32/x86_64/gdt/include/gdt.h b/src/arch/ia32/x86_64/gdt/include/gdt.h new file mode 100644 index 000000000..3f7eb09fc --- /dev/null +++ b/src/arch/ia32/x86_64/gdt/include/gdt.h @@ -0,0 +1,281 @@ + +/** + * @file gdt.h + * @brief 描述符抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_GDT_H +#define SIMPLEKERNEL_GDT_H + +#include "cpu.hpp" +#include "cstdint" + +/** + * @brief GDT 接口 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual Chapter3 + */ +namespace GDT { +/// 全局描述符表长度 +static constexpr const uint32_t GDT_LENGTH = 5; +/// 各个内存段所在全局描述符表下标 +static constexpr const uint32_t GDT_NULL = 0; +/// 内核代码段 +static constexpr const uint32_t GDT_KERNEL_CODE = 1; +/// 内核数据段 +static constexpr const uint32_t GDT_KERNEL_DATA = 2; +/// 用户代码段 +static constexpr const uint32_t GDT_USER_CODE = 3; +/// 用户数据段 +static constexpr const uint32_t GDT_USER_DATA = 4; +/// 内核代码段选择子 0x08 +static constexpr const uint32_t SEG_KERNEL_CODE = GDT_KERNEL_CODE << 3; +/// 内核数据段选择子 +static constexpr const uint32_t SEG_KERNEL_DATA = GDT_KERNEL_DATA << 3; +/// 用户代码段选择子 +static constexpr const uint32_t SEG_USER_CODE = GDT_USER_CODE << 3; +/// 用户数据段选择子 +static constexpr const uint32_t SEG_USER_DATA = GDT_USER_DATA << 3; + +// type 类型 +// Code-and Data-Segment Types, S=1 +/// @see 64-ia-32-architectures-software-developer-vol-3a-manual#3.4.5.1 +/// 数据段 只读 +static constexpr const uint32_t TYPE_DATA_READ_ONLY = 0x00; +/// 数据段 只读,可访问 +static constexpr const uint32_t TYPE_DATA_READ_ONLY_ACCESSED = 0x01; +/// 数据段 读写 +static constexpr const uint32_t TYPE_DATA_READ_WRITE = 0x02; +/// 数据段,读写,可访问 +static constexpr const uint32_t TYPE_DATA_READ_WRITE_ACCESSED = 0x03; +/// 数据段,只读,? +static constexpr const uint32_t TYPE_DATA_READ_ONLY_EXPAND_DOWN = 0x04; +/// 数据段,只读,?,可访问 +static constexpr const uint32_t TYPE_DATA_READ_ONLY_EXPAND_DOWN_ACCESSED = 0x05; +/// 数据段,读写,? +static constexpr const uint32_t TYPE_DATA_READ_WRITE_EXPAND_DOWN = 0x06; +/// 数据段,读写,?可访问 +static constexpr const uint32_t TYPE_DATA_READ_WRITE_EXPAND_DOWN_ACCESSED + = 0x07; + +/// 代码段,仅执行 +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY = 0x08; +/// 代码段,仅执行,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY_ACCESSED = 0x09; +/// 代码段,可执行,可读 +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ = 0x0A; +/// 代码段,可执行,可读,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ_ACCESSED = 0x0B; +/// 代码段,仅执行,? +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY_CONFORMING = 0x0C; +/// 代码段,仅执行,?,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_ONLY_CONFORMING_ACCESSED + = 0x0D; +/// 代码段,可执行,可读,? +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ_CONFORMING = 0x0E; +/// 代码段,可执行,可读,?,可访问 +static constexpr const uint32_t TYPE_CODE_EXECUTE_READ_CONFORMING_ACCESSED + = 0x0F; + +// System-Segment and Gate-Descriptor Types, 32bit, when S=0 +/// @see 64-ia-32-architectures-software-developer-vol-3a-manual#3.5 +/// LDT +static constexpr const uint32_t TYPE_SYSTEM_LDT = 0x02; +// 64 位 TSS,可用 +static constexpr const uint32_t TYPE_SYSTEM_64_TSS_AVAILABLE = 0x09; +// 64 位 TSS,在用 +static constexpr const uint32_t TYPE_SYSTEM_64_TSS_BUSY = 0x0B; +// 64 位 调用门 +static constexpr const uint32_t TYPE_SYSTEM_64_CALL_GATE = 0x0C; +// 64 位 中断门 +static constexpr const uint32_t TYPE_SYSTEM_64_INTERRUPT_GATE = 0x0E; +// 64 位 陷阱门 +static constexpr const uint32_t TYPE_SYSTEM_64_TRAP_GATE = 0x0F; + +// S 位 +/// 系统段 +static constexpr const uint32_t S_SYSTEM = 0x00; +/// 代码/数据段 +static constexpr const uint32_t S_CODE_DATA = 0x01; + +// 各个段的全局描述符表的选择子 +/// 内核代码段 +static constexpr const uint32_t KERNEL_CS = SEG_KERNEL_CODE | CPU::DPL0; +/// 内核数据段 +static constexpr const uint32_t KERNEL_DS = SEG_KERNEL_DATA | CPU::DPL0; +/// 用户代码段 +static constexpr const uint32_t USER_CS = SEG_USER_CODE | CPU::DPL3; +/// 用户数据段 +static constexpr const uint32_t USER_DS = SEG_USER_DATA | CPU::DPL3; + +// P 位 +/// 无效 +static constexpr const uint32_t SEGMENT_NOT_PRESENT = 0x00; +/// 有效 +static constexpr const uint32_t SEGMENT_PRESENT = 0x01; +// AVL +/// 无效 +static constexpr const uint32_t AVL_NOT_AVAILABLE = 0x00; +/// 有效 +static constexpr const uint32_t AVL_AVAILABLE = 0x01; +// L 位 +/// 32 位 +static constexpr const uint32_t L_32BIT = 0x00; +/// 64 位 +static constexpr const uint32_t L_64BIT = 0x01; +// D/B +/// @todo +static constexpr const uint32_t DB_EXECUTABLE_CODE_SEGMENT_16 = 0x00; +/// @todo +static constexpr const uint32_t DB_EXECUTABLE_CODE_SEGMENT_32 = 0x01; +/// @todo +static constexpr const uint32_t DB_STACK_SEGMENT_STACK_POINTER_16 = 0x00; +/// @todo +static constexpr const uint32_t DB_STACK_SEGMENT_STACK_POINTER_32 = 0x01; +/// @todo +static constexpr const uint32_t DB_EXPAND_DOWN_DATA_SEGMENT_64KB = 0x00; +/// @todo +static constexpr const uint32_t DB_EXPAND_DOWN_DATA_SEGMENT_4GB = 0x01; +// G +/// 字节粒度 +static constexpr const uint32_t G_BYTE = 0x00; +/// 4KB 粒度 +static constexpr const uint32_t G_4KB = 0x01; + +// 访问权限 +/// 内核读,执行 +static constexpr const uint32_t KREAD_EXEC = 0x9A; +/// 内核写 +static constexpr const uint32_t KREAD_WRITE = 0x92; +/// 用户读,执行 +static constexpr const uint32_t UREAD_EXEC = 0xFA; +/// 用户写 +static constexpr const uint32_t UREAD_WRITE = 0xF2; + +/// 段基址 +static constexpr const uint32_t BASE = 0x00; +/// 段长度 +static constexpr const uint32_t LIMIT = 0x00; + +/** + * @brief 全局描述符 + */ +struct gdt_entry_t { + /// 段界限 15:00,long 模式下忽略 + uint64_t limit1 : 16; + /// 基址 15:00,long 模式下忽略 + uint64_t base_addr1 : 16; + /// 基址 23:16,long 模式下忽略 + uint64_t base_addr2 : 8; + /// 类型 + uint64_t type : 4; + /// Descriptor type (0 = system; 1 = code or data) + uint64_t s : 1; + /// Specifies the privilege level of the segment + uint64_t dpl : 2; + /// Indicates whether the segment is present in memory (set) or not + /// present (clear). + uint64_t p : 1; + /// 段界限 19:16,long 模式下忽略 + uint64_t limit2 : 4; + /// Available for use by system software + uint64_t avl : 1; + /// 64-bit code segment (IA-32e mode only) + uint64_t l : 1; + /// Default operation size(0 = 16 - bit segment; 1 = 32 - bit segment) + /// long 模式下忽略 + uint64_t db : 1; + /// Determines the scaling of the segment limit field. When the + /// granularity flag is clear, the segment limit is interpreted in + /// byte units; when flag is set, the segment limit is interpreted in + /// 4-KByte units. + /// long 模式下忽略 + uint64_t g : 1; + /// 基址 31:24,long 模式下忽略 + uint64_t base_addr3 : 8; +} __attribute__((packed)); + +/** + * @brief 全剧描述符寄存器 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#3.5.1 + */ +struct gdt_ptr64_t { + // 全局描述符表限长 + uint16_t limit; + // 全局描述符表 64位 基地址 + uint64_t base; +} __attribute__((packed)); + +/** + * @brief 64 位 tss + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#7.7 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#7.2.3 + * @note 目前没有使用 + */ +struct tss64_t { + uint32_t reserved0; + uint32_t rsp0_lower32; + uint32_t rsp0_upper32; + uint32_t rsp1_lower32; + uint32_t rsp1_upper32; + uint32_t rsp2_lower32; + uint32_t rsp2_upper32; + uint32_t reserved1; + uint32_t reserved2; + uint32_t ist1_lower32; + uint32_t ist1_upper32; + uint32_t ist2_lower32; + uint32_t ist2_upper32; + uint32_t ist3_lower32; + uint32_t ist3_upper32; + uint32_t ist4_lower32; + uint32_t ist4_upper32; + uint32_t ist5_lower32; + uint32_t ist5_upper32; + uint32_t ist6_lower32; + uint32_t ist6_upper32; + uint32_t ist7_lower32; + uint32_t ist7_upper32; + uint32_t reserved3; + uint32_t reserved4; + uint16_t reserved5; + uint16_t io_map_base_addr; +} __attribute__((packed)); + +/** + * @brief 全局描述符表构造函数 + * @param _idx 描述符索引 + * @param _base 基址 + * @param _limit 长度 + * @param _type @todo + * @param _s @todo + * @param _dpl 权限 + * @param _p 有效 + * @param _avl @todo + * @param _l 32/64位 + * @param _db @todo + * @param _g 粒度 + */ +void set_gdt(uint8_t _idx, uint32_t _base, uint32_t _limit, uint8_t _type, + uint8_t _s, uint8_t _dpl, uint8_t _p, uint8_t _avl, uint8_t _l, + uint8_t _db, uint8_t _g); + +/** + * @brief 初始化 + * @return int32_t 成功返回 0 + * @todo 与 32 位合并 + * @todo 精简代码 + */ +int32_t init(void); +}; // namespace GDT + +#endif /* SIMPLEKERNEL_GDT_H */ diff --git a/src/arch/ia32/x86_64/intr/include/intr.h b/src/arch/ia32/x86_64/intr/include/intr.h new file mode 100644 index 000000000..fd6b3c172 --- /dev/null +++ b/src/arch/ia32/x86_64/intr/include/intr.h @@ -0,0 +1,325 @@ + +/** + * @file intr.h + * @brief 中断抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_INTR_H +#define SIMPLEKERNEL_INTR_H + +#include "cstdint" + +/// @todo 升级为 APIC +class INTR { +public: + /** + * @brief 错误码结构 + */ + struct error_code_t { + uint32_t ext : 1; + uint32_t idt : 1; + uint32_t ti : 1; + uint32_t sec_idx : 28; + }; + + /** + * @brief 缺页错误码结构 + */ + struct page_fault_error_code_t { + uint32_t p : 1; + uint32_t wr : 1; + uint32_t us : 1; + uint32_t rsvd : 1; + uint32_t id : 1; + uint32_t pk : 1; + uint32_t reserved1 : 9; + uint32_t sgx : 1; + uint32_t reserved2 : 16; + }; + + /** + * @brief 中断上下文结构 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.12.1 + */ + struct intr_context_t { + uint64_t r15; + uint64_t r14; + uint64_t r13; + uint64_t r12; + uint64_t r11; + uint64_t r10; + uint64_t r9; + uint64_t r8; + uint64_t rbp; + uint64_t rdi; + uint64_t rsi; + uint64_t rdx; + uint64_t rcx; + uint64_t rbx; + uint64_t rax; + uint64_t rip; + uint64_t cs; + uint64_t rflags; + uint64_t rsp; + uint64_t ss; + }; + + // 定义中断处理函数指针 + typedef void (*interrupt_handler_t)(intr_context_t*); + +private: + /// 中断表最大值 + static constexpr const uint32_t INTERRUPT_MAX = 256; + /// 8259A 相关定义 + /// Master (IRQs 0-7) + static constexpr const uint32_t IO_PIC1 = 0x20; + /// Slave (IRQs 8-15) + static constexpr const uint32_t IO_PIC2 = 0xA0; + static constexpr const uint32_t IO_PIC1C = IO_PIC1 + 1; + static constexpr const uint32_t IO_PIC2C = IO_PIC2 + 1; + /// End-of-interrupt command code + static constexpr const uint32_t PIC_EOI = 0x20; + + /// 中断名数组 + static constexpr const char* const intrnames[] = { + "Divide Error", + "Debug Exception", + "NMI Interrupt", + "Breakpoint", + "Overflow", + "BOUND Range Exceeded", + "Invalid Opcode (Undefined Opcode)", + "Device Not Available (No Math Coprocessor)", + "Double Fault", + "Coprocessor Segment Overrun (reserved)", + "Invalid TSS", + "Segment Not Present", + "Stack-Segment Fault", + "General Protection", + "Page Fault", + "(Intel reserved. Do not use.)", + "x87 FPU Floating-Point Error (Math Fault)", + "Alignment Check", + "Machine Check", + "SIMD Floating-Point Exception", + "Virtualization Exception", + }; + + /** + * @brief 中断描述符结构 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.14.1 + */ + struct idt_entry64_t { + // 低位地址 + uint64_t offset0 : 16; + // 选择子 + uint64_t selector : 16; + // 中断栈表 + // 64-ia-32-architectures-software-developer-vol-3a-manual#6.14.5 + uint64_t ist : 3; + // 填充 0 + uint64_t zero0 : 5; + // 类型 + uint64_t type : 4; + // 填充 0 + uint64_t zero1 : 1; + // 权限 + uint64_t dpl : 2; + // 存在位 + uint64_t p : 1; + // 中段地址 + uint64_t offset1 : 16; + // 高位地址 + uint64_t offset2 : 32; + // 保留 + uint64_t reserved : 32; + } __attribute__((packed)); + + /** + * @brief 中断向量寄存器结构 + * @see 64-ia-32-architectures-software-developer-vol-3a-manual#6.10 + */ + struct idt_ptr_t { + // 限长 + uint16_t limit; + // 基址 + uint32_t base; + } __attribute__((packed)); + + /// 中断处理函数指针数组 + static interrupt_handler_t interrupt_handlers[INTERRUPT_MAX] + __attribute__((aligned(4))); + /// 中断描述符表 + static idt_entry64_t idt_entry64[INTERRUPT_MAX] + __attribute__((aligned(16))); + /// IDTR + static idt_ptr_t idt_ptr; + + /** + * @brief 设置中断描述符 + * @param _num 中断号 + * @param _base 基址 + * @param _selector ? + * @param _ist ? + * @param _type ? + * @param _dpl ? + * @param _p ? + */ + void set_idt(uint8_t _num, uintptr_t _base, uint16_t _selector, + uint8_t _ist, uint8_t _type, uint8_t _dpl, uint8_t _p); + + /** + * @brief 8259A 芯片初始化 + */ + void init_interrupt_chip(void); + + /** + * @brief 重设 8259A 芯片 + * @param _no 要重设的中断号 + */ + void clear_interrupt_chip(uint8_t _no); + + /** + * @brief 关闭 8259A 芯片的所有中断,为启动 APIC 作准备 + */ + void disable_interrupt_chip(void); + +public: + // External(hardware generated) interrupts. + // 64-ia-32-architectures-software-developer-vol-3a-manual#6.3.1 + static constexpr const uint32_t INT_DIVIDE_ERROR = 0; + static constexpr const uint32_t INT_DEBUG = 1; + static constexpr const uint32_t INT_NMI = 2; + static constexpr const uint32_t INT_BREAKPOINT = 3; + static constexpr const uint32_t INT_OVERFLOW = 4; + static constexpr const uint32_t INT_BOUND = 5; + static constexpr const uint32_t INT_INVALID_OPCODE = 6; + static constexpr const uint32_t INT_DEVICE_NOT_AVAIL = 7; + static constexpr const uint32_t INT_DOUBLE_FAULT = 8; + static constexpr const uint32_t INT_COPROCESSOR = 9; + static constexpr const uint32_t INT_INVALID_TSS = 10; + static constexpr const uint32_t INT_SEGMENT = 11; + static constexpr const uint32_t INT_STACK_FAULT = 12; + static constexpr const uint32_t INT_GENERAL_PROTECT = 13; + static constexpr const uint32_t INT_PAGE_FAULT = 14; + // 15 没有使用 + static constexpr const uint32_t INT_X87_FPU = 16; + static constexpr const uint32_t INT_ALIGNMENT = 17; + static constexpr const uint32_t INT_MACHINE_CHECK = 18; + static constexpr const uint32_t INT_SIMD_FLOAT = 19; + static constexpr const uint32_t INT_VIRTUAL_EXCE = 20; + // 21~31 保留 + + // 定义IRQ + // 电脑系统计时器 + static constexpr const uint32_t IRQ0 = 32; + // 键盘 + static constexpr const uint32_t IRQ1 = 33; + // 与 IRQ9 相接,MPU-401 MD 使用 + static constexpr const uint32_t IRQ2 = 34; + // 串口设备 + static constexpr const uint32_t IRQ3 = 35; + // 串口设备 + static constexpr const uint32_t IRQ4 = 36; + // 建议声卡使用 + static constexpr const uint32_t IRQ5 = 37; + // 软驱传输控制使用 + static constexpr const uint32_t IRQ6 = 38; + // 打印机传输控制使用 + static constexpr const uint32_t IRQ7 = 39; + // 即时时钟 + static constexpr const uint32_t IRQ8 = 40; + // 与 IRQ2 相接,可设定给其他硬件 + static constexpr const uint32_t IRQ9 = 41; + // 建议网卡使用 + static constexpr const uint32_t IRQ10 = 42; + // 建议 AGP 显卡使用 + static constexpr const uint32_t IRQ11 = 43; + // 接 PS/2 鼠标,也可设定给其他硬件 + static constexpr const uint32_t IRQ12 = 44; + // 协处理器使用 + static constexpr const uint32_t IRQ13 = 45; + // SATA 主硬盘 + static constexpr const uint32_t IRQ14 = 46; + // SATA 从硬盘 + static constexpr const uint32_t IRQ15 = 47; + // 系统调用 + static constexpr const uint32_t IRQ128 = 128; + + /** + * @brief 获取单例 + * @return INTR& 静态对象 + */ + static INTR& get_instance(void); + + /** + * @brief 中断初始化 + * @return int32_t desc + */ + int32_t init(void); + + /** + * @brief 执行中断 + * @param _no 中断号 + * @param _intr_context 上下文 + * @return int32_t 保存中断处理后的返回值 + */ + int32_t call_irq(uint8_t _no, intr_context_t* _intr_context); + + int32_t call_isr(uint8_t _no, intr_context_t* _intr_context); + + /** + * @brief 注册一个中断处理函数 + * @param _no 中断号 + * @param _handler 中断处理函数 + */ + void register_interrupt_handler(uint8_t _no, interrupt_handler_t _handler); + + /** + * @brief 打开指定中断 + * @param _no 要允许的中断号 + */ + void enable_irq(uint8_t _no); + + /** + * @brief 关闭指定中断 + * @param _no 要允许的中断号 + */ + void disable_irq(uint8_t _no); + + /** + * @brief 返回中断名 + * @param _no 中断号 + * @return const char* 对应的中断名 + */ + const char* get_intr_name(uint8_t _no); +}; + +/** + * @brief 时钟抽象 + */ +class TIMER { +public: + /** + * @brief 获取单例 + * @return TIMER& 静态对象 + */ + static TIMER& get_instance(void); + + /** + * @brief 初始化 + */ + void init(void); +}; + +#endif /* SIMPLEKERNEL_INTR_H */ diff --git a/src/arch/ia32/x86_64/intr/intr.cpp b/src/arch/ia32/x86_64/intr/intr.cpp new file mode 100644 index 000000000..f3b33a4be --- /dev/null +++ b/src/arch/ia32/x86_64/intr/intr.cpp @@ -0,0 +1,420 @@ + +/** + * @file intr.cpp + * @brief 中断抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://wiki.0xffffff.org/posts/hurlex-kernel.html + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "intr.h" +#include "apic.h" +#include "cpu.hpp" +#include "cstdio" +#include "gdt.h" +#include "io.h" +#include "keyboard.h" + +// 声明中断处理函数 0 ~ 19 属于 CPU 的异常中断 +// ISR:中断服务程序(interrupt service routine) +/// 0 #DE 除 0 异常 +extern "C" void isr0(void); +/// 1 #DB 调试异常 +extern "C" void isr1(void); +/// 2 NMI +extern "C" void isr2(void); +/// 3 BP 断点异常 +extern "C" void isr3(void); +/// 4 #OF 溢出 +extern "C" void isr4(void); +/// 5 #BR 对数组的引用超出边界 +extern "C" void isr5(void); +/// 6 #UD 无效或未定义的操作码 +extern "C" void isr6(void); +/// 7 #NM 设备不可用(无数学协处理器) +extern "C" void isr7(void); +/// 8 #DF 双重故障(有错误代码) +extern "C" void isr8(void); +/// 9 协处理器跨段操作 +extern "C" void isr9(void); +/// 10 #TS 无效TSS(有错误代码) +extern "C" void isr10(void); +/// 11 #NP 段不存在(有错误代码) +extern "C" void isr11(void); +/// 12 #SS 栈错误(有错误代码) +extern "C" void isr12(void); +/// 13 #GP 常规保护(有错误代码) +extern "C" void isr13(void); +/// 14 #PF 页故障(有错误代码) +extern "C" void isr14(void); +/// 15 没有使用 +/// 16 #MF 浮点处理单元错误 +extern "C" void isr16(void); +/// 17 #AC 对齐检查 +extern "C" void isr17(void); +/// 18 #MC 机器检查 +extern "C" void isr18(void); +/// 19 #XM SIMD(单指令多数据)浮点异常 +extern "C" void isr19(void); +extern "C" void isr20(void); +/// 21 ~ 31 Intel 保留 +/// 32 ~ 255 用户自定义异常 +/// 0x80 用于实现系统调用 +extern "C" void isr128(void); + +/// IRQ:中断请求(Interrupt Request) +/// 电脑系统计时器 +extern "C" void irq0(void); +/// 键盘 +extern "C" void irq1(void); +/// 与 IRQ9 相接,MPU-401 MD 使用 +extern "C" void irq2(void); +/// 串口设备 +extern "C" void irq3(void); +/// 串口设备 +extern "C" void irq4(void); +/// 建议声卡使用 +extern "C" void irq5(void); +/// 软驱传输控制使用 +extern "C" void irq6(void); +/// 打印机传输控制使用 +extern "C" void irq7(void); +/// 即时时钟 +extern "C" void irq8(void); +/// 与 IRQ2 相接,可设定给其他硬件 +extern "C" void irq9(void); +/// 建议网卡使用 +extern "C" void irq10(void); +/// 建议 AGP 显卡使用 +extern "C" void irq11(void); +/// 接 PS/2 鼠标,也可设定给其他硬件 +extern "C" void irq12(void); +/// 协处理器使用 +extern "C" void irq13(void); +/// IDE0 传输控制使用 +extern "C" void irq14(void); +/// IDE1 传输控制使用 +extern "C" void irq15(void); +/// 声明加载 IDTR 的函数 +extern "C" void idt_load(uint32_t); + +/** + * @brief IRQ 处理函数 + */ +extern "C" void irq_handler(uint8_t _no, INTR::intr_context_t* _intr_context) { + INTR::get_instance().call_irq(_no, _intr_context); + return; +} + +/** + * @brief ISR 处理函数 + */ +extern "C" void isr_handler(uint8_t _no, INTR::intr_context_t* _intr_context, + INTR::error_code_t* _err_code) { + (void)_err_code; + INTR::get_instance().call_isr(_no, _intr_context); + return; +} + +// 默认处理函数 +static void handler_default(INTR::intr_context_t*) { + while (1) { + ; + } + return; +} + +// 中断处理函数指针数组 +INTR::interrupt_handler_t INTR::interrupt_handlers[INTERRUPT_MAX]; +// 中断描述符表 +INTR::idt_entry64_t INTR::idt_entry64[INTERRUPT_MAX]; +// IDTR +INTR::idt_ptr_t INTR::idt_ptr; + +// 64-ia-32-architectures-software-developer-vol-3a-manual#6.14.1 +void INTR::set_idt(uint8_t _num, uintptr_t _base, uint16_t _selector, + uint8_t _ist, uint8_t _type, uint8_t _dpl, uint8_t _p) { + idt_entry64[_num].offset0 = _base & 0xFFFF; + idt_entry64[_num].selector = _selector; + idt_entry64[_num].ist = _ist; + idt_entry64[_num].zero0 = 0; + idt_entry64[_num].type = _type; + idt_entry64[_num].zero1 = 0; + idt_entry64[_num].dpl = _dpl; + idt_entry64[_num].p = _p; + idt_entry64[_num].offset1 = (_base >> 16) & 0xFFFF; + idt_entry64[_num].offset2 = _base >> 32; + idt_entry64[_num].reserved = 0; + return; +} + +void INTR::init_interrupt_chip(void) { + // 重新映射 IRQ 表 + // 两片级联的 Intel 8259A 芯片 + // 主片端口 0x20 0x21 + // 从片端口 0xA0 0xA1 + + // 初始化主片、从片 + // 0001 0001 + IO::get_instance().outb(IO_PIC1, 0x11); + // 设置主片 IRQ 从 0x20(32) 号中断开始 + IO::get_instance().outb(IO_PIC1C, IRQ0); + // 设置主片 IR2 引脚连接从片 + IO::get_instance().outb(IO_PIC1C, 0x04); + // 设置主片按照 EOI 的方式工作 + // 在这种模式下,中断处理完后需要通知 8259A 重置 ISR 寄存器 + // 即调用 clear_interrupt_chip() + IO::get_instance().outb(IO_PIC1C, 0x01); + + IO::get_instance().outb(IO_PIC2, 0x11); + // 设置从片 IRQ 从 0x28(40) 号中断开始 + IO::get_instance().outb(IO_PIC2C, IRQ8); + // 告诉从片输出引脚和主片 IR2 号相连 + IO::get_instance().outb(IO_PIC2C, 0x02); + // 设置从片按照 EOI 的方式工作 + IO::get_instance().outb(IO_PIC2C, 0x01); + + // 默认关闭所有中断 + IO::get_instance().outb(IO_PIC1C, 0xFF); + IO::get_instance().outb(IO_PIC2C, 0xFF); + return; +} + +void INTR::clear_interrupt_chip(uint8_t _no) { + // 发送中断结束信号给 PICs + // 按照我们的设置,从 32 号中断起为用户自定义中断 + // 因为单片的 Intel 8259A 芯片只能处理 8 级中断 + // 故大于等于 40 的中断号是由从片处理的 + if (_no >= IRQ8) { + // 发送重设信号给从片 + IO::get_instance().outb(IO_PIC2, PIC_EOI); + } + // 发送重设信号给主片 + IO::get_instance().outb(IO_PIC1, PIC_EOI); + return; +} + +void INTR::disable_interrupt_chip(void) { + // 屏蔽所有中断 + IO::get_instance().outb(IO_PIC1C, 0xFF); + IO::get_instance().outb(IO_PIC2C, 0xFF); + return; +} + +INTR& INTR::get_instance(void) { + /// 定义全局 INTR 对象 + static INTR intr; + return intr; +} + +int32_t INTR::init(void) { + // 填充中断描述符 + idt_ptr.limit = sizeof(idt_entry64_t) * INTERRUPT_MAX - 1; + idt_ptr.base = (uintptr_t)&idt_entry64; + + // 先全部填充 + for (uint32_t i = 0; i < INTERRUPT_MAX; i++) { + set_idt(i, 0x0, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + } + + // 设置软中断 + set_idt(INT_DIVIDE_ERROR, (uintptr_t)isr0, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_DEBUG, (uintptr_t)isr1, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_NMI, (uintptr_t)isr2, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_BREAKPOINT, (uintptr_t)isr3, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_OVERFLOW, (uintptr_t)isr4, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_BOUND, (uintptr_t)isr5, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_INVALID_OPCODE, (uintptr_t)isr6, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_DEVICE_NOT_AVAIL, (uintptr_t)isr7, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_DOUBLE_FAULT, (uintptr_t)isr8, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_COPROCESSOR, (uintptr_t)isr9, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_INVALID_TSS, (uintptr_t)isr10, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_SEGMENT, (uintptr_t)isr11, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_STACK_FAULT, (uintptr_t)isr12, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_GENERAL_PROTECT, (uintptr_t)isr13, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_PAGE_FAULT, (uintptr_t)isr14, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_X87_FPU, (uintptr_t)isr16, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_ALIGNMENT, (uintptr_t)isr17, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_MACHINE_CHECK, (uintptr_t)isr18, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_SIMD_FLOAT, (uintptr_t)isr19, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(INT_VIRTUAL_EXCE, (uintptr_t)isr20, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + + // 设置外部中断 + set_idt(IRQ0, (uintptr_t)irq0, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ1, (uintptr_t)irq1, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ2, (uintptr_t)irq2, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ3, (uintptr_t)irq3, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ4, (uintptr_t)irq4, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ5, (uintptr_t)irq5, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ6, (uintptr_t)irq6, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ7, (uintptr_t)irq7, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ8, (uintptr_t)irq8, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ9, (uintptr_t)irq9, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ10, (uintptr_t)irq10, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ11, (uintptr_t)irq11, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ12, (uintptr_t)irq12, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ13, (uintptr_t)irq13, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ14, (uintptr_t)irq14, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + set_idt(IRQ15, (uintptr_t)irq15, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL0, + GDT::SEGMENT_PRESENT); + // 填充系统调用中断 + set_idt(IRQ128, (uintptr_t)isr128, GDT::SEG_KERNEL_CODE, 0x0, + GDT::TYPE_SYSTEM_64_INTERRUPT_GATE, CPU::DPL3, + GDT::SEGMENT_PRESENT); + // 所有中断设为默认 + for (uint32_t i = 0; i < INTERRUPT_MAX; i++) { + register_interrupt_handler(i, handler_default); + } + // idt 初始化 + init_interrupt_chip(); + // 加载 idt + idt_load((uintptr_t)&idt_ptr); + // APIC 初始化 + apic.init(); + // 键盘初始化 + KEYBOARD::get_instance().init(); + info("intr init.\n"); + return 0; +} + +int32_t INTR::call_irq(uint8_t _no, intr_context_t* _intr_context) { + // 重设PIC芯片 + clear_interrupt_chip(_no); + if (interrupt_handlers[_no] != nullptr) { + interrupt_handlers[_no](_intr_context); + } + return 0; +} + +int32_t INTR::call_isr(uint8_t _no, intr_context_t* _intr_context) { + if (interrupt_handlers[_no] != nullptr) { + interrupt_handlers[_no](_intr_context); + } + else { + warn("Unhandled interrupt: %d %s\n", _no, get_intr_name(_no)); + CPU::hlt(); + } + return 0; +} + +void INTR::register_interrupt_handler(uint8_t _no, + interrupt_handler_t _handler) { + interrupt_handlers[_no] = _handler; + return; +} + +void INTR::enable_irq(uint8_t _no) { + uint8_t mask = 0; + // printk_color(green, "enable_irq mask: %X", mask); + if (_no >= IRQ8) { + mask = ((IO::get_instance().inb(IO_PIC2C)) & (~(1 << (_no % 8)))); + IO::get_instance().outb(IO_PIC2C, mask); + } + else { + mask = ((IO::get_instance().inb(IO_PIC1C)) & (~(1 << (_no % 8)))); + IO::get_instance().outb(IO_PIC1C, mask); + } + return; +} + +void INTR::disable_irq(uint8_t _no) { + uint8_t mask = 0; + // printk_color(green, "disable_irq mask: %X", mask); + if (_no >= IRQ8) { + mask = ((IO::get_instance().inb(IO_PIC2C)) | (1 << (_no % 8))); + IO::get_instance().outb(IO_PIC2C, mask); + } + else { + mask = ((IO::get_instance().inb(IO_PIC1C)) | (1 << (_no % 8))); + IO::get_instance().outb(IO_PIC1C, mask); + } + return; +} + +const char* INTR::get_intr_name(uint8_t _no) { + if (_no < sizeof(intrnames) / sizeof(const char* const)) { + return intrnames[_no]; + } + return "(unknown trap)"; +} diff --git a/src/arch/ia32/x86_64/intr/intr_s.S b/src/arch/ia32/x86_64/intr/intr_s.S new file mode 100644 index 000000000..3bf7f1344 --- /dev/null +++ b/src/arch/ia32/x86_64/intr/intr_s.S @@ -0,0 +1,226 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +# +// intr_s.s for Simple-XX/SimpleKernel. + +// clang-format off + +.code64 + +// 加载 idt +.section .text +.global idt_load +idt_load: + // 参数保存在 edi + mov %edi, %eax + lidt 0(%eax) + ret + +// 64-ia-32-architectures-software-developer-vol-3a-manual#6.14 +// TODO: 特权级切换时候的情况 +// 这里用的是 att 的汇编宏 +// 格式为 +// .macro 宏名称 参数1, 参数2 +// 内容 +// .endm + +// pusha 的 64 位版本 +// 通用寄存器的保存和恢复 +// ss~rip 由 CPU 压入 +.macro pusha_64 + push %rax + push %rbx + push %rcx + push %rdx + push %rsi + push %rdi + push %rbp + push %r8 + push %r9 + push %r10 + push %r11 + push %r12 + push %r13 + push %r14 + push %r15 +.endm + +// popa 的 64 位版本 +// ss~rip 由 CPU 弹出 +.macro popa_64 + pop %r15 + pop %r14 + pop %r13 + pop %r12 + pop %r11 + pop %r10 + pop %r9 + pop %r8 + pop %rbp + pop %rdi + pop %rsi + pop %rdx + pop %rcx + pop %rbx + pop %rax +.endm + +// 声明 C 中的函数 +.extern isr_handler +.macro ISR_NO_ERROR_CODE no +.global isr\no +isr\no: + // 关中断 + cli + // 保存现场 + pusha_64 + // 传递中断号 + mov $\no, %rdi + // 传递 + mov %rsp, %rsi + // 清零 + xor %rdx, %rdx + xor %rbp, %rbp + // 调用处理函数 + call isr_handler + // 恢复现场 + popa_64 + // 中断返回 + iretq +.endm + +.macro ISR_ERROR_CODE no +.global isr\no +isr\no: + // 关中断 + cli + // 压栈 intr_context_t 的最后几个成员 + // 40(%rsp) 是因为每次压栈都会使 rsp+8,执行完后 rsp 刚好移动到下一个数据 + // 在 64 位模式下,不论特权级是否改变,都会压入 ss,rsp + // 64-ia-32-architectures-software-developer-vol-3a-manual#6.14.2 + // SS + push 40(%rsp) + // RSP + push 40(%rsp) + // RFLAGS + push 40(%rsp) + // CS + push 40(%rsp) + // RIP + push 40(%rsp) + pusha_64 + // 传递中断号 + mov $\no, %rdi + // 传递栈地址 + mov %rsp, %rsi + // 传递错误码 + // 160==sizeof(intr_context_t) + // 相当于函数开始时的 0(%rsp) + mov 160(%rsp), %rdx + xor %rbp, %rbp + call isr_handler + popa_64 + iretq +.endm + +// 定义中断处理函数 +// 64-ia-32-architectures-software-developer-vol-3a-manual#Table 6-1 +// 0 #DE 除 0 异常 +ISR_NO_ERROR_CODE 0 +// 1 #DB 调试异常 +ISR_NO_ERROR_CODE 1 +// 2 NMI +ISR_NO_ERROR_CODE 2 +// 3 BP 断点异常 +ISR_NO_ERROR_CODE 3 +// 4 #OF 溢出 +ISR_NO_ERROR_CODE 4 +// 5 #BR 对数组的引用超出边界 +ISR_NO_ERROR_CODE 5 +// 6 #UD 无效或未定义的操作码 +ISR_NO_ERROR_CODE 6 +// 7 #NM 设备不可用(无数学协处理器) +ISR_NO_ERROR_CODE 7 +// 8 #DF 双重故障(有错误代码) +ISR_ERROR_CODE 8 +// 9 协处理器跨段操作 +ISR_NO_ERROR_CODE 9 +// 10 #TS 无效TSS(有错误代码) +ISR_ERROR_CODE 10 +// 11 #NP 段不存在(有错误代码) +ISR_ERROR_CODE 11 +// 12 #SS 栈错误(有错误代码) +ISR_ERROR_CODE 12 +// 13 #GP 常规保护(有错误代码) +ISR_ERROR_CODE 13 +// 14 #PF 页故障(有错误代码) +ISR_ERROR_CODE 14 +// 15 没有使用 +// 16 #MF 浮点处理单元错误 +ISR_NO_ERROR_CODE 16 +// 17 #AC 对齐检查 +ISR_ERROR_CODE 17 +// 18 #MC 机器检查 +ISR_NO_ERROR_CODE 18 +// 19 #XM SIMD(单指令多数据)浮点异常 +ISR_NO_ERROR_CODE 19 +// 20 #VE 虚拟化异常 +ISR_NO_ERROR_CODE 20 +// 21 ~ 31 保留 +// 32 ~ 255 用户自定义 +// 128=0x80 用于系统调用 +ISR_NO_ERROR_CODE 128 + +// 声明 C 中的函数 +.extern irq_handler +.macro IRQ name, no +.global irq\name +irq\name: + // 关中断 + cli + // 保存寄存器 + pusha_64 + // 传递中断号 + mov $\no, %rdi + // 传递栈地址 + mov %rsp, %rsi + xor %rdx, %rdx + xor %rbp, %rbp + call irq_handler + popa_64 + iretq +.endm + +// 电脑系统计时器 +IRQ 0, 32 +// 键盘 +IRQ 1, 33 +// 与 IRQ9 相接,MPU-401 MD 使用 +IRQ 2, 34 +// 串口设备 +IRQ 3, 35 +// 串口设备 +IRQ 4, 36 +// 建议声卡使用 +IRQ 5, 37 +// 软驱传输控制使用 +IRQ 6, 38 +// 打印机传输控制使用 +IRQ 7, 39 +// 即时时钟 +IRQ 8, 40 +// 与 IRQ2 相接,可设定给其他硬件 +IRQ 9, 41 +// 建议网卡使用 +IRQ 10, 42 +// 建议 AGP 显卡使用 +IRQ 11, 43 +// 接 PS/2 鼠标,也可设定给其他硬件 +IRQ 12, 44 +// 协处理器使用 +IRQ 13, 45 +// IDE0 传输控制使用 +IRQ 14, 46 +// IDE1 传输控制使用 +IRQ 15, 47 diff --git a/src/arch/ia32/x86_64/intr/timer.cpp b/src/arch/ia32/x86_64/intr/timer.cpp new file mode 100644 index 000000000..e5a0b8aa1 --- /dev/null +++ b/src/arch/ia32/x86_64/intr/timer.cpp @@ -0,0 +1,41 @@ + +/** + * @file timer.cpp + * @brief 时钟中断实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2022-01-06 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2022-01-06MRNIU新增文件 + *
+ */ + +#include "cstdio" +#include "intr.h" + +/** + * @brief 时钟中断 + */ +void timer_intr(INTR::intr_context_t*) { + printf("timer.\n"); + return; +} + +TIMER& TIMER::get_instance(void) { + /// 定义全局 TIMER 对象 + static TIMER timer; + return timer; +} + +void TIMER::init(void) { + // 注册中断函数 + INTR::get_instance().register_interrupt_handler(INTR::IRQ0, timer_intr); + // 开启时钟中断 + INTR::get_instance().enable_irq(INTR::IRQ0); + info("timer init.\n"); + return; +} diff --git a/src/arch/ia32/x86_64/link.ld b/src/arch/ia32/x86_64/link.ld new file mode 100644 index 000000000..fecae84ec --- /dev/null +++ b/src/arch/ia32/x86_64/link.ld @@ -0,0 +1,245 @@ + +/* This file is a part of Simple-XX/SimpleKernel + * (https://github.com/Simple-XX/SimpleKernel). + * + * link.ld for Simple-XX/SimpleKernel. + * 链接脚本,指定生成的二进制文件的布局 + */ + +/* Script for -z combreloc -z separate-code */ +/* Copyright (C) 2014-2022 Free Software Foundation, Inc. + Copying and distribution of this script, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. */ +/* 指定输出格式 */ +OUTPUT_FORMAT( + "elf64-x86-64", + "elf64-x86-64", + "elf64-x86-64" +) +/* 指定输出架构 */ +OUTPUT_ARCH(i386:x86-64) +/* 设置入口点 */ +ENTRY(_start) +/* 设置各个 section */ +SECTIONS { + PROVIDE (__executable_start = SEGMENT_START("text-segment", 1M)); + . = SEGMENT_START("text-segment", 1M); + .boot : { *(.text.boot) *(.data.boot) *(.bss.boot) } + .interp : { *(.interp) } + .note.gnu.build-id : { *(.note.gnu.build-id) } + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rela.dyn : { + *(.rela.init) + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + *(.rela.fini) + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + *(.rela.ctors) + *(.rela.dtors) + *(.rela.got) + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + *(.rela.ldata .rela.ldata.* .rela.gnu.linkonce.l.*) + *(.rela.lbss .rela.lbss.* .rela.gnu.linkonce.lb.*) + *(.rela.lrodata .rela.lrodata.* .rela.gnu.linkonce.lr.*) + *(.rela.ifunc) + } + .rela.plt : { + *(.rela.plt) + PROVIDE_HIDDEN (__rela_iplt_start = .); + *(.rela.iplt) + PROVIDE_HIDDEN (__rela_iplt_end = .); + } + .relr.dyn : { *(.relr.dyn) } + . = ALIGN(CONSTANT (MAXPAGESIZE)); + .init : { + KEEP (*(SORT_NONE(.init))) + } + .plt : { *(.plt) *(.iplt) } + .plt.got : { *(.plt.got) } + .plt.sec : { *(.plt.sec) } + .text : { + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(SORT(.text.sorted.*)) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf.em. */ + *(.gnu.warning) + } + .fini : { + KEEP (*(SORT_NONE(.fini))) + } + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + . = ALIGN(CONSTANT (MAXPAGESIZE)); + /* Adjust the address for the rodata segment. We want to adjust up to + the same address within the page on the next page up. */ + . = SEGMENT_START("rodata-segment", ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1))); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } + /* These sections are generated by the Sun/Oracle C++ compiler. */ + .exception_ranges : ONLY_IF_RO { *(.exception_ranges*) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gnu_extab : ONLY_IF_RW { *(.gnu_extab) } + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } + .exception_ranges : ONLY_IF_RW { *(.exception_ranges*) } + /* Thread Local Storage sections */ + .tdata : { + PROVIDE_HIDDEN (__tdata_start = .); + *(.tdata .tdata.* .gnu.linkonce.td.*) + } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .preinit_array : { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + .init_array : { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } + .dynamic : { *(.dynamic) } + .got : { *(.got) *(.igot) } + . = DATA_SEGMENT_RELRO_END (SIZEOF (.got.plt) >= 24 ? 24 : 0, .); + .got.plt : { *(.got.plt) *(.igot.plt) } + .data : { + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + _edata = .; PROVIDE (edata = .); + . = .; + __bss_start = .; + .bss : { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we do not + pad the .data section. */ + . = ALIGN(. != 0 ? 64 / 8 : 1); + } + .lbss : { + *(.dynlbss) + *(.lbss .lbss.* .gnu.linkonce.lb.*) + *(LARGE_COMMON) + } + . = ALIGN(64 / 8); + . = SEGMENT_START("ldata-segment", .); + .lrodata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : { + *(.lrodata .lrodata.* .gnu.linkonce.lr.*) + } + .ldata ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)) : { + *(.ldata .ldata.* .gnu.linkonce.l.*) + . = ALIGN(. != 0 ? 64 / 8 : 1); + } + . = ALIGN(64 / 8); + _end = .; PROVIDE (end = .); + . = DATA_SEGMENT_END (.); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1. */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions. */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2. */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2. */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions. */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3. */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /* DWARF 5. */ + .debug_addr 0 : { *(.debug_addr) } + .debug_line_str 0 : { *(.debug_line_str) } + .debug_loclists 0 : { *(.debug_loclists) } + .debug_macro 0 : { *(.debug_macro) } + .debug_names 0 : { *(.debug_names) } + .debug_rnglists 0 : { *(.debug_rnglists) } + .debug_str_offsets 0 : { *(.debug_str_offsets) } + .debug_sup 0 : { *(.debug_sup) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} diff --git a/src/arch/riscv64/CMakeLists.txt b/src/arch/riscv64/CMakeLists.txt new file mode 100644 index 000000000..40f4d2c60 --- /dev/null +++ b/src/arch/riscv64/CMakeLists.txt @@ -0,0 +1,31 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 架构相关子模块的编译规则 + +# 设置子模块名与使用的语言 +PROJECT(arch CXX ASM) + +# 寻找汇编文件 +find_asm_source_files(boot_asm_src ${arch_SOURCE_DIR}/boot) +# 添加到 boot_src +set(boot_src ${boot_asm_src}) + +find_asm_source_files(intr_asm_src ${arch_SOURCE_DIR}/intr) +aux_source_directory(${arch_SOURCE_DIR}/intr intr_cpp_src) +set(intr_src ${intr_asm_src} ${intr_cpp_src}) + +set(arch_src ${boot_src} ${intr_src}) + +# 添加子模块 +add_library(${PROJECT_NAME} OBJECT ${arch_src}) + +# 添加头文件搜索路径 +target_include_arch_header_files(${PROJECT_NAME}) +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) +target_include_kernel_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) +target_include_drv_header_files(${PROJECT_NAME}) diff --git a/src/arch/riscv64/boot/boot.S b/src/arch/riscv64/boot/boot.S new file mode 100644 index 000000000..be76a1113 --- /dev/null +++ b/src/arch/riscv64/boot/boot.S @@ -0,0 +1,48 @@ + +/** + * @file boot.S + * @brief 启动代码,进行一些设置后跳转到 kernel_main + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-01-01MRNIU迁移到 doxygen + *
+ */ + +// clang-format off + +.section .text.boot +.global _start +.type _start, @function +.extern kernel_main +.extern cpp_init +.extern boot_info_addr +.extern dtb_init_hart +_start: + // 保存 sbi 传递的参数 + // 将 a0 的值传递给 dtb_init_hart + sw a0, dtb_init_hart, t0 + // 将 a1 的值传递给 boot_info_addr + sw a1, boot_info_addr, t0 + // 设置栈地址 + la sp, stack_top + // 初始化 C++ + call cpp_init + // 跳转到 C 代码执行 + call kernel_main +loop: + j loop + +// 声明所属段 +.section .bss.boot +// 16 字节对齐 +.align 16 +.global stack_top +stack_top: + // 跳过 16KB + .space 4096 * 4 diff --git a/src/arch/riscv64/context.S b/src/arch/riscv64/context.S new file mode 100644 index 000000000..e1902d2eb --- /dev/null +++ b/src/arch/riscv64/context.S @@ -0,0 +1,218 @@ + +/** + * @file context.S + * @brief 上下文保存 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-01-01MRNIU迁移到 doxygen + *
+ */ + +// clang-format off + +// 寄存器长度,8 字节 +.equ REG_BYTES, 8 +// 所有寄存器数量 +.equ ALL_REGS, 71 +// 保存所有寄存器需要的大小 +.equ ALL_SIZE, (ALL_REGS * REG_BYTES) + +// 将寄存器 a 保存在 c 偏移 b 的位置 +.macro sd_base a, b, c +sd \a, ((\b) * REG_BYTES)(\c) +.endm + +// 从 c 的偏移 b 处获取数据并赋值给寄存器 a +.macro ld_base a, b, c +ld \a, ((\b) * REG_BYTES)(\c) +.endm + +// 将 float 寄存器 a 保存在 c 偏移 b 的位置 +.macro fsd_base a, b, c +fsd \a, ((\b) * REG_BYTES)(\c) +.endm + +// 从 c 的偏移 b 处获取数据并赋值给 float 寄存器 a +.macro fld_base a, b, c +fld \a, ((\b) * REG_BYTES)(\c) +.endm + +/** + * @brief 保存所有寄存器 + * @param _base 要保存到的基地址 + */ +.macro all_regs_save _base + sd_base zero, 0, \_base + sd_base ra, 1, \_base + sd_base sp, 2, \_base + sd_base gp, 3, \_base + sd_base tp, 4, \_base + sd_base t0, 5, \_base + sd_base t1, 6, \_base + sd_base t2, 7, \_base + sd_base s0, 8, \_base + sd_base s1, 9, \_base + sd_base a0, 10, \_base + sd_base a1, 11, \_base + sd_base a2, 12, \_base + sd_base a3, 13, \_base + sd_base a4, 14, \_base + sd_base a5, 15, \_base + sd_base a6, 16, \_base + sd_base a7, 17, \_base + sd_base s2, 18, \_base + sd_base s3, 19, \_base + sd_base s4, 20, \_base + sd_base s5, 21, \_base + sd_base s6, 22, \_base + sd_base s7, 23, \_base + sd_base s8, 24, \_base + sd_base s9, 25, \_base + sd_base s10, 26, \_base + sd_base s11, 27, \_base + sd_base t3, 28, \_base + sd_base t4, 29, \_base + sd_base t5, 30, \_base + sd_base t6, 31, \_base + + fsd_base ft0, 32, \_base + fsd_base ft1, 33, \_base + fsd_base ft2, 34, \_base + fsd_base ft3, 35, \_base + fsd_base ft4, 36, \_base + fsd_base ft5, 37, \_base + fsd_base ft6, 38, \_base + fsd_base ft7, 39, \_base + fsd_base fs0, 40, \_base + fsd_base fs1, 41, \_base + fsd_base fa0, 42, \_base + fsd_base fa1, 43, \_base + fsd_base fa2, 44, \_base + fsd_base fa3, 45, \_base + fsd_base fa4, 46, \_base + fsd_base fa5, 47, \_base + fsd_base fa6, 48, \_base + fsd_base fa7, 49, \_base + fsd_base fs2, 50, \_base + fsd_base fs3, 51, \_base + fsd_base fs4, 52, \_base + fsd_base fs5, 53, \_base + fsd_base fs6, 54, \_base + fsd_base fs7, 55, \_base + fsd_base fs8, 56, \_base + fsd_base fs9, 57, \_base + fsd_base fs10, 58, \_base + fsd_base fs11, 59, \_base + fsd_base ft8, 60, \_base + fsd_base ft9, 61, \_base + fsd_base ft10, 62, \_base + fsd_base ft11, 63, \_base + + csrr t0, sepc + sd_base t0, 64, \_base + csrr t0, stval + sd_base t0, 65, \_base + csrr t0, scause + sd_base t0, 66, \_base + csrr t0, sie + sd_base t0, 67, \_base + csrr t0, sstatus + sd_base t0, 68, \_base + csrr t0, satp + sd_base t0, 69, \_base + csrr t0, sscratch + sd_base t0, 70, \_base +.endm + +/** + * @brief 恢复所有寄存器 + * @param _base 要恢复数据的基地址 + */ +.macro all_regs_load _base + ld_base t0, 64, \_base + csrw sepc, t0 + ld_base t0, 65, \_base + csrw stval, t0 + ld_base t0, 66, \_base + csrw scause, t0 + ld_base t0, 67, \_base + csrw sie, t0 + ld_base t0, 68, \_base + csrw sstatus, t0 + ld_base t0, 69, \_base + csrw satp, t0 + ld_base t0, 70, \_base + csrw sscratch, t0 + + ld_base zero, 0, \_base + ld_base ra, 1, \_base + ld_base sp, 2, \_base + ld_base gp, 3, \_base + ld_base tp, 4, \_base + ld_base t0, 5, \_base + ld_base t1, 6, \_base + ld_base t2, 7, \_base + ld_base s0, 8, \_base + ld_base s1, 9, \_base + ld_base a0, 10, \_base + ld_base a1, 11, \_base + ld_base a2, 12, \_base + ld_base a3, 13, \_base + ld_base a4, 14, \_base + ld_base a5, 15, \_base + ld_base a6, 16, \_base + ld_base a7, 17, \_base + ld_base s2, 18, \_base + ld_base s3, 19, \_base + ld_base s4, 20, \_base + ld_base s5, 21, \_base + ld_base s6, 22, \_base + ld_base s7, 23, \_base + ld_base s8, 24, \_base + ld_base s9, 25, \_base + ld_base s10, 26, \_base + ld_base s11, 27, \_base + ld_base t3, 28, \_base + ld_base t4, 29, \_base + ld_base t5, 30, \_base + ld_base t6, 31, \_base + + fld_base ft0, 32, \_base + fld_base ft1, 33, \_base + fld_base ft2, 34, \_base + fld_base ft3, 35, \_base + fld_base ft4, 36, \_base + fld_base ft5, 37, \_base + fld_base ft6, 38, \_base + fld_base ft7, 39, \_base + fld_base fs0, 40, \_base + fld_base fs1, 41, \_base + fld_base fa0, 42, \_base + fld_base fa1, 43, \_base + fld_base fa2, 44, \_base + fld_base fa3, 45, \_base + fld_base fa4, 46, \_base + fld_base fa5, 47, \_base + fld_base fa6, 48, \_base + fld_base fa7, 49, \_base + fld_base fs2, 50, \_base + fld_base fs3, 51, \_base + fld_base fs4, 52, \_base + fld_base fs5, 53, \_base + fld_base fs6, 54, \_base + fld_base fs7, 55, \_base + fld_base fs8, 56, \_base + fld_base fs9, 57, \_base + fld_base fs10, 58, \_base + fld_base fs11, 59, \_base + fld_base ft8, 60, \_base + fld_base ft9, 61, \_base + fld_base ft10, 62, \_base + fld_base ft11, 63, \_base +.endm diff --git a/src/arch/riscv64/cpu.hpp b/src/arch/riscv64/cpu.hpp new file mode 100644 index 000000000..896f4ee82 --- /dev/null +++ b/src/arch/riscv64/cpu.hpp @@ -0,0 +1,808 @@ + +/** + * @file cpu.hpp + * @brief cpu 相关定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_CPU_HPP +#define SIMPLEKERNEL_CPU_HPP + +#include "cstdbool" +#include "cstdint" +#include "cstdio" +#include "iostream" + +/** + * @brief cpu 相关 + * @todo + */ +namespace CPU { +/** + * @brief pte 结构 + * @todo 使用 pte 结构重写 vmm + */ +struct pte_t { + enum { + VALID_OFFSET = 0, + READ_OFFSET = 1, + WRITE_OFFSET = 2, + EXEC_OFFSET = 3, + USER_OFFSET = 4, + GLOBAL_OFFSET = 5, + ACCESSED_OFFSET = 6, + DIRTY_OFFSET = 7, + VALID = 1 << VALID_OFFSET, + READ = 1 << READ_OFFSET, + WRITE = 1 << WRITE_OFFSET, + EXEC = 1 << EXEC_OFFSET, + USER = 1 << USER_OFFSET, + GLOBAL = 1 << GLOBAL_OFFSET, + ACCESSED = 1 << ACCESSED_OFFSET, + DIRTY = 1 << DIRTY_OFFSET, + }; + + union { + struct { + uint64_t flags : 8; + uint64_t rsw : 2; + uint64_t ppn : 44; + uint64_t reserved : 10; + }; + + uint64_t val; + }; + + pte_t(void) { + val = 0; + return; + } + + pte_t(uint64_t _val) : val(_val) { + return; + } + + friend std::ostream& operator<<(std::ostream& _os, const pte_t& _pte) { + printf("val: 0x%p, valid: %s, read: %s, write: %s, exec: %s, user: %s, " + "global: %s, accessed: %s, dirty: %s, rsw: 0x%p, ppn: 0x%p", + _pte.val, (_pte.flags & VALID) == VALID ? "true" : "false", + (_pte.flags & READ) == READ ? "true" : "false", + (_pte.flags & WRITE) == WRITE ? "true" : "false", + (_pte.flags & EXEC) == EXEC ? "true" : "false", + (_pte.flags & USER) == USER ? "true" : "false", + (_pte.flags & GLOBAL) == GLOBAL ? "true" : "false", + (_pte.flags & ACCESSED) == ACCESSED ? "true" : "false", + (_pte.flags & DIRTY) == DIRTY ? "true" : "false", _pte.rsw, + _pte.ppn); + return _os; + } +}; + +/** + * @brief satp 结构 + */ +struct satp_t { + enum { + NONE = 0, + SV39 = 8, + SV48 = 9, + SV57 = 10, + SV64 = 11, + }; + + static constexpr const char* MODE_NAME[] = { + [NONE] = "NONE", "UNKNOWN", "UNKNOWN", "UNKNOWN", + "UNKNOWN", "UNKNOWN", "UNKNOWN", "UNKNOWN", + [SV39] = "SV39", [SV48] = "SV48", [SV57] = "SV57", [SV64] = "SV64", + }; + + union { + struct { + uint64_t ppn : 44; + uint64_t asid : 16; + uint64_t mode : 4; + }; + + uint64_t val; + }; + + static constexpr const uint64_t PPN_OFFSET = 12; + + satp_t(void) { + val = 0; + return; + } + + satp_t(uint64_t _val) : val(_val) { + return; + } + + friend std::ostream& operator<<(std::ostream& _os, const satp_t& _satp) { + printf("val: 0x%p, ppn: 0x%p, asid: 0x%p, mode: %s", _satp.val, + _satp.ppn, _satp.asid, MODE_NAME[_satp.mode]); + return _os; + } +}; + +/// 机器模式定义 +enum { + U_MODE = 0, + S_MODE = 1, + M_MODE = 3, +}; + +enum { + INTR_SOFT = 0, + /// U 态软中断 + INTR_SOFT_U = INTR_SOFT + U_MODE, + /// S 态软中断 + INTR_SOFT_S = INTR_SOFT + S_MODE, + /// M 态软中断 + INTR_SOFT_M = INTR_SOFT + M_MODE, + INTR_TIMER = 4, + /// U 态时钟中断 + INTR_TIMER_U = INTR_TIMER + U_MODE, + /// S 态时钟中断 + INTR_TIMER_S = INTR_TIMER + S_MODE, + /// M 态时钟中断 + INTR_TIMER_M = INTR_TIMER + M_MODE, + INTR_EXTERN = 8, + /// U 态外部中断 + INTR_EXTERN_U = INTR_EXTERN + U_MODE, + /// S 态外部中断 + INTR_EXTERN_S = INTR_EXTERN + S_MODE, + /// M 态外部中断 + INTR_EXTERN_M = INTR_EXTERN + M_MODE, +}; + +enum { + EXCP_INSTRUCTION_ADDRESS_MISALIGNED = 0, + EXCP_INSTRUCTION_ACCESS_FAULT = 1, + EXCP_ILLEGAL_INSTRUCTION = 2, + EXCP_BREAKPOINT = 3, + EXCP_LOAD_ADDRESS_MISALIGNED = 4, + EXCP_LOAD_ACCESS_FAULT = 5, + EXCP_STORE_AMO_ADDRESS_MISALIGNED = 6, + EXCP_STORE_AMO_ACCESS_FAULT = 7, + EXCP_ECALL = 8, + EXCP_ECALL_U = EXCP_ECALL + U_MODE, + EXCP_ECALL_S = EXCP_ECALL + S_MODE, + EXCP_ECALL_M = EXCP_ECALL + M_MODE, + EXCP_INSTRUCTION_PAGE_FAULT = 12, + EXCP_LOAD_PAGE_FAULT = 13, + EXCP_STORE_AMO_PAGE_FAULT = 15, +}; + +// Supervisor Status Register, sstatus +// User Interrupt Enable +static constexpr const uint64_t SSTATUS_UIE = 1 << 0; +// Supervisor Interrupt Enable +static constexpr const uint64_t SSTATUS_SIE = 1 << 1; +// User Previous Interrupt Enable +static constexpr const uint64_t SSTATUS_UPIE = 1 << 4; +// Supervisor Previous Interrupt Enable +static constexpr const uint64_t SSTATUS_SPIE = 1 << 5; +// Previous mode, 1=Supervisor, 0=User +static constexpr const uint64_t SSTATUS_SPP = 1 << 8; + +/** + * @brief mstatus 寄存器定义 + */ +struct mstatus_t { + union { + struct { + // interrupt enable + uint64_t ie : 4; + // previous interrupt enable + uint64_t pie : 4; + // previous mode (supervisor) + uint64_t spp : 1; + uint64_t unused1 : 2; + // previous mode (machine) + uint64_t mpp : 2; + // FPU status + uint64_t fs : 2; + // extensions status + uint64_t xs : 2; + // modify privilege + uint64_t mprv : 1; + // permit supervisor user memory access + uint64_t sum : 1; + // make executable readable + uint64_t mxr : 1; + // trap virtual memory + uint64_t tvm : 1; + // timeout wait (trap WFI) + uint64_t tw : 1; + // trap SRET + uint64_t tsr : 1; + uint64_t unused2 : 9; + // U-mode XLEN + uint64_t uxl : 2; + // S-mode XLEN + uint64_t sxl : 2; + uint64_t unused3 : 27; + // status dirty + uint64_t sd : 1; + }; + + uint64_t val; + }; + + mstatus_t(void) { + val = 0; + return; + } + + mstatus_t(uint64_t _val) : val(_val) { + return; + } +}; + +/** + * @brief sstatus 寄存器定义 + */ +struct sstatus_t { + union { + struct { + // Reserved Writes Preserve Values, Reads Ignore Values (WPRI) + uint64_t wpri1 : 1; + // interrupt enable + uint64_t sie : 1; + uint64_t wpri12 : 3; + // previous interrupt enable + uint64_t spie : 1; + uint64_t ube : 1; + uint64_t wpri3 : 1; + // previous mode (supervisor) + uint64_t spp : 1; + uint64_t wpri4 : 4; + // FPU status + uint64_t fs : 2; + // extensions status + uint64_t xs : 2; + uint64_t wpri5 : 1; + // permit supervisor user memory access + uint64_t sum : 1; + // make executable readable + uint64_t mxr : 1; + uint64_t wpri6 : 12; + // U-mode XLEN + uint64_t uxl : 2; + uint64_t wpri7 : 29; + // status dirty + uint64_t sd : 1; + }; + + uint64_t val; + }; + + sstatus_t(void) { + val = 0; + return; + } + + sstatus_t(uint64_t _val) : val(_val) { + return; + } + + friend std::ostream& + operator<<(std::ostream& _os, const sstatus_t& _sstatus) { + printf("val: 0x%p, sie: %s, spie: %s, spp: %s", _sstatus.val, + (_sstatus.sie == true ? "enable" : "disable"), + (_sstatus.spie == true ? "enable" : "disable"), + (_sstatus.spp == true ? "S mode" : "U mode")); + return _os; + } +}; + +/** + * @brief 读取 sstatus 寄存器 + * @return uint64_t 读取到的值 + */ +inline static sstatus_t READ_SSTATUS(void) { + sstatus_t x; + asm("csrr %0, sstatus" : "=r"(x)); + return x; +} + +/** + * @brief 写 sstatus 寄存器 + * @param _x 要写的值 + */ +inline static void WRITE_SSTATUS(sstatus_t _x) { + asm("csrw sstatus, %0" : : "r"(_x)); +} + +/** + * @brief 读 sip + * @return uint64_t 读取到的值 + * @note Supervisor Interrupt Pending + */ +inline static uint64_t READ_SIP(void) { + uint64_t x; + asm("csrr %0, sip" : "=r"(x)); + return x; +} + +/** + * @brief 写 sip + * @param _x 要写的值 + */ +inline static void WRITE_SIP(uint64_t _x) { + asm("csrw sip, %0" : : "r"(_x)); + return; +} + +// Supervisor Interrupt Enable +// software +static constexpr const uint64_t SIE_SSIE = 1 << 1; +// timer +static constexpr const uint64_t SIE_STIE = 1 << 5; +// external +static constexpr const uint64_t SIE_SEIE = 1 << 9; + +/** + * @brief 读 sie + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_SIE(void) { + uint64_t x; + asm("csrr %0, sie" : "=r"(x)); + return x; +} + +/** + * @brief 写 sie + * @param _x 要写的值 + */ +inline static void WRITE_SIE(uint64_t _x) { + asm("csrw sie, %0" : : "r"(_x)); + return; +} + +/** + * @brief 读 sepc + * @return uint64_t 读到的值 + * @note machine exception program counter, holds the instruction address to + * which a return from exception will go. + */ +inline static uint64_t READ_SEPC(void) { + uint64_t x; + asm("csrr %0, sepc" : "=r"(x)); + return x; +} + +/** + * @brief 写 sepc + * @param _x 要写的值 + */ +inline static void WRITE_SEPC(uint64_t _x) { + asm("csrw sepc, %0" : : "r"(_x)); + return; +} + +/** + * @brief 读 stvec + * @return uint64_t 读到的值 + * @note Supervisor Trap-Vector Base Address low two bits are mode. + */ +inline static uint64_t READ_STVEC(void) { + uint64_t x; + asm("csrr %0, stvec" : "=r"(x)); + return x; +} + +/** + * @brief 写 stvec + * @param _x 要写的值 + */ +inline static void WRITE_STVEC(uint64_t _x) { + asm("csrw stvec, %0" : : "r"(_x)); + return; +} + +/// 中断模式 直接 +static constexpr const uint64_t TVEC_DIRECT = 0xFFFFFFFFFFFFFFFC; +/// 中断模式 向量 +static constexpr const uint64_t TVEC_VECTORED = 0xFFFFFFFFFFFFFFFD; + +/** + * @brief 设置中断模式,直接 + */ +inline static void STVEC_DIRECT(void) { + uint64_t stvec = READ_STVEC(); + stvec = stvec & TVEC_DIRECT; + WRITE_STVEC(stvec); + return; +} + +/** + * @brief 设置中断模式,向量 + */ +inline static void STVEC_VECTORED(void) { + uint64_t stvec = READ_STVEC(); + stvec = stvec & TVEC_VECTORED; + WRITE_STVEC(stvec); + return; +} + +/** + * @brief 设置页目录,仅更改 ppn + * @param _x 要设置的页目录 + * @note supervisor address translation and protection; holds the address of + * the page table. + * @todo 需要判断 _x 是否已经处理过 + */ +inline static void SET_PGD(uintptr_t _x) { + satp_t satp; + // 读取现在的 pgd + asm("csrr %0, satp" : "=r"(satp)); + // 更改 ppn + // satp.ppn = _x & satp_t::PPN_MASK; + satp.ppn = _x >> satp_t::PPN_OFFSET; + // 写回 + asm("csrw satp, %0" : : "r"(satp)); + return; +} + +/** + * @brief 获取页目录,仅获取 ppn + * @return uintptr_t 页目录 + */ +inline static uintptr_t GET_PGD(void) { + satp_t satp; + asm("csrr %0, satp" : "=r"(satp)); + return satp.ppn << satp_t::PPN_OFFSET; +} + +/** + * @brief 开启分页 + * @return true 成功 + * @return false 失败 + */ +inline static bool ENABLE_PG(void) { + uintptr_t x = GET_PGD(); + satp_t satp; + satp.ppn = x >> satp_t::PPN_OFFSET; + satp.asid = 0; + satp.mode = satp_t::SV39; + asm("csrw satp, %0" : : "r"(satp)); + info("paging enabled.\n"); + return true; +} + +/** + * @brief 读 sscratch 寄存器 + * @param _x 要写的值 + */ +inline static uint64_t READ_SSCRATCH(void) { + uint64_t x; + __asm__ volatile("csrr %0, sscratch" : "=r"(x)); + return x; +} + +/** + * @brief 写 sscratch 寄存器 + * @param _x 要写的值 + */ +inline static void WRITE_SSCRATCH(uint64_t _x) { + asm("csrw sscratch, %0" : : "r"(_x)); + return; +} + +/// [63]==1 interrupt, else exception +static constexpr const uint64_t CAUSE_INTR_MASK = 1ULL << 63; +/// low bits show code +static constexpr const uint64_t CAUSE_CODE_MASK = ~CAUSE_INTR_MASK; + +/** + * @brief 读 scause 寄存器 Supervisor Trap Cause + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_SCAUSE(void) { + uint64_t x; + asm("csrr %0, scause" : "=r"(x)); + return x; +} + +/** + * @brief 读 stval 寄存器 Supervisor Trap Value + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_STVAL(void) { + uint64_t x; + asm("csrr %0, stval" : "=r"(x)); + return x; +} + +/** + * @brief 读 time 寄存器 supervisor-mode cycle counter + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_TIME(void) { + uint64_t x; + // asm ("csrr %0, time" : "=r" (x) ); + // this instruction will trap in SBI + asm("rdtime %0" : "=r"(x)); + return x; +} + +/** + * @brief 允许中断 + */ +inline static void ENABLE_INTR(void) { + WRITE_SSTATUS(READ_SSTATUS().val | SSTATUS_SIE); + return; +} + +/** + * @brief 允许中断 + * @param _sstatus 要设置的 sstatus + */ +inline static void ENABLE_INTR(sstatus_t& _sstatus) { + _sstatus.sie = true; + return; +} + +/** + * @brief 禁止中断 + */ +inline static void DISABLE_INTR(void) { + WRITE_SSTATUS(READ_SSTATUS().val & ~SSTATUS_SIE); + return; +} + +/** + * @brief 禁止中断 + * @param _sstatus 要设置的原 sstatus 值 + */ +inline static void DISABLE_INTR(sstatus_t& _sstatus) { + _sstatus.sie = false; + return; +} + +/** + * @brief 读取中断状态 + * @return true 允许 + * @return false 禁止 + */ +inline static bool STATUS_INTR(void) { + sstatus_t x = READ_SSTATUS(); + return x.sie; +} + +/** + * @brief 读 sp 寄存器 + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_SP(void) { + uint64_t x; + asm("mv %0, sp" : "=r"(x)); + return x; +} + +/** + * @brief 读 tp 寄存器 + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_TP(void) { + uint64_t x; + asm("mv %0, tp" : "=r"(x)); + return x; +} + +/** + * @brief 写 tp 寄存器 + * @param _x 要写的值 + */ +inline static void WRITE_TP(uint64_t _x) { + asm("mv tp, %0" : : "r"(_x)); + return; +} + +/** + * @brief 读 ra 寄存器 + * @return uint64_t 读到的值 + */ +inline static uint64_t READ_RA(void) { + uint64_t x; + asm("mv %0, ra" : "=r"(x)); + return x; +} + +/** + * @brief 刷新 tlb + */ +inline static void VMM_FLUSH(uintptr_t) { + // the zero, zero means flush all TLB entries. + asm("sfence.vma zero, zero"); + return; +} + +/** + * @brief 通用寄存器 + */ +struct xregs_t { + uintptr_t zero; + uintptr_t ra; + uintptr_t sp; + uintptr_t gp; + uintptr_t tp; + uintptr_t t0; + uintptr_t t1; + uintptr_t t2; + uintptr_t s0; + uintptr_t s1; + uintptr_t a0; + uintptr_t a1; + uintptr_t a2; + uintptr_t a3; + uintptr_t a4; + uintptr_t a5; + uintptr_t a6; + uintptr_t a7; + uintptr_t s2; + uintptr_t s3; + uintptr_t s4; + uintptr_t s5; + uintptr_t s6; + uintptr_t s7; + uintptr_t s8; + uintptr_t s9; + uintptr_t s10; + uintptr_t s11; + uintptr_t t3; + uintptr_t t4; + uintptr_t t5; + uintptr_t t6; + + friend std::ostream& operator<<(std::ostream& _os, const xregs_t& _xregs) { + printf("zero: 0x%p, ", _xregs.zero); + printf("ra: 0x%p, ", _xregs.ra); + printf("sp: 0x%p, ", _xregs.sp); + printf("gp: 0x%p\n", _xregs.gp); + printf("tp: 0x%p, ", _xregs.tp); + printf("t0: 0x%p, ", _xregs.t0); + printf("t1: 0x%p, ", _xregs.t1); + printf("t2: 0x%p\n", _xregs.t2); + printf("s0: 0x%p, ", _xregs.s0); + printf("s1: 0x%p, ", _xregs.s1); + printf("a0: 0x%p, ", _xregs.a0); + printf("a1: 0x%p\n", _xregs.a1); + printf("a2: 0x%p, ", _xregs.a2); + printf("a3: 0x%p, ", _xregs.a3); + printf("a4: 0x%p, ", _xregs.a4); + printf("a5: 0x%p\n", _xregs.a5); + printf("a6: 0x%p, ", _xregs.a6); + printf("a7: 0x%p, ", _xregs.a7); + printf("s2: 0x%p, ", _xregs.s2); + printf("s3: 0x%p\n", _xregs.s3); + printf("s4: 0x%p, ", _xregs.s4); + printf("s5: 0x%p, ", _xregs.s5); + printf("s6: 0x%p, ", _xregs.s6); + printf("s7: 0x%p\n", _xregs.s7); + printf("s8: 0x%p, ", _xregs.s8); + printf("s9: 0x%p, ", _xregs.s9); + printf("s10: 0x%p, ", _xregs.s10); + printf("s11: 0x%p\n", _xregs.s11); + printf("t3: 0x%p, ", _xregs.t3); + printf("t4: 0x%p, ", _xregs.t4); + printf("t5: 0x%p, ", _xregs.t5); + printf("t6: 0x%p", _xregs.t6); + return _os; + } +}; + +/** + * @brief 浮点寄存器 + */ +struct fregs_t { + uintptr_t ft0; + uintptr_t ft1; + uintptr_t ft2; + uintptr_t ft3; + uintptr_t ft4; + uintptr_t ft5; + uintptr_t ft6; + uintptr_t ft7; + uintptr_t fs0; + uintptr_t fs1; + uintptr_t fa0; + uintptr_t fa1; + uintptr_t fa2; + uintptr_t fa3; + uintptr_t fa4; + uintptr_t fa5; + uintptr_t fa6; + uintptr_t fa7; + uintptr_t fs2; + uintptr_t fs3; + uintptr_t fs4; + uintptr_t fs5; + uintptr_t fs6; + uintptr_t fs7; + uintptr_t fs8; + uintptr_t fs9; + uintptr_t fs10; + uintptr_t fs11; + uintptr_t ft8; + uintptr_t ft9; + uintptr_t ft10; + uintptr_t ft11; + + friend std::ostream& operator<<(std::ostream& _os, const fregs_t& _fregs) { + printf("ft0: 0x%p, ", _fregs.ft0); + printf("ft1: 0x%p, ", _fregs.ft1); + printf("ft2: 0x%p, ", _fregs.ft2); + printf("ft3: 0x%p\n", _fregs.ft3); + printf("ft4: 0x%p, ", _fregs.ft4); + printf("ft5: 0x%p, ", _fregs.ft5); + printf("ft6: 0x%p, ", _fregs.ft6); + printf("ft7: 0x%p\n", _fregs.ft7); + printf("fs0: 0x%p, ", _fregs.fs0); + printf("fs1: 0x%p, ", _fregs.fs1); + printf("fa0: 0x%p, ", _fregs.fa0); + printf("fa1: 0x%p\n", _fregs.fa1); + printf("fa2: 0x%p, ", _fregs.fa2); + printf("fa3: 0x%p, ", _fregs.fa3); + printf("fa4: 0x%p, ", _fregs.fa4); + printf("fa5: 0x%p\n", _fregs.fa5); + printf("fa6: 0x%p, ", _fregs.fa6); + printf("fa7: 0x%p, ", _fregs.fa7); + printf("fs2: 0x%p, ", _fregs.fs2); + printf("fs3: 0x%p\n", _fregs.fs3); + printf("fs4: 0x%p, ", _fregs.fs4); + printf("fs5: 0x%p, ", _fregs.fs5); + printf("fs6: 0x%p, ", _fregs.fs6); + printf("fs7: 0x%p\n", _fregs.fs7); + printf("fs8: 0x%p, ", _fregs.fs8); + printf("fs9: 0x%p, ", _fregs.fs9); + printf("fs10: 0x%p, ", _fregs.fs10); + printf("fs11: 0x%p\n", _fregs.fs11); + printf("ft8: 0x%p, ", _fregs.ft8); + printf("ft9: 0x%p, ", _fregs.ft9); + printf("ft10: 0x%p, ", _fregs.ft10); + printf("ft11: 0x%p", _fregs.ft11); + return _os; + } +}; + +/** + * @brief 所有寄存器,在中断时使用,共 32+32+7=71 个 + */ +struct all_regs_t { + xregs_t xregs; + fregs_t fregs; + uintptr_t sepc; + uintptr_t stval; + uintptr_t scause; + uintptr_t sie; + sstatus_t sstatus; + satp_t satp; + uintptr_t sscratch; + + friend std::ostream& + operator<<(std::ostream& _os, const all_regs_t& _all_regs) { + (void)_all_regs.fregs; + _os << _all_regs.xregs << std::endl; + printf("sepc: 0x%p, stval: 0x%p, scause: 0x%p, sie: 0x%p, sstatus: " + "0x%p, satp: 0x%p, sscratch: 0x%p", + _all_regs.sepc, _all_regs.stval, _all_regs.scause, _all_regs.sie, + _all_regs.sstatus.val, _all_regs.satp.val, _all_regs.sscratch); + return _os; + } +}; + +}; // namespace CPU + +#endif /* SIMPLEKERNEL_CPU_HPP */ diff --git a/src/arch/riscv64/intr/clint.cpp b/src/arch/riscv64/intr/clint.cpp new file mode 100644 index 000000000..d9f0edd5f --- /dev/null +++ b/src/arch/riscv64/intr/clint.cpp @@ -0,0 +1,43 @@ + +/** + * @file clint.cpp + * @brief clint 抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://wiki.0xffffff.org/posts/hurlex-kernel.html + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "boot_info.h" +#include "cpu.hpp" +#include "cstdio" +#include "intr.h" +#include "resource.h" +#include "vmm.h" + +CLINT& CLINT::get_instance(void) { + /// 定义全局 CLINT 对象 + static CLINT clint; + return clint; +} + +int32_t CLINT::init(void) { + // 映射 clint 地址 + resource_t resource = BOOT_INFO::get_clint(); + for (uintptr_t a = resource.mem.addr; + a < resource.mem.addr + resource.mem.len; a += COMMON::PAGE_SIZE) { + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), a, a, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + } + // 开启内部中断 + CPU::WRITE_SIE(CPU::READ_SIE() | CPU::SIE_SSIE); + info("clint init.\n"); + return 0; +} diff --git a/src/arch/riscv64/intr/include/intr.h b/src/arch/riscv64/intr/include/intr.h new file mode 100644 index 000000000..1f7618b0b --- /dev/null +++ b/src/arch/riscv64/intr/include/intr.h @@ -0,0 +1,287 @@ + +/** + * @file intr.h + * @brief 中断抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_INTR_H +#define SIMPLEKERNEL_INTR_H + +#include "cpu.hpp" +#include "cstdint" + +/// @todo 多核 + +void handler_default(void); + +class INTR { +public: + /** + * @brief 中断处理函数指针 + * @param _argc 参数个数 + * @param _argv 参数列表 + * @return int32_t 返回值,0 成功 + */ + typedef int32_t (*interrupt_handler_t)(int _argc, char** _argv); + +private: + /// 异常名 + static constexpr const char* const excp_names[] = { + [CPU::EXCP_INSTRUCTION_ADDRESS_MISALIGNED] + = "Instruction Address Misaligned", + [CPU::EXCP_INSTRUCTION_ACCESS_FAULT] = "Instruction Access Fault", + [CPU::EXCP_ILLEGAL_INSTRUCTION] = "Illegal Instruction", + [CPU::EXCP_BREAKPOINT] = "Breakpoint", + [CPU::EXCP_LOAD_ADDRESS_MISALIGNED] = "Load Address Misaligned", + [CPU::EXCP_LOAD_ACCESS_FAULT] = "Load Access Fault", + [CPU::EXCP_STORE_AMO_ADDRESS_MISALIGNED] + = "Store/AMO Address Misaligned", + [CPU::EXCP_STORE_AMO_ACCESS_FAULT] = "Store/AMO Access Fault", + [CPU::EXCP_ECALL_U] = "Environment Call from U-mode", + [CPU::EXCP_ECALL_S] = "Environment Call from S-mode", + "Reserved", + [CPU::EXCP_ECALL_M] = "Environment Call from M-mode", + [CPU::EXCP_INSTRUCTION_PAGE_FAULT] = "Instruction Page Fault", + [CPU::EXCP_LOAD_PAGE_FAULT] = "Load Page Fault", + "Reserved", + [CPU::EXCP_STORE_AMO_PAGE_FAULT] = "Store/AMO Page Fault", + "Reserved", + }; + + /// 中断名 + static constexpr const char* const intr_names[] = { + [CPU::INTR_SOFT_U] = "User Software Interrupt", + [CPU::INTR_SOFT_S] = "Supervisor Software Interrupt", + "Reserved", + [CPU::INTR_SOFT_M] = "Machine Software Interrupt", + [CPU::INTR_TIMER_U] = "User Timer Interrupt", + [CPU::INTR_TIMER_S] = "Supervisor Timer Interrupt", + "Reserved", + [CPU::INTR_TIMER_M] = "Machine Timer Interrupt", + [CPU::INTR_EXTERN_U] = "User External Interrupt", + [CPU::INTR_EXTERN_S] = "Supervisor External Interrupt", + "Reserved", + [CPU::INTR_EXTERN_M] = "Machine External Interrupt", + "Reserved", + "Reserved", + "Reserved", + "Reserved", + "Local Interrupt X", + }; + + /// 最大中断数 + static constexpr const uint32_t INTERRUPT_MAX = 16; + /// 最大异常数 + static constexpr const uint32_t EXCP_MAX = 16; + + /// 中断处理函数数组 + interrupt_handler_t interrupt_handlers[INTERRUPT_MAX] + __attribute__((aligned(4))); + /// 异常处理函数数组 + interrupt_handler_t excp_handlers[EXCP_MAX] __attribute__((aligned(4))); + +public: + /** + * @brief 获取单例 + * @return INTR& 静态对象 + */ + static INTR& get_instance(void); + + /** + * @brief 中断初始化 + * @return int32_t 成功返回 0 + */ + int32_t init(void); + + /** + * @brief 注册中断处理函数 + * @param _no 中断号 + * @param _interrupt_handler 中断处理函数 + */ + void + register_interrupt_handler(uint8_t _no, + INTR::interrupt_handler_t _interrupt_handler); + + /** + * @brief 注册异常处理函数 + * @param _no 异常号 + * @param _interrupt_handler 异常处理函数 + */ + void register_excp_handler(uint8_t _no, + INTR::interrupt_handler_t _interrupt_handler); + + /** + * @brief 执行中断处理 + * @param _no 中断号 + * @param _argc 参数个数 + * @param _argv 参数列表 + * @return int32_t 返回值,0 成功 + */ + int32_t do_interrupt(uint8_t _no, int32_t _argc, char** _argv); + + /** + * @brief 执行异常处理 + * @param _no 异常号 + * @param _argc 参数个数 + * @param _argv 参数列表 + * @return int32_t 返回值,0 成功 + */ + int32_t do_excp(uint8_t _no, int32_t _argc, char** _argv); + + /** + * @brief 获取中断名 + * @param _no 中断号 + * @return const char* 中断名 + */ + const char* get_intr_name(uint8_t _no) const; + + /** + * @brief 获取异常名 + * @param _no 异常号 + * @return const char* 异常名 + */ + const char* get_excp_name(uint8_t _no) const; +}; + +/** + * @brief core-local interrupt controller + * 本地核心中断控制器 + * 用于控制 excp 与 intr + */ +class CLINT { +public: + /** + * @brief 获取单例 + * @return CLINT& 静态对象 + */ + static CLINT& get_instance(void); + + /** + * @brief 初始化 + * @return int32_t 成功返回 0 + */ + int32_t init(void); +}; + +/** + * @brief platform-level interrupt controller + * 平台级中断控制器 + * 用于控制外部中断 + */ +class PLIC { +private: + /// 外部中断处理函数指针 + typedef void (*externel_interrupt_handler_t)(uint8_t _no); + /// 最大外部中断数量 + static constexpr const size_t EXTERNEL_INTERRUPR_MAX = 16; + /// 外部中断处理函数数组 + externel_interrupt_handler_t + externel_interrupt_handlers[EXTERNEL_INTERRUPR_MAX]; + /// 基地址,由 dtb 传递 + static uintptr_t base_addr; + /// @todo ? + static uint64_t PLIC_PRIORITY; + /// @todo ? + static uint64_t PLIC_PENDING; + /// @todo ? + inline static uint64_t PLIC_SENABLE(uint64_t _hart); + + inline static uint64_t PLIC_MENABLE(uint64_t _hart); + /// @todo ? + inline static uint64_t PLIC_SPRIORITY(uint64_t _hart); + inline static uint64_t PLIC_MPRIORITY(uint64_t _hart); + /// @todo ? + inline static uint64_t PLIC_SCLAIM(uint64_t _hart); + inline static uint64_t PLIC_MCLAIM(uint64_t _hart); + +protected: + +public: + /** + * @brief 获取单例 + * @return PLIC& 静态对象 + */ + static PLIC& get_instance(void); + + /** + * @brief 初始化 + * @return int32_t 成功返回 0 + */ + int32_t init(void); + + /** + * @brief 向 PLIC 询问中断 + * 返回发生的外部中断号 + * @return uint8_t 中断号 + */ + uint8_t get(void); + + /** + * @brief 告知 PLIC 已经处理了当前 IRQ + * @param _no 中断号 + */ + void done(uint8_t _no); + + /** + * @brief 设置中断状态 + * @param _no 中断号 + * @param _status 状态 + * @todo 不确定 + */ + void set(uint8_t _no, bool _status); + + /** + * @brief 注册外部中断处理函数 + * @param _no 外部中断号 + * @param _interrupt_handler 外部中断处理函数 + */ + void + register_externel_handler(uint8_t _no, + externel_interrupt_handler_t _interrupt_handler); + + /** + * @brief 执行外部中断处理 + * @param _no 外部中断号 + */ + void do_externel_interrupt(uint8_t _no); +}; + +/** + * @brief 时钟抽象 + */ +class TIMER { +public: + /** + * @brief 获取单例 + * @return TIMER& 静态对象 + */ + static TIMER& get_instance(void); + + /** + * @brief 初始化 + */ + void init(void); +}; + +/** + * @brief 缺页读处理 + */ +int32_t pg_load_excp(int, char**); + +/** + * @brief 缺页写处理 + * @todo 需要读权限吗?测试发现没有读权限不行,原因未知 + */ +int32_t pg_store_excp(int, char**); + +#endif /* SIMPLEKERNEL_INTR_H */ diff --git a/src/arch/riscv64/intr/intr.cpp b/src/arch/riscv64/intr/intr.cpp new file mode 100644 index 000000000..189442eaf --- /dev/null +++ b/src/arch/riscv64/intr/intr.cpp @@ -0,0 +1,153 @@ + +/** + * @file intr.cpp + * @brief 中断实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "intr.h" +#include "cpu.hpp" +#include "cstdio" + +/** + * @brief 中断处理函数 + * @param _scause 原因 + * @param _sepc 值 + * @param _stval 值 + * @param _scause 值 + * @param _all_regs 保存在栈上的所有寄存器,实际上是 sp + * @param _sie 值 + * @param _sstatus 值 + * @param _sscratch 值 + */ +extern "C" void +trap_handler(uintptr_t _sepc, uintptr_t _stval, uintptr_t _scause, + CPU::all_regs_t* _all_regs, uintptr_t _sie, + CPU::sstatus_t _sstatus, CPU::satp_t _satp, uintptr_t _sscratch) { + // 消除 unused 警告 + (void)_sepc; + (void)_stval; + (void)_scause; + (void)_all_regs; + (void)_sie; + (void)_sstatus; + (void)_satp; + (void)_sscratch; +//#define DEBUG +#ifdef DEBUG + info("sepc: 0x%p, stval: 0x%p, scause: 0x%p, all_regs(sp): 0x%p, sie: " + "0x%p\nsstatus: ", + _sepc, _stval, _scause, _all_regs, _sie); + std::cout << _sstatus << ", \nsatp: " << _satp << ", \n"; + info("sscratch: 0x%p\n", _sscratch); +// std::cout << *_all_regs << std::endl; +# undef DEBUG +#endif + if (_scause & CPU::CAUSE_INTR_MASK) { +// 中断 +// #define DEBUG +#ifdef DEBUG + info("intr: %s.\n", + INTR::get_instance().get_intr_name(_scause + & CPU::CAUSE_CODE_MASK)); +# undef DEBUG +#endif + // 跳转到对应的处理函数 + INTR::get_instance().do_interrupt(_scause & CPU::CAUSE_CODE_MASK, 0, + nullptr); + } + else { +// 异常 +// 跳转到对应的处理函数 +// #define DEBUG +#ifdef DEBUG + warn("excp: %s.\n", + INTR::get_instance().get_excp_name(_scause + & CPU::CAUSE_CODE_MASK)); +# undef DEBUG +#endif + INTR::get_instance().do_excp(_scause & CPU::CAUSE_CODE_MASK, 0, + nullptr); + } + return; +} + +/// 中断处理入口 intr_s.S +extern "C" void trap_entry(void); + +/** + * @brief 默认使用的中断处理函数 + */ +int32_t handler_default(int, char**) { + while (1) { + ; + } + return 0; +} + +INTR& INTR::get_instance(void) { + /// 定义全局 INTR 对象 + static INTR intr; + return intr; +} + +int32_t INTR::init(void) { + // 设置 trap vector + CPU::WRITE_STVEC((uintptr_t)trap_entry); + // 直接跳转到处理函数 + CPU::STVEC_DIRECT(); + // 设置处理函数 + for (auto& i : interrupt_handlers) { + i = handler_default; + } + for (auto& i : excp_handlers) { + i = handler_default; + } + // 内部中断初始化 + CLINT::get_instance().init(); + // 外部中断初始化 + PLIC::get_instance().init(); + // 注册缺页中断 + register_excp_handler(CPU::EXCP_LOAD_PAGE_FAULT, pg_load_excp); + // 注册缺页中断 + register_excp_handler(CPU::EXCP_STORE_AMO_PAGE_FAULT, pg_store_excp); + info("intr init.\n"); + return 0; +} + +void INTR::register_interrupt_handler( + uint8_t _no, INTR::interrupt_handler_t _interrupt_handler) { + interrupt_handlers[_no] = _interrupt_handler; + return; +} + +void INTR::register_excp_handler(uint8_t _no, + INTR::interrupt_handler_t _interrupt_handler) { + excp_handlers[_no] = _interrupt_handler; + return; +} + +int32_t INTR::do_interrupt(uint8_t _no, int32_t _argc, char** _argv) { + return interrupt_handlers[_no](_argc, _argv); +} + +int32_t INTR::do_excp(uint8_t _no, int32_t _argc, char** _argv) { + return excp_handlers[_no](_argc, _argv); +} + +const char* INTR::get_intr_name(uint8_t _no) const { + return intr_names[_no]; +} + +const char* INTR::get_excp_name(uint8_t _no) const { + return excp_names[_no]; +} diff --git a/src/arch/riscv64/intr/intr_s.S b/src/arch/riscv64/intr/intr_s.S new file mode 100644 index 000000000..5b26ad1a1 --- /dev/null +++ b/src/arch/riscv64/intr/intr_s.S @@ -0,0 +1,50 @@ + +/** + * @file intr_s.S + * @brief 中断处理入口 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-01-01 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-01-01MRNIU迁移到 doxygen + *
+ */ + +#include "context.S" + +// clang-format off + +.section .text +// 保存所有寄存器 +.globl trap_entry +.extern trap_handler +.align 4 +trap_entry: + // 将所有寄存器保存到栈上 + // 在栈上留出保存寄存器的空间 + addi sp, sp, -ALL_SIZE + all_regs_save sp + + // 调用 intr.cpp: trap_handler + // 传递参数 + csrr a0, sepc + csrr a1, stval + csrr a2, scause + mv a3, sp + csrr a4, sie + csrr a5, sstatus + csrr a6, satp + csrr a7, sscratch + jal trap_handler + + // 从栈上恢复所有寄存器 + all_regs_load sp + // 释放栈上用于保存寄存器的空间 + addi sp, sp, ALL_SIZE + + // 跳转到 sepc 处执行 + sret diff --git a/src/arch/riscv64/intr/page_fault.cpp b/src/arch/riscv64/intr/page_fault.cpp new file mode 100644 index 000000000..1d452d208 --- /dev/null +++ b/src/arch/riscv64/intr/page_fault.cpp @@ -0,0 +1,63 @@ + +/** + * @file page_fault.cpp + * @brief 页错误处理 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2022-03-27 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2022-03-27Zone.Niuzh新建文件 + *
+ */ + +#include "cpu.hpp" +#include "cstdint" +#include "cstdio" +#include "pmm.h" +#include "vmm.h" + +int32_t pg_load_excp(int, char**) { + uintptr_t addr = CPU::READ_STVAL(); + uintptr_t pa = 0x0; + auto is_mmap + = VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), addr, &pa); + // 如果 is_mmap 为 true,说明已经应映射过了 + if (is_mmap == true) { + // 直接映射 + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), addr, pa, + VMM_PAGE_READABLE); + } + else { + // 分配一页物理内存进行映射 + pa = PMM::get_instance().alloc_page_kernel(); + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), addr, pa, + VMM_PAGE_READABLE); + } + info("pg_load_excp done: 0x%p.\n", addr); + return 0; +} + +int32_t pg_store_excp(int, char**) { + uintptr_t addr = CPU::READ_STVAL(); + uintptr_t pa = 0x0; + auto is_mmap + = VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), addr, &pa); + // 如果 is_mmap 为 true,说明已经应映射过了 + if (is_mmap == true) { + // 直接映射 + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), addr, pa, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + } + else { + // 分配一页物理内存进行映射 + pa = PMM::get_instance().alloc_page_kernel(); + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), addr, pa, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + } + info("pg_store_excp done: 0x%p.\n", addr); + return 0; +} diff --git a/src/arch/riscv64/intr/plic.cpp b/src/arch/riscv64/intr/plic.cpp new file mode 100755 index 000000000..460e96d57 --- /dev/null +++ b/src/arch/riscv64/intr/plic.cpp @@ -0,0 +1,139 @@ + +/** + * @file plic.cpp + * @brief plic 抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "boot_info.h" +#include "cpu.hpp" +#include "cstdint" +#include "cstdio" +#include "intr.h" +#include "io.h" +#include "vmm.h" + +uint64_t PLIC::base_addr; +uint64_t PLIC::PLIC_PRIORITY; +uint64_t PLIC::PLIC_PENDING; + +/** + * @brief 外部中断处理 + */ +static int32_t external_intr(int, char**) { + // 读取中断号 + auto no = PLIC::get_instance().get(); + // 根据中断号判断设备 + printf("external_intr: 0x%X.\n", no); + PLIC::get_instance().do_externel_interrupt(no); + info("external_intr done: 0x%X.\n", no); + return 0; +} + +uint64_t PLIC::PLIC_SENABLE(uint64_t _hart) { + return base_addr + 0x2080 + _hart * 0x100; +} + +uint64_t PLIC::PLIC_MENABLE(uint64_t _hart) { + return base_addr + 0x2000 + _hart * 0x100; +} + +uint64_t PLIC::PLIC_SPRIORITY(uint64_t _hart) { + return base_addr + 0x201000 + _hart * 0x2000; +} + +uint64_t PLIC::PLIC_MPRIORITY(uint64_t _hart) { + return base_addr + 0x200000 + _hart * 0x2000; +} + +uint64_t PLIC::PLIC_SCLAIM(uint64_t _hart) { + return base_addr + 0x201004 + _hart * 0x2000; +} + +uint64_t PLIC::PLIC_MCLAIM(uint64_t _hart) { + return base_addr + 0x200004 + _hart * 0x2000; +} + +PLIC& PLIC::get_instance(void) { + /// 定义全局 PLIC 对象 + static PLIC plic; + return plic; +} + +int32_t PLIC::init(void) { + // 映射 plic + resource_t resource = BOOT_INFO::get_plic(); + base_addr = resource.mem.addr; + PLIC_PRIORITY = base_addr + 0x0; + PLIC_PENDING = base_addr + 0x1000; + for (uintptr_t a = resource.mem.addr; + a < resource.mem.addr + resource.mem.len; a += COMMON::PAGE_SIZE) { + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), a, a, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + } + // TODO: 多核情况下设置所有 hart + // 将当前 hart 的 S 模式优先级阈值设置为 0 + IO::get_instance().write32((void*)PLIC_SPRIORITY(BOOT_INFO::dtb_init_hart), + 0); + // 注册外部中断处理函数 + INTR::get_instance().register_interrupt_handler(CPU::INTR_EXTERN_S, + external_intr); + // 开启外部中断 + CPU::WRITE_SIE(CPU::READ_SIE() | CPU::SIE_SEIE); + info("plic init.\n"); + return 0; +} + +void PLIC::set(uint8_t _no, bool _status) { + // 设置 IRQ 的属性为非零,即启用 plic + IO::get_instance().write32((void*)(base_addr + _no * 4), _status); + // TODO: 多核情况下设置所有 hart + // 为当前 hart 的 S 模式设置 uart 的 enable + if (_status) { + IO::get_instance().write32( + (void*)PLIC_SENABLE(BOOT_INFO::dtb_init_hart), + IO::get_instance().read32((void*) + PLIC_SENABLE(BOOT_INFO::dtb_init_hart)) + | (1 << _no)); + } + else { + IO::get_instance().write32( + (void*)PLIC_SENABLE(BOOT_INFO::dtb_init_hart), + IO::get_instance().read32((void*) + PLIC_SENABLE(BOOT_INFO::dtb_init_hart)) + & ~(1 << _no)); + } + return; +} + +uint8_t PLIC::get(void) { + return IO::get_instance().read32((void*) + PLIC_SCLAIM(BOOT_INFO::dtb_init_hart)); +} + +void PLIC::done(uint8_t _no) { + IO::get_instance().write32((void*)PLIC_SCLAIM(BOOT_INFO::dtb_init_hart), + _no); + return; +} + +void PLIC::register_externel_handler( + uint8_t _no, externel_interrupt_handler_t _interrupt_handler) { + externel_interrupt_handlers[_no] = _interrupt_handler; + return; +} + +void PLIC::do_externel_interrupt(uint8_t _no) { + externel_interrupt_handlers[_no](_no); + done(_no); + return; +} diff --git a/src/arch/riscv64/intr/timer.cpp b/src/arch/riscv64/intr/timer.cpp new file mode 100644 index 000000000..d1b17cad5 --- /dev/null +++ b/src/arch/riscv64/intr/timer.cpp @@ -0,0 +1,61 @@ + +/** + * @file timer.cpp + * @brief 时钟中断实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "cpu.hpp" +#include "cstdint" +#include "cstdio" +#include "intr.h" +#include "opensbi.h" + +/// timer interrupt interval +/// @todo 从 dts 读取 +static constexpr const uint64_t INTERVAL = 390000000 / 20; + +/** + * @brief 设置下一次时钟 + */ +void set_next(void) { + // 调用 opensbi 提供的接口设置时钟 + OPENSBI::get_instance().set_timer(CPU::READ_TIME() + INTERVAL); + return; +} + +/** + * @brief 时钟中断 + */ +int32_t timer_intr(int, char**) { + // 每次执行中断时设置下一次中断的时间 + set_next(); + return 0; +} + +TIMER& TIMER::get_instance(void) { + /// 定义全局 TIMER 对象 + static TIMER timer; + return timer; +} + +void TIMER::init(void) { + // 注册中断函数 + INTR::get_instance().register_interrupt_handler(CPU::INTR_TIMER_S, + timer_intr); + // 设置初次中断 + OPENSBI::get_instance().set_timer(CPU::READ_TIME()); + // 开启时钟中断 + CPU::WRITE_SIE(CPU::READ_SIE() | CPU::SIE_STIE); + info("timer init.\n"); + return; +} diff --git a/src/arch/riscv64/link.ld b/src/arch/riscv64/link.ld new file mode 100644 index 000000000..0001413ec --- /dev/null +++ b/src/arch/riscv64/link.ld @@ -0,0 +1,253 @@ + +/* This file is a part of Simple-XX/SimpleKernel + * (https://github.com/Simple-XX/SimpleKernel). + * Based on gnu-ld + * link.ld for Simple-XX/SimpleKernel. + * 链接脚本,指定生成的二进制文件的布局 + */ + +/* Script for -z combreloc */ +/* Copyright (C) 2014-2022 Free Software Foundation, Inc. + Copying and distribution of this script, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. */ +/* 指定输出格式 */ +OUTPUT_FORMAT( + "elf64-littleriscv", + "elf64-littleriscv", + "elf64-littleriscv" +) +/* 指定输出架构 */ +OUTPUT_ARCH(riscv) +/* 设置入口点 */ +ENTRY(_start) +/* 设置各个 section */ +SECTIONS { + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x80200000)); + /* 设置起始地址 */ + . = SEGMENT_START("text-segment", 0x80200000); + .boot : { *(.text.boot) *(.data.boot) *(.bss.boot) } + .interp : { *(.interp) } + .note.gnu.build-id : { *(.note.gnu.build-id) } + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rela.dyn : { + *(.rela.init) + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + *(.rela.fini) + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + *(.rela.ctors) + *(.rela.dtors) + *(.rela.got) + *(.rela.sdata .rela.sdata.* .rela.gnu.linkonce.s.*) + *(.rela.sbss .rela.sbss.* .rela.gnu.linkonce.sb.*) + *(.rela.sdata2 .rela.sdata2.* .rela.gnu.linkonce.s2.*) + *(.rela.sbss2 .rela.sbss2.* .rela.gnu.linkonce.sb2.*) + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + *(.rela.ifunc) + } + .rela.plt : { + *(.rela.plt) + PROVIDE_HIDDEN (__rela_iplt_start = .); + *(.rela.iplt) + PROVIDE_HIDDEN (__rela_iplt_end = .); + } + .init : { + KEEP (*(SORT_NONE(.init))) + } + .plt : { *(.plt) *(.iplt) } + /* 代码段 */ + .text : { + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(SORT(.text.sorted.*)) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf.em. */ + *(.gnu.warning) + } + .fini : { + KEEP (*(SORT_NONE(.fini))) + } + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .sdata2 : { + *(.sdata2 .sdata2.* .gnu.linkonce.s2.*) + } + .sbss2 : { *(.sbss2 .sbss2.* .gnu.linkonce.sb2.*) } + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } + /* These sections are generated by the Sun/Oracle C++ compiler. */ + .exception_ranges : ONLY_IF_RO { *(.exception_ranges*) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = DATA_SEGMENT_ALIGN (CONSTANT (MAXPAGESIZE), CONSTANT (COMMONPAGESIZE)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gnu_extab : ONLY_IF_RW { *(.gnu_extab) } + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } + .exception_ranges : ONLY_IF_RW { *(.exception_ranges*) } + /* Thread Local Storage sections */ + .tdata : { + PROVIDE_HIDDEN (__tdata_start = .); + *(.tdata .tdata.* .gnu.linkonce.td.*) + } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .preinit_array : { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + .init_array : { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { + *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) + *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) + } + .dynamic : { *(.dynamic) } + . = DATA_SEGMENT_RELRO_END (0, .); + .data : { + __DATA_BEGIN__ = .; + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + .got : { *(.got.plt) *(.igot.plt) *(.got) *(.igot) } + /* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata : { + __SDATA_BEGIN__ = .; + *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) + *(.srodata.cst2) *(.srodata .srodata.*) + *(.sdata .sdata.* .gnu.linkonce.s.*) + } + _edata = .; PROVIDE (edata = .); + . = .; + __bss_start = .; + .sbss : { + *(.dynsbss) + *(.sbss .sbss.* .gnu.linkonce.sb.*) + *(.scommon) + } + .bss : { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we do not + pad the .data section. */ + . = ALIGN(. != 0 ? 64 / 8 : 1); + } + . = ALIGN(64 / 8); + . = SEGMENT_START("ldata-segment", .); + . = ALIGN(64 / 8); + __BSS_END__ = .; + __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, + MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); + _end = .; PROVIDE (end = .); + . = DATA_SEGMENT_END (.); + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1. */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions. */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2. */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2. */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions. */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3. */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /* DWARF 5. */ + .debug_addr 0 : { *(.debug_addr) } + .debug_line_str 0 : { *(.debug_line_str) } + .debug_loclists 0 : { *(.debug_loclists) } + .debug_macro 0 : { *(.debug_macro) } + .debug_names 0 : { *(.debug_names) } + .debug_rnglists 0 : { *(.debug_rnglists) } + .debug_str_offsets 0 : { *(.debug_str_offsets) } + .debug_sup 0 : { *(.debug_sup) } + .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt new file mode 100644 index 000000000..086c2a125 --- /dev/null +++ b/src/device/CMakeLists.txt @@ -0,0 +1,21 @@ + +# This file is a part of Simple-XX/SimpleKernel (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +PROJECT(dev CXX) + +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/ dev_cxx_src) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/platform_bus platform_bus_src) +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/virtio virtio_src) +set(dev_src ${dev_cxx_src} ${platform_bus_src} ${virtio_src}) + +add_library(${PROJECT_NAME} OBJECT ${dev_src}) + +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) +target_include_kernel_header_files(${PROJECT_NAME}) +target_include_drv_header_files(${PROJECT_NAME}) +target_include_dev_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) +target_include_arch_header_files(${PROJECT_NAME}) diff --git a/src/device/bus_device.cpp b/src/device/bus_device.cpp new file mode 100644 index 000000000..1583f044c --- /dev/null +++ b/src/device/bus_device.cpp @@ -0,0 +1,95 @@ + +/** + * @file bus_device.cpp + * @brief 总线设备基类 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#include "bus_device.h" + +bool bus_device_t::match(device_base_t& _dev, const mystl::string& _drv_name) { + // 名称不匹配直接返回 + if (_dev.dev_name != _drv_name) { + return false; + } + // 已有驱动直接返回 + if (_dev.drv != nullptr) { + warn("%s already has driver\n", _dev.dev_name.c_str()); + return false; + } + // 设置驱动 通过 driver_factory_t new 了一个驱动对象 + _dev.drv + = driver_factory_t::get_instance().get_class(_drv_name, _dev.resource); + // 设置失败 + if (_dev.drv == nullptr) { + warn("%s has not register\n", _dev.dev_name.c_str()); + return false; + } + return true; +} + +bool bus_device_t::match(void) { + auto ret = false; + // 遍历找到没有驱动的设备 + for (auto i : devices) { + if (i->drv == nullptr) { + // 遍历所有驱动,尝试进行匹配 + for (auto j : drivers) { + ret = match(*i, j); + if (ret == true) { + info("%s device init successful.\n", i->dev_name.c_str()); + } + } + } + } + return ret; +} + +bus_device_t::bus_device_t(const mystl::string& _bus_name) + : bus_name(_bus_name) { + return; +} + +bool bus_device_t::add_driver(const mystl::string& _compatible_name) { + drivers.push_back(_compatible_name); + match(); + return true; +} + +bool bus_device_t::add_device(device_base_t* _dev) { + devices.push_back(_dev); + match(); + return true; +} + +void bus_device_t::show(void) const { + printf("device count: 0x%X\n", devices.size()); + for (auto i : devices) { + std::cout << *i << std::endl; + } + printf("driver count: 0x%X\n", drivers.size()); + for (auto i : drivers) { + std::cout << i << std::endl; + } + return; +} + +device_base_t* bus_device_t::get_dev_via_intr_no(uint8_t _no) { + // 遍历设备向量 + for (auto i : devices) { + // 寻找对应的设备 + if (i->resource.intr_no == _no) { + return i; + } + } + return nullptr; +} diff --git a/src/device/device_base.cpp b/src/device/device_base.cpp new file mode 100644 index 000000000..99564096a --- /dev/null +++ b/src/device/device_base.cpp @@ -0,0 +1,82 @@ + +/** + * @file device_base.cpp + * @brief 设备基类 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#include "device_base.h" + +device_base_t::device_base_t(void) : dev_name("device_base_t"), drv(nullptr) { + return; +} + +device_base_t::device_base_t(const resource_t& _resource, driver_base_t* _drv) + : dev_name(_resource.name), drv(_drv), resource(_resource) { + return; +} + +device_base_t::~device_base_t(void) { + // drv 在 register_call_back 中创建 + if (drv != nullptr) { + delete drv; + drv = nullptr; + } + return; +} + +int device_base_t::read(buf_t& _buf) { + // 设置要读的位置 + buf.sector = _buf.sector; + // 读 + auto res = drv->read(buf); + + // 等待中断完成 + while (buf.valid == false) { + ; + } + + // 将设备缓冲区中的数据复制到 _buf + memcpy(_buf.data, buf.data, COMMON::BUFFFER_SIZE); + + // 将设备缓冲区设置为无效 + buf.valid = false; + + return res; +} + +int device_base_t::write(buf_t& _buf) { + // 将设备缓冲区设置为无效 + buf.valid = false; + // 将要写的数据复制到设备缓冲区 + memcpy(buf.data, _buf.data, COMMON::BUFFFER_SIZE); + // 设置要写的位置 + buf.sector = _buf.sector; + + // 写 + auto res = drv->write(buf); + + // 等待中断完成 + while (buf.valid == false) { + ; + } + + return res; +} + +int device_base_t::ioctl(uint8_t _cmd, void* _buf) { + return drv->ioctl(_cmd, _buf); +} + +int device_base_t::status(uint8_t _cmd) { + return drv->status(_cmd); +} diff --git a/src/device/include/bus_device.h b/src/device/include/bus_device.h new file mode 100644 index 000000000..fdd451127 --- /dev/null +++ b/src/device/include/bus_device.h @@ -0,0 +1,108 @@ + +/** + * @file bus_device.h + * @brief 总线设备抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-23 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_BUS_DEVICE_H +#define SIMPLEKERNEL_BUS_DEVICE_H + +#include "cstdint" +#include "device_base.h" +#include "resource.h" +#include "string" +#include "vector" + +/** + * @brief 总线设备抽象 总线设备是用于内核与设备通信的设备 + */ +struct bus_device_t { +private: + /** + * @brief 匹配设备与驱动 + * @param _dev 设备 + * @param _drv_name compatible-驱动名 + * @return true 成功 + * @return false 失败 + */ + bool match(device_base_t& _dev, const mystl::string& _drv_name); + + /** + * @brief 匹配设备与驱动 + * @return true 成功 + * @return false 失败 + */ + bool match(void); + +protected: + +public: + /// 总线名 + mystl::string bus_name; + /// 已注册设备列表 + mystl::vector devices; + /// 已注册驱动列表 compatible-驱动名向量 + mystl::vector drivers; + + /** + * @brief 使用默认构造函数 + */ + bus_device_t(void) = default; + + /** + * @brief 构造函数 + * @param _bus_name 总线名称 + */ + bus_device_t(const mystl::string& _bus_name); + + /** + * @brief 使用默认析构函数 + */ + ~bus_device_t(void) = default; + + /** + * @brief 添加驱动 + * @param _compatible_name compatible 名 + * @return true 成功 + * @return false 失败 + */ + bool add_driver(const mystl::string& _compatible_name); + + /** + * @brief 添加设备 + * @param _dev 要添加的设备指针 + * @return true 成功 + * @return false 失败 + */ + bool add_device(device_base_t* _dev); + + /** + * @brief 显示所有设备信息 + */ + void show(void) const; + + /** + * @brief 通过外部中断号寻找设备 + * @param _no 外部中断号 + * @return dev_t* 使用该中断号的设备 + */ + device_base_t* get_dev_via_intr_no(uint8_t _no); + + friend std::ostream& operator<<(std::ostream& _out, bus_device_t& _bus) { + printf("bus_name: %s, devices: %d, drivers: %d", _bus.bus_name.c_str(), + _bus.devices.size(), _bus.drivers.size()); + return _out; + } +}; + +#endif /* SIMPLEKERNEL_BUS_DEVICE_H */ diff --git a/src/device/include/device_base.h b/src/device/include/device_base.h new file mode 100644 index 000000000..9c4d46632 --- /dev/null +++ b/src/device/include/device_base.h @@ -0,0 +1,95 @@ + +/** + * @file device_base.h + * @brief 设备基类 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_DEVICE_BASE_H +#define SIMPLEKERNEL_DEVICE_BASE_H + +#include "buf.h" +#include "driver_base.h" +#include "iostream" +#include "resource.h" +#include "string" +#include "vector" + +/** + * @brief 设备抽象 + */ +class device_base_t { +private: + +protected: + +public: + /// 设备名 + mystl::string dev_name; + /// 设备使用的驱动 + driver_base_t* drv; + /// 设备所需资源 + const resource_t resource; + /// 设备是否可用 + bool is_ready; + /// 设备缓冲区 + buf_t buf; + + /** + * @brief 构造函数 + */ + device_base_t(void); + + /** + * @brief 构造函数 + * @param _resource 设备使用的资源 + * @param _drv 设备使用的驱动,默认为 nullptr + */ + device_base_t(const resource_t& _resource, driver_base_t* _drv = nullptr); + + /** + * @brief 析构函数 + */ + virtual ~device_base_t(void); + + /** + * @brief 从设备读 + * @param _buf 缓冲区 + */ + virtual int read(buf_t& _buf); + + /** + * @brief 向设备写 + * @param _buf 缓冲区 + */ + virtual int write(buf_t& _buf); + + /** + * @brief ioctl 控制 + * @param _resource 设备使用的资源 + * @param _buf 缓冲区,512 字节 + */ + virtual int ioctl(uint8_t _cmd, void* _buf); + + /** + * @brief 获取设备状态 + * @param _cmd 指令 + */ + virtual int status(uint8_t _cmd); + + friend std::ostream& operator<<(std::ostream& _out, device_base_t& _dev) { + printf("dev_name: %s, drv: 0x%p", _dev.dev_name.c_str(), _dev.drv); + return _out; + } +}; + +#endif /* SIMPLEKERNEL_DEVICE_BASE_H */ diff --git a/src/device/virtio/include/virtio_dev.h b/src/device/virtio/include/virtio_dev.h new file mode 100644 index 000000000..cfd75646b --- /dev/null +++ b/src/device/virtio/include/virtio_dev.h @@ -0,0 +1,51 @@ + +/** + * @file virtio_dev.h + * @brief virtio 设备头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-21 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_VIRTIO_DEV_H +#define SIMPLEKERNEL_VIRTIO_DEV_H + +#include "device_base.h" +#include "virtio_mmio_drv.h" + +/** + * @brief 所有 virtio 设备的公有属性,标准文档的 #4 之外的部分 + */ +class virtio_device_t : public device_base_t { +private: + +protected: + +public: + /** + * @brief 不使用空构造函数 + */ + virtio_device_t(void) = delete; + + /** + * @brief 构造函数 + * @param _resource 设备使用的资源 + * @param _drv 设备使用的驱动,默认为 nullptr + */ + virtio_device_t(const resource_t& _resource, + virtio_mmio_drv_t* _drv = nullptr); + + /** + * @brief 使用默认析构函数 + */ + ~virtio_device_t(void) = default; +}; + +#endif /* SIMPLEKERNEL_VIRTIO_DEV_H */ diff --git a/src/device/virtio/virtio_dev.cpp b/src/device/virtio/virtio_dev.cpp new file mode 100644 index 000000000..0b4395807 --- /dev/null +++ b/src/device/virtio/virtio_dev.cpp @@ -0,0 +1,23 @@ + +/** + * @file virtio_dev.cpp + * @brief virtio 设备实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-21 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#include "virtio_dev.h" + +virtio_device_t::virtio_device_t(const resource_t& _resource, + virtio_mmio_drv_t* _drv) + : device_base_t(_resource, _drv) { + return; +} diff --git a/src/drv/CMakeLists.txt b/src/drv/CMakeLists.txt new file mode 100644 index 000000000..2b61095fd --- /dev/null +++ b/src/drv/CMakeLists.txt @@ -0,0 +1,45 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 驱动子模块的编译规则 + +# 设置子模块名与使用的语言 +PROJECT(drv CXX) + +# 根据 SimpleKernelArch 判断添加哪些文件 +# i386 与 x86_64 使用同一套驱动 +if (SimpleKernelArch STREQUAL ia32/i386 OR SimpleKernelArch STREQUAL ia32/x86_64) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/ drv_cxx_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/platform_bus platform_bus_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/tui tui_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/multiboot2 multiboot2_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/keyboard keyboard_src) + set(drv_src ${drv_cxx_src} ${platform_bus_src} ${tui_src} ${multiboot2_src} ${keyboard_src}) + # arm 驱动 +elseif (SimpleKernelArch STREQUAL arm) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/uart uart_src) + set(drv_src ${uart_src}) + # riscv64 驱动 +elseif (SimpleKernelArch STREQUAL riscv64) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/ drv_cxx_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/opensbi opensbi_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/sbi_console sbi_console_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/dtb dtb_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/platform_bus platform_bus_src) + aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/virtio virtio_src) + set(drv_src ${drv_cxx_src} ${opensbi_src} ${sbi_console_src} ${dtb_src} ${virtio_src} ${platform_bus_src}) +endif () + +# 添加子模块 +add_library(${PROJECT_NAME} OBJECT ${drv_src}) + +# 添加头文件搜索路径 +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) +target_include_kernel_header_files(${PROJECT_NAME}) +target_include_drv_header_files(${PROJECT_NAME}) +target_include_dev_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) +target_include_arch_header_files(${PROJECT_NAME}) diff --git a/src/drv/driver_base.cpp b/src/drv/driver_base.cpp new file mode 100644 index 000000000..ee490efb5 --- /dev/null +++ b/src/drv/driver_base.cpp @@ -0,0 +1,47 @@ + +/** + * @file driver_base.cpp + * @brief 设备驱动基类实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#include "driver_base.h" + +driver_base_t::driver_base_t(const mystl::string& _name) : name(_name) { + return; +} + +driver_factory_t& driver_factory_t::get_instance(void) { + static driver_factory_t factory; + return factory; +} + +void driver_factory_t::register_class(const mystl::string& _compatible_name, + const constructor_fun_t& _ctor_fun) { + // 插入到 map + type_name_ctor_map.insert(mystl::pair( + _compatible_name, _ctor_fun)); + return; +} + +driver_base_t* +driver_factory_t::get_class(const mystl::string& _compatible_name, + const resource_t& _resource) const { + auto iter = type_name_ctor_map.find(_compatible_name); + if (iter == type_name_ctor_map.end()) { + return (driver_base_t*)nullptr; + } + else { + return (driver_base_t*)((iter->second)(_resource)); + } + return (driver_base_t*)nullptr; +} diff --git a/src/drv/dtb/dtb.cpp b/src/drv/dtb/dtb.cpp new file mode 100644 index 000000000..20512f43c --- /dev/null +++ b/src/drv/dtb/dtb.cpp @@ -0,0 +1,635 @@ + +/** + * @file dtb.cpp + * @brief dtb 解析实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/brenns10/sos + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "dtb.h" +#include "boot_info.h" +#include "cassert" +#include "common.h" +#include "cstdint" +#include "cstdio" +#include "endian.h" +#include "iostream" +#include "resource.h" +#include "string.h" + +// 所有节点 +DTB::node_t DTB::nodes[MAX_NODES]; +// 节点数 +size_t DTB::node_t::count = 0; +// 所有 phandle +DTB::phandle_map_t DTB::phandle_map[MAX_NODES]; +// phandle 数 +size_t DTB::phandle_map_t::count = 0; + +bool DTB::path_t::operator==(const DTB::path_t* _path) { + if (len != _path->len) { + return false; + } + for (size_t i = 0; i < len; i++) { + if (strcmp(path[i], _path->path[i]) != 0) { + return false; + } + } + return true; +} + +bool DTB::path_t::operator==(const char* _path) { + // 路径必须以 ‘/’ 开始 + if (_path[0] != '/') { + return false; + } + // 记录当前 _path 处理到的下标 + size_t tmp = 0; + for (size_t i = 0; i < len; i++) { + if (strncmp(path[i], &_path[tmp + i], strlen(path[i])) != 0) { + return false; + } + tmp += strlen(path[i]); + } + return true; +} + +DTB::node_t* DTB::get_phandle(uint32_t _phandle) { + // 在 phandle_map 中寻找对应的节点 + for (size_t i = 0; i < phandle_map[0].count; i++) { + if (phandle_map[i].phandle == _phandle) { + return phandle_map[i].node; + } + } + return nullptr; +} + +DTB::dt_fmt_t DTB::get_fmt(const char* _prop_name) { + // 默认为 FMT_UNKNOWN + dt_fmt_t res = FMT_UNKNOWN; + for (size_t i = 0; i < sizeof(props) / sizeof(dt_prop_fmt_t); i++) { + // 找到了则更新 + if (strcmp(_prop_name, props[i].prop_name) == 0) { + res = props[i].fmt; + } + } + return res; +} + +void DTB::print_attr_propenc(const iter_data_t* _iter, size_t* _cells, + size_t _len) { + // 字节总数 + uint32_t entry_size = 0; + // 属性长度 + uint32_t remain = _iter->prop_len; + // 属性数据 + uint32_t* reg = _iter->prop_addr; + printf("%s: ", _iter->prop_name); + + // 计算 + for (size_t i = 0; i < _len; i++) { + entry_size += 4 * _cells[i]; + } + + printf("(len=%u/%u) ", _iter->prop_len, entry_size); + + // 理论上应该是可以整除的,如果不行说明有问题 + assert(_iter->prop_len % entry_size == 0); + + // 数据长度大于 0 + while (remain > 0) { + std::cout << "<"; + for (size_t i = 0; i < _len; i++) { + // 直接输出 + for (size_t j = 0; j < _cells[i]; j++) { + printf("0x%X ", be32toh(*reg)); + // 下一个 cell + reg++; + // 减 4,即一个 cell 大小 + remain -= 4; + } + + if (i != _len - 1) { + std::cout << "| "; + } + } + // \b 删除最后一个 "| " 中的空格 + std::cout << "\b>"; + } + return; +} + +void DTB::fill_resource(resource_t* _resource, const node_t* _node, + const prop_t* _prop) { + // 如果 _resource 名称为空则使用 compatible,如果没有找到则使用 _node 路径 + if (_resource->name == nullptr) { + for (size_t i = 0; i < _node->prop_count; i++) { + if (strcmp(_node->props[i].name, "compatible") == 0) { + _resource->name = (char*)_node->props[i].addr; + } + if (_resource->name == nullptr) { + _resource->name = _node->path.path[_node->path.len - 1]; + } + } + } + // 内存类型 + if ((_resource->type & resource_t::MEM) && (_resource->mem.len == 0)) { + // 根据 address_cells 与 size_cells 填充 + // resource 一般来说两者是相等的 + if (_node->parent->address_cells == 1) { + assert(_node->parent->size_cells == 1); + _resource->mem.addr = be32toh(((uint32_t*)_prop->addr)[0]); + _resource->mem.len = be32toh(((uint32_t*)_prop->addr)[1]); + } + else if (_node->parent->address_cells == 2) { + assert(_node->parent->size_cells == 2); + _resource->mem.addr = be32toh(((uint32_t*)_prop->addr)[0]) + + be32toh(((uint32_t*)_prop->addr)[1]); + _resource->mem.len = be32toh(((uint32_t*)_prop->addr)[2]) + + be32toh(((uint32_t*)_prop->addr)[3]); + } + else { + assert(0); + } + } + else if (_resource->type & resource_t::INTR_NO) { + _resource->intr_no = be32toh(((uint32_t*)_prop->addr)[0]); + } + return; +} + +DTB::node_t* DTB::find_node_via_path(const char* _path) { + node_t* res = nullptr; + // 遍历 nodes + for (size_t i = 0; i < nodes[0].count; i++) { + // 如果 nodes[i] 中有属性/值对符合要求 + if (nodes[i].path == _path) { + // 设置返回值 + res = &nodes[i]; + } + } + return res; +} + +void DTB::dtb_mem_reserved(void) { + fdt_reserve_entry_t* entry = dtb_info.reserved; + if (entry->addr_le || entry->size_le) { + // 目前没有考虑这种情况,先报错 + assert(0); + } + return; +} + +void DTB::dtb_iter(uint8_t _cb_flags, bool (*_cb)(const iter_data_t*, void*), + void* _data, uintptr_t _addr) { + // 迭代变量 + iter_data_t iter; + // 路径深度 + iter.path.len = 0; + // 数据地址 + iter.addr = (uint32_t*)_addr; + // 节点索引 + iter.nodes_idx = 0; + // 开始 flag + bool begin = true; + + while (1) { + // + iter.type = be32toh(iter.addr[0]); + switch (iter.type) { + case FDT_NOP: { + // 跳过 type + iter.addr++; + break; + } + case FDT_BEGIN_NODE: { + // 第 len 深底的名称 + iter.path.path[iter.path.len] = (char*)(iter.addr + 1); + // 深度+1 + iter.path.len++; + iter.nodes_idx = begin ? 0 : (iter.nodes_idx + 1); + begin = false; + if (_cb_flags & DT_ITER_BEGIN_NODE) { + if (_cb(&iter, _data)) { + return; + } + } + // 跳过 type + iter.addr++; + // 跳过 name + iter.addr += COMMON::ALIGN(strlen((char*)iter.addr) + 1, 4) / 4; + break; + } + case FDT_END_NODE: { + if (_cb_flags & DT_ITER_END_NODE) { + if (_cb(&iter, _data)) { + return; + } + } + // 这一级结束了,所以 -1 + iter.path.len--; + // 跳过 type + iter.addr++; + break; + } + case FDT_PROP: { + iter.prop_len = be32toh(iter.addr[1]); + iter.prop_name = (char*)(dtb_info.str + be32toh(iter.addr[2])); + iter.prop_addr = iter.addr + 3; + if (_cb_flags & DT_ITER_PROP) { + if (_cb(&iter, _data)) { + return; + } + } + iter.prop_name = nullptr; + iter.prop_addr = nullptr; + // 跳过 type + iter.addr++; + // 跳过 len + iter.addr++; + // 跳过 nameoff + iter.addr++; + // 跳过 data,并进行对齐 + iter.addr += COMMON::ALIGN(iter.prop_len, 4) / 4; + iter.prop_len = 0; + break; + } + case FDT_END: { + return; + } + default: { + printf("unrecognized token 0x%X\n", iter.type); + return; + } + } + } + return; +} + +DTB::dtb_info_t DTB::dtb_info; + +/* + * This callback constructs tracking information about each node. + */ +bool DTB::dtb_init_cb(const iter_data_t* _iter, void*) { + // 索引 + size_t idx = _iter->nodes_idx; + // 根据类型 + switch (_iter->type) { + // 开始 + case FDT_BEGIN_NODE: { + // 设置节点基本信息 + nodes[idx].path = _iter->path; + nodes[idx].addr = _iter->addr; + nodes[idx].depth = _iter->path.len; + // 设置默认值 + nodes[idx].address_cells = 2; + nodes[idx].size_cells = 2; + nodes[idx].interrupt_cells = 0; + nodes[idx].phandle = 0; + nodes[idx].interrupt_parent = nullptr; + // 设置父节点 + // 如果不是根节点 + if (idx != 0) { + size_t i = idx - 1; + while (nodes[i].depth != nodes[idx].depth - 1) { + i--; + } + nodes[idx].parent = &nodes[i]; + } + // 索引为 0 说明是根节点 + else { + // 根节点的父节点为空 + nodes[idx].parent = nullptr; + } + break; + } + case FDT_PROP: { + // 获取 cells 信息 + if (strcmp(_iter->prop_name, "#address-cells") == 0) { + nodes[idx].address_cells = be32toh(_iter->addr[3]); + } + else if (strcmp(_iter->prop_name, "#size-cells") == 0) { + nodes[idx].size_cells = be32toh(_iter->addr[3]); + } + else if (strcmp(_iter->prop_name, "#interrupt-cells") == 0) { + nodes[idx].interrupt_cells = be32toh(_iter->addr[3]); + } + // phandle 信息 + else if (strcmp(_iter->prop_name, "phandle") == 0) { + nodes[idx].phandle = be32toh(_iter->addr[3]); + // 更新 phandle_map + phandle_map[phandle_map[0].count].phandle = nodes[idx].phandle; + phandle_map[phandle_map[0].count].node = &nodes[idx]; + phandle_map[0].count++; + } + // 添加属性 + nodes[idx].props[nodes[idx].prop_count].name = _iter->prop_name; + nodes[idx].props[nodes[idx].prop_count].addr + = (uintptr_t)(_iter->addr + 3); + nodes[idx].props[nodes[idx].prop_count].len + = be32toh(_iter->addr[1]); + nodes[idx].prop_count++; + break; + } + case FDT_END_NODE: { + // 节点数+1 + nodes[0].count = idx + 1; + break; + } + } + // 返回 false 表示需要迭代全部节点 + return false; +} + +bool DTB::dtb_init_interrupt_cb(const iter_data_t* _iter, void*) { + uint8_t idx = _iter->nodes_idx; + uint32_t phandle; + node_t* parent; + // 设置中断父节点 + if (strcmp(_iter->prop_name, "interrupt-parent") == 0) { + phandle = be32toh(_iter->addr[3]); + parent = get_instance().get_phandle(phandle); + // 没有找到则报错 + assert(parent != nullptr); + nodes[idx].interrupt_parent = parent; + } + // 返回 false 表示需要迭代全部节点 + return false; +} + +DTB& DTB::get_instance(void) { + /// 定义全局 DTB 对象 + static DTB dtb; + return dtb; +} + +bool DTB::dtb_init(void) { + // 头信息 + dtb_info.header = (fdt_header_t*)BOOT_INFO::boot_info_addr; + // 魔数 + assert(be32toh(dtb_info.header->magic) == FDT_MAGIC); + // 版本 + assert(be32toh(dtb_info.header->version) == FDT_VERSION); + // 设置大小 + BOOT_INFO::boot_info_size = be32toh(dtb_info.header->totalsize); + // 内存保留区 + dtb_info.reserved + = (fdt_reserve_entry_t*)(BOOT_INFO::boot_info_addr + + be32toh(dtb_info.header->off_mem_rsvmap)); + // 数据区 + dtb_info.data + = BOOT_INFO::boot_info_addr + be32toh(dtb_info.header->off_dt_struct); + // 字符区 + dtb_info.str + = BOOT_INFO::boot_info_addr + be32toh(dtb_info.header->off_dt_strings); + // 检查保留内存 + dtb_mem_reserved(); + // 初始化 map + bzero(nodes, sizeof(nodes)); + bzero(phandle_map, sizeof(phandle_map)); + // 初始化节点的基本信息 + dtb_iter(DT_ITER_BEGIN_NODE | DT_ITER_END_NODE | DT_ITER_PROP, dtb_init_cb, + nullptr); + // 中断信息初始化,因为需要查找 phandle,所以在基本信息初始化完成后进行 + dtb_iter(DT_ITER_PROP, dtb_init_interrupt_cb, nullptr); +// #define DEBUG +#ifdef DEBUG + // 输出所有信息 + for (size_t i = 0; i < nodes[0].count; i++) { + std::cout << nodes[i].path << ": " << std::endl; + for (size_t j = 0; j < nodes[i].prop_count; j++) { + printf("%s: ", nodes[i].props[j].name); + for (size_t k = 0; k < nodes[i].props[j].len / 4; k++) { + printf("0x%X ", + be32toh(((uint32_t*)nodes[i].props[j].addr)[k])); + } + printf("\n"); + } + } +# undef DEBUG +#endif + return true; +} + +/// @todo 这里看起来似乎可以优化 +bool DTB::find_via_path(const char* _path, resource_t* _resource) { + // 找到节点 + auto node = find_node_via_path(_path); + // std::cout << node->path << std::endl; + // 找到 reg + for (size_t i = 0; i < node->prop_count; i++) { + // printf("node->props[i].name: %s\n", node->props[i].name); + if (strcmp(node->props[i].name, "reg") == 0) { + // 填充数据 + _resource->type |= resource_t::MEM; + fill_resource(_resource, node, &node->props[i]); + } + else if (strcmp(node->props[i].name, "interrupts") == 0) { + // 填充数据 + _resource->type |= resource_t::INTR_NO; + fill_resource(_resource, node, &node->props[i]); + } + } + return true; +} + +/// @todo 这里看起来似乎可以优化 +size_t DTB::find_via_prefix(const char* _prefix, resource_t* _resource) { + size_t res = 0; + // 遍历所有节点,查找 + // 由于 @ 均为最底层节点,所以直接比较最后一级即可 + for (size_t i = 0; i < nodes[0].count; i++) { + if (strncmp(nodes[i].path.path[nodes[i].path.len - 1], _prefix, + strlen(_prefix)) + == 0) { + // 找到 reg + for (size_t j = 0; j < nodes[i].prop_count; j++) { + if (strcmp(nodes[i].props[j].name, "reg") == 0) { + _resource[res].type |= resource_t::MEM; + // 填充数据 + fill_resource(&_resource[res], &nodes[i], + &nodes[i].props[j]); + } + else if (strcmp(nodes[i].props[j].name, "interrupts") == 0) { + _resource[res].type |= resource_t::INTR_NO; + // 填充数据 + fill_resource(&_resource[res], &nodes[i], + &nodes[i].props[j]); + } + } + res++; + } + } + return res; +} + +std::ostream& operator<<(std::ostream& _os, const DTB::iter_data_t& _iter) { + // 输出路径 + _os << _iter.path << ": "; + // 根据属性类型输出 + switch (DTB::get_instance().get_fmt(_iter.prop_name)) { + // 未知 + case DTB::FMT_UNKNOWN: { + warn("%s: (unknown format, len=0x%X)", _iter.prop_name, + _iter.prop_len); + break; + } + // 空 + case DTB::FMT_EMPTY: { + _os << _iter.prop_name << ": (empty)"; + break; + } + // 32 位整数 + case DTB::FMT_U32: { + printf("%s: 0x%X", _iter.prop_name, + be32toh(*(uint32_t*)_iter.prop_addr)); + break; + } + // 64 位整数 + case DTB::FMT_U64: { + printf("%s: 0x%p", _iter.prop_name, + be32toh(*(uint64_t*)_iter.prop_addr)); + break; + } + // 字符串 + case DTB::FMT_STRING: { + _os << _iter.prop_name << ": " << (char*)_iter.prop_addr; + break; + } + // phandle + case DTB::FMT_PHANDLE: { + uint32_t phandle = be32toh(_iter.addr[3]); + DTB::node_t* ref = DTB::get_instance().get_phandle(phandle); + if (ref != nullptr) { + printf("%s: ", _iter.prop_name, ref->path.path[0]); + } + else { + printf("%s: ", _iter.prop_name, phandle); + } + break; + } + // 字符串列表 + case DTB::FMT_STRINGLIST: { + size_t len = 0; + char* str = (char*)_iter.prop_addr; + _os << _iter.prop_name << ": ["; + while (len < _iter.prop_len) { + // 用 "" 分隔 + _os << "\"" << str << "\""; + len += strlen(str) + 1; + str = (char*)((uint8_t*)_iter.prop_addr + len); + } + _os << "]"; + break; + } + // reg,不定长的 32 位数据 + case DTB::FMT_REG: { + // 获取节点索引 + uint8_t idx = _iter.nodes_idx; + // 全部 cells 大小 + // devicetree-specification-v0.3.pdf#2.3.6 + size_t cells[] = { + DTB::nodes[idx].parent->address_cells, + DTB::nodes[idx].parent->size_cells, + }; + // 调用辅助函数进行输出 + DTB::get_instance().print_attr_propenc(&_iter, cells, + sizeof(cells) + / sizeof(size_t)); + break; + } + case DTB::FMT_RANGES: { + // 获取节点索引 + uint8_t idx = _iter.nodes_idx; + // 全部 cells 大小 + // devicetree-specification-v0.3.pdf#2.3.8 + size_t cells[] = { + DTB::nodes[idx].address_cells, + DTB::nodes[idx].parent->address_cells, + DTB::nodes[idx].size_cells, + }; + // 调用辅助函数进行输出 + DTB::get_instance().print_attr_propenc(&_iter, cells, + sizeof(cells) + / sizeof(size_t)); + break; + } + default: { + assert(0); + break; + } + } + return _os; +} + +std::ostream& operator<<(std::ostream& _os, const DTB::path_t& _path) { + if (_path.len == 1) { + _os << "/"; + } + for (size_t i = 1; i < _path.len; i++) { + _os << "/"; + _os << _path.path[i]; + } + return _os; +} + +namespace BOOT_INFO { +// 地址 +uintptr_t boot_info_addr; +// 长度 +size_t boot_info_size; +// 启动核 +size_t dtb_init_hart; + +bool inited = false; + +bool init(void) { + auto res = DTB::get_instance().dtb_init(); + if (inited == false) { + inited = true; + info("BOOT_INFO init.\n"); + } + else { + info("BOOT_INFO reinit.\n"); + } + return res; +} + +resource_t get_memory(void) { + resource_t resource; + // 获取资源信息 + assert(DTB::get_instance().find_via_prefix("memory@", &resource) == 1); + return resource; +} + +size_t find_via_prefix(const char* _prefix, resource_t* _resource) { + return DTB::get_instance().find_via_prefix(_prefix, _resource); +} + +resource_t get_clint(void) { + resource_t resource; + // 设置 resource 基本信息 + resource.type = resource_t::MEM; + assert(DTB::get_instance().find_via_prefix("clint@", &resource) == 1); + return resource; +} + +resource_t get_plic(void) { + resource_t resource; + // 设置 resource 基本信息 + resource.type = resource_t::MEM; + assert(DTB::get_instance().find_via_prefix("plic@", &resource) == 1); + return resource; +} + +}; // namespace BOOT_INFO diff --git a/src/drv/dtb/include/dtb.h b/src/drv/dtb/include/dtb.h new file mode 100644 index 000000000..578724a61 --- /dev/null +++ b/src/drv/dtb/include/dtb.h @@ -0,0 +1,441 @@ + +/** + * @file dtb.h + * @brief dtb 解析 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/brenns10/sos + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_DTB_H +#define SIMPLEKERNEL_DTB_H + +#include "boot_info.h" +#include "cstdbool" +#include "cstdint" +#include "endian.h" +#include "iostream" +#include "resource.h" + +/// @see devicetree-specification-v0.3.pdf +/// @see https://e-mailky.github.io/2016-12-06-dts-introduce +/// @see https://e-mailky.github.io/2019-01-14-dts-1 +/// @see https://e-mailky.github.io/2019-01-14-dts-2 +/// @see https://e-mailky.github.io/2019-01-14-dts-3 + +/** + * @brief dtb 接口抽象 + */ +class DTB { +private: + /// @see devicetree-specification-v0.3.pdf#5.4 + /// node 开始标记 + static constexpr const uint32_t FDT_BEGIN_NODE = 0x1; + /// node 结束标记 + static constexpr const uint32_t FDT_END_NODE = 0x2; + /// 属性开始标记 + static constexpr const uint32_t FDT_PROP = 0x3; + /// 无效标记 + static constexpr const uint32_t FDT_NOP = 0x4; + /// 数据区结束标记 + static constexpr const uint32_t FDT_END = 0x9; + + /// @see devicetree-specification-v0.3.pdf#5.1 + /// 魔数 + static constexpr const uint32_t FDT_MAGIC = 0xD00DFEED; + /// 版本 17 + static constexpr const uint32_t FDT_VERSION = 0x11; + + /** + * @brief fdt 格式头 + */ + struct fdt_header_t { + /// 魔数,0xD00DFEED + uint32_t magic; + /// 整个 fdt 结构的大小 + uint32_t totalsize; + /// 数据区相对 header 地址的偏移 + uint32_t off_dt_struct; + /// 字符串区相对 header 地址的偏移 + uint32_t off_dt_strings; + /// 内存保留相对 header 地址的偏移 + uint32_t off_mem_rsvmap; + /// fdt 版本,17 + uint32_t version; + /// 最新的兼容版本 + uint32_t last_comp_version; + /// 启动 cpu 的 id + uint32_t boot_cpuid_phys; + /// 字符串区长度 + uint32_t size_dt_strings; + /// 数据区长度 + uint32_t size_dt_struct; + // 从地址构造 + fdt_header_t(const void* _addr); + ~fdt_header_t(void); + }; + + /** + * @brief 内存保留区信息 + * @see devicetree-specification-v0.3.pdf#5.3.2 + */ + struct fdt_reserve_entry_t { + /// 地址 + uint32_t addr_be; + uint32_t addr_le; + /// 长度 + uint32_t size_be; + uint32_t size_le; + }; + + /** + * @brief 属性节点格式,没有使用,仅用于参考 + */ + struct fdt_property_t { + /// 第一个字节表示 type + uint32_t tag; + /// 表示 property value 的长度,byte 为单位 + uint32_t len; + /// property 的名称存放在 string block 区域,nameoff 表示其在 string + /// block 的偏移 + uint32_t nameoff; + /// property value值,作为额外数据以'\0'结尾的字符串形式存储 structure + /// block, 32 - bits对齐,不够的位用 0x0 补齐 + uint32_t data[0]; + }; + + /// 路径最大深度 + static constexpr const size_t MAX_DEPTH = 16; + /// 最大节点数 + static constexpr const size_t MAX_NODES = 128; + /// 最大属性数 + static constexpr const size_t PROP_MAX = 16; + + /** + * @brief dtb 信息 + */ + struct dtb_info_t { + /// dtb 头 + fdt_header_t* header; + /// 保留区 + fdt_reserve_entry_t* reserved; + /// 数据区 + uintptr_t data; + /// 字符区 + uintptr_t str; + }; + + /** + * @brief 属性信息 + */ + struct prop_t { + /// 属性名 + char* name; + /// 属性地址 + uintptr_t addr; + /// 属性长度 + size_t len; + }; + + /** + * @brief 路径 + */ + struct path_t { + /// 当前路径 + char* path[MAX_DEPTH]; + /// 长度 + size_t len; + /** + * @brief 全部匹配 + * @param _path 要比较的路径 + * @return true 相同 + * @return false 不同 + */ + bool operator==(const path_t* _path); + bool operator==(const char* _path); + }; + + /** + * @brief 节点数据 + */ + struct node_t { + /// 节点路径 + path_t path; + /// 节点地址 + uint32_t* addr; + /// 父节点 + node_t* parent; + /// 中断父节点 + node_t* interrupt_parent; + /// 1 cell == 4 bytes + /// 地址长度 单位为 bytes + uint32_t address_cells; + /// 长度长度 单位为 bytes + uint32_t size_cells; + /// 中断长度 单位为 bytes + uint32_t interrupt_cells; + uint32_t phandle; + /// 路径深度 + uint8_t depth; + /// 属性 + prop_t props[PROP_MAX]; + /// 属性数 + size_t prop_count; + /// 节点数 + static size_t count; + /// 查找节点中的键值对 + bool find(const char* _prop_name, const char* _val); + }; + +protected: + +public: + /** + * @brief 迭代变量 + */ + struct iter_data_t { + /// 路径,不包括节点名 + path_t path; + /// 节点地址 + uint32_t* addr; + /// 节点类型 + uint32_t type; + /// 如果节点类型为 PROP, 保存节点属性名 + char* prop_name; + /// 如果节点类型为 PROP, 保存属性长度 单位为 byte + uint32_t prop_len; + /// 如果节点类型为 PROP, 保存属性地址 + uint32_t* prop_addr; + /// 在 nodes 数组的下标 + uint8_t nodes_idx; + }; + + // 部分属性及格式 + /// @see devicetree-specification-v0.3#2.3 + /// @see devicetree-specification-v0.3#2.4.1 + /** + * @brief 格式 + */ + enum dt_fmt_t { + /// 未知 + FMT_UNKNOWN = 0, + /// 空 + FMT_EMPTY, + /// uint32_t + FMT_U32, + /// uint64_t + FMT_U64, + /// 字符串 + FMT_STRING, + /// phandle + FMT_PHANDLE, + /// 字符串列表 + FMT_STRINGLIST, + /// reg + FMT_REG, + /// ranges + FMT_RANGES, + }; + + /** + * @brief 用于 get_fmt() + */ + struct dt_prop_fmt_t { + /// 属性名 + char* prop_name; + /// 格式 + enum dt_fmt_t fmt; + }; + + /** + * @brief 用于 get_fmt() + * @see 格式信息请查看 devicetree-specification-v0.3#2.3,#2.4 等部分 + */ + static constexpr const dt_prop_fmt_t props[] = { + { .prop_name = (char*)"", .fmt = FMT_EMPTY}, + { .prop_name = (char*)"compatible", .fmt = FMT_STRINGLIST}, + { .prop_name = (char*)"model", .fmt = FMT_STRING}, + { .prop_name = (char*)"phandle", .fmt = FMT_U32}, + { .prop_name = (char*)"status", .fmt = FMT_STRING}, + { .prop_name = (char*)"#address-cells", .fmt = FMT_U32}, + { .prop_name = (char*)"#size-cells", .fmt = FMT_U32}, + { .prop_name = (char*)"#interrupt-cells", .fmt = FMT_U32}, + { .prop_name = (char*)"reg", .fmt = FMT_REG}, + { .prop_name = (char*)"virtual-reg", .fmt = FMT_U32}, + { .prop_name = (char*)"ranges", .fmt = FMT_RANGES}, + { .prop_name = (char*)"dma-ranges", .fmt = FMT_RANGES}, + { .prop_name = (char*)"name", .fmt = FMT_STRING}, + { .prop_name = (char*)"device_type", .fmt = FMT_STRING}, + { .prop_name = (char*)"interrupts", .fmt = FMT_U32}, + { .prop_name = (char*)"interrupt-parent", .fmt = FMT_PHANDLE}, + {.prop_name = (char*)"interrupt-controller", .fmt = FMT_EMPTY}, + { .prop_name = (char*)"value", .fmt = FMT_U32}, + { .prop_name = (char*)"offset", .fmt = FMT_U32}, + { .prop_name = (char*)"regmap", .fmt = FMT_U32}, + }; + + /** + * @brief 查找 _prop_name 在 dt_fmt_t 的索引 + * @param _prop_name 要查找的属性 + * @return dt_fmt_t 在 dt_fmt_t 中的索引 + */ + dt_fmt_t get_fmt(const char* _prop_name); + + /** + * @brief phandles 与 node 的映射关系 + */ + struct phandle_map_t { + uint32_t phandle; + node_t* node; + /// phandle 数量 + static size_t count; + }; + + /// dtb 信息 + static dtb_info_t dtb_info; + /// 节点数组 + static node_t nodes[MAX_NODES]; + /// phandle 数组 + static phandle_map_t phandle_map[MAX_NODES]; + + /** + * @brief 输出 reserved 内存 + */ + void dtb_mem_reserved(void); + + /** + * @brief 迭代函数 + * @param _cb_flags 要迭代的标签 + * @param _cb 迭代操作 + * @param _data 要传递的数据 + * @param _addr dtb 数据地址 + */ + void dtb_iter(uint8_t _cb_flags, bool (*_cb)(const iter_data_t*, void*), + void* _data, uintptr_t _addr = dtb_info.data); + + /** + * @brief 查找 phandle 映射 + * @param _phandle 要查找的 phandle + * @return node_t* _phandle 指向的节点 + */ + node_t* get_phandle(uint32_t _phandle); + + /** + * @brief 初始化节点 + * @param _iter 迭代变量 + * @param _data 数据,未使用 + * @return true 成功 + * @return false 失败 + */ + static bool dtb_init_cb(const iter_data_t* _iter, void* _data); + + /** + * @brief 初始化中断信息 + * @param _iter 迭代变量 + * @param _data 数据,未使用 + * @return true 成功 + * @return false 失败 + */ + static bool dtb_init_interrupt_cb(const iter_data_t* _iter, void* _data); + + /** + * @brief 输出不定长度的数据 + * @param _iter 要输出的迭代对象 + * @param _cells cell 数 + * @param _len 长度 + * @todo 补充说明 + */ + void + print_attr_propenc(const iter_data_t* _iter, size_t* _cells, size_t _len); + + /** + * @brief 填充 resource_t + * @param _resource 被填充的 + * @param _node 源节点 + * @param _prop 填充的数据 + */ + void fill_resource(resource_t* _resource, const node_t* _node, + const prop_t* _prop); + + /** + * @brief 通过路径寻找节点 + * @param _path 路径 + * @return node_t* 找到的节点 + */ + node_t* find_node_via_path(const char* _path); + +protected: + +public: + // 用于控制处理哪些属性 + /// 处理节点开始 + static constexpr const uint8_t DT_ITER_BEGIN_NODE = 0x01; + /// 处理节点结束 + static constexpr const uint8_t DT_ITER_END_NODE = 0x02; + /// 处理节点属性 + static constexpr const uint8_t DT_ITER_PROP = 0x04; + + /** + * @brief 获取单例 + * @return DTB& 静态对象 + */ + static DTB& get_instance(void); + + /** + * @brief 初始化 + * @return true 成功 + * @return false 失败 + */ + bool dtb_init(void); + + /** + * @brief 根据路径查找节点,返回使用的资源 + * @param _path 节点路径 + * @param _resource 资源 + * @return true 成功 + * @return false 失败 + */ + bool find_via_path(const char* _path, resource_t* _resource); + + /** + * @brief 根据节点名进行前缀查找 + * @param _prefix 要查找节点的前缀 + * @param _resource 结果数组 + * @return size_t _resource 长度 + * @note 根据节点 @ 前的名称查找,可能返回多个 resource + */ + size_t find_via_prefix(const char* _prefix, resource_t* _resource); + + /** + * @brief iter 输出 + * @param _os 输出流 + * @param _iter 要输出的 iter + * @return std::ostream& 输出流 + */ + friend std::ostream& + operator<<(std::ostream& _os, const iter_data_t& _iter); + /** + * @brief 路径输出 + * @param _os 输出流 + * @param _path 要输出的 path + * @return std::ostream& 输出流 + */ + friend std::ostream& operator<<(std::ostream& _os, const path_t& _path); +}; + +namespace BOOT_INFO { +/// 保存 sbi 传递的启动核 +extern "C" size_t dtb_init_hart; +}; // namespace BOOT_INFO + +extern "C" size_t dtb_init_hart; + +#endif /* SIMPLEKERNEL_DTB_H */ diff --git a/src/drv/include/driver_base.h b/src/drv/include/driver_base.h new file mode 100644 index 000000000..458732bba --- /dev/null +++ b/src/drv/include/driver_base.h @@ -0,0 +1,176 @@ + +/** + * @file driver_base.h + * @brief 设备驱动基类头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_DRIVER_BASE_H +#define SIMPLEKERNEL_DRIVER_BASE_H + +#include "buf.h" +#include "cstdint" +#include "map" +#include "resource.h" +#include "string" +#include "vector" + +/** + * @brief 设备驱动抽象,是所有驱动的基类 + */ +class driver_base_t { +private: + +protected: + +public: + /// 驱动名 + const mystl::string name; + + /** + * @brief 不使用空构造函数 + */ + driver_base_t(void) = delete; + + /** + * @brief 构造函数 + * @param _name 驱动名,用于与设备配对 + */ + driver_base_t(const mystl::string& _name = "drv_t"); + + /** + * @brief 默认析构函数 + */ + virtual ~driver_base_t(void) = default; + + /** + * @brief 从设备读 + * @param _buf 缓冲区 + */ + virtual int read(buf_t& _buf) = 0; + + /** + * @brief 向设备写 + * @param _buf 缓冲区 + */ + virtual int write(buf_t& _buf) = 0; + + /** + * @brief ioctl 控制 + * @param _resource 设备使用的资源 + * @param _buf 缓冲区 + */ + virtual int ioctl(uint8_t _cmd, void* _buf) = 0; + + /** + * @brief 获取设备状态 + *@param _cmd 指令 + */ + virtual int status(uint8_t _cmd) = 0; + + friend std::ostream& operator<<(std::ostream& _out, driver_base_t& _drv) { + printf("driver name: [%s]", _drv.name.c_str()); + return _out; + } +}; + +/** + * @brief 创建驱动实例工厂类 + */ +class driver_factory_t { +public: + /** + * @brief 用于创建驱动实例的回调函数函数指针 + */ + typedef driver_base_t* (*constructor_fun_t)(const resource_t& _resource); + +private: + /** + * @brief 类型名(非 compatible)-用于创建驱动实例的回调函数映射表 + */ + mystl::map type_name_ctor_map; + + /** + * @brief 使用默认构造 + */ + driver_factory_t(void) = default; + + /** + * @brief 使用默认析构 + */ + ~driver_factory_t(void) = default; + +public: + /** + * @brief 获取单例 + * @return drv_factory_t& 静态对象 + */ + static driver_factory_t& get_instance(void); + + /** + * @brief 注册回调函数 + * @param _compatible_name 驱动类型名 + * @param _ctor_fun 回调函数指针 + */ + void register_class(const mystl::string& _compatible_name, + const constructor_fun_t& _ctor_fun); + + /** + * @brief 创建驱动实例 + * @param _compatible_name 驱动类型名 + * @param _resource 需要的硬件信息 + * @return drv_t* 创建好的驱动实例指针 + */ + driver_base_t* get_class(const mystl::string& _compatible_name, + const resource_t& _resource) const; +}; + +// 这里的逻辑是,在填充设备的 drv 字段时,new 一个驱动对象 +// 以下三个宏都是为了这一目的 +// 使用时,首先在 xx_drv.h 的最后创建声明 +// define_call_back(xx_drv_t) +// 在 xx_drv.cpp 的最后进行定义 +// define_call_back(xx_drv_t) +// 使用 register_call_back(xx_drv_t) 将驱动注册到 drv_factory_t 中 +// 最后,在 match 函数中通过 drv_factory_t 创建新对象并赋值给设备的 drv + +/** + * @brief 声明用于创建驱动实例的回调函数 + * @param _class_name 驱动类型名 + */ +#define declare_call_back(_class_name) \ + _class_name* call_back_##_class_name(const resource_t& _resource) + +/** + * @brief 定义用于创建驱动实例的回调函数 + * @param _class_name 驱动类型名 + */ +#define define_call_back(_class_name) \ + _class_name* call_back_##_class_name(const resource_t& _resource) { \ + return new _class_name(_resource); \ + } + +/** + * @brief 注册用于创建驱动实例的回调函数 + * @param _bus 要注册的总线 + * @param _compatible_name 要注册的驱动名 + * @param _class_name 驱动类型名 + */ +#define register_call_back(_bus, _compatible_name, _class_name) \ + do { \ + driver_factory_t::get_instance().register_class( \ + _compatible_name, \ + (driver_factory_t::constructor_fun_t)&call_back_##_class_name); \ + _bus->add_driver(_compatible_name); \ + } while (0) + +#endif /* SIMPLEKERNEL_DRIVER_BASE_H */ diff --git a/src/drv/keyboard/include/keyboard.h b/src/drv/keyboard/include/keyboard.h new file mode 100644 index 000000000..eecd1b0c7 --- /dev/null +++ b/src/drv/keyboard/include/keyboard.h @@ -0,0 +1,646 @@ + +/** + * @file keyboard.h + * @brief 中断抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on Orange's 一个操作系统的实现 + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef _KEYBOARD_H_ +#define _KEYBOARD_H_ + +#include "cstdint" +#include "intr.h" + +/** + * @brief 键盘接口 + */ +class KEYBOARD { +private: + /// 键盘缓冲区大小 + static constexpr const uint32_t KB_BUFSIZE = 128; + + static constexpr const uint32_t KB_DATA = 0x60; + static constexpr const uint32_t KB_WRITE = 0x60; + static constexpr const uint32_t KB_STATUS = 0x64; + static constexpr const uint32_t KB_CMD = 0x64; + + /// 特殊键的扫描码 + static constexpr const uint32_t KB_BACKSPACE = 0x0E; + static constexpr const uint32_t KB_ENTER = 0x1C; + static constexpr const uint32_t KB_TAB = 0x0F; + static constexpr const uint32_t KB_ESC = 0x01; + static constexpr const uint32_t KB_SHIFT_L = 0x2A; + static constexpr const uint32_t KB_SHIFT_R = 0x36; + static constexpr const uint32_t KB_ALT_L = 0x38; + static constexpr const uint32_t KB_CAPS_LOCK = 0x3A; + static constexpr const uint32_t KB_CTRL_L = 0x1D; + static constexpr const uint32_t KB_NUM_LOCK = 0x45; + + /// Number of columns in keyma + static constexpr const uint32_t MAP_COLS = 3; + /// Number of scan codes (rows in keymap) + static constexpr const uint32_t NR_SCAN_CODES = 0x80; + static constexpr const uint32_t SC_MAX = NR_SCAN_CODES * MAP_COLS; + + /// 8 位的键盘扫描码的接通码使用前7位 + /// 其最高位置 1 即是其对应的断开码 + /// 该宏可以和获取的扫描码用来判断一个键是按下还是抬起 + static constexpr const uint32_t RELEASED_MASK = 0x80; + + /// Normal function keys + static constexpr const uint32_t FLAG_EXT = 0x00; + + /// Special keys + /// Esc + static constexpr const uint32_t ESC = (0x01 & FLAG_EXT); + /// Tab + static constexpr const uint32_t TAB = (0x02 & FLAG_EXT); + /// Enter + static constexpr const uint32_t ENTER = (0x03 & FLAG_EXT); + /// BackSpace + static constexpr const uint32_t BACKSPACE = (0x04 & FLAG_EXT); + + /// L GUI + static constexpr const uint32_t GUI_L = (0x05 & FLAG_EXT); + /// R GUI + static constexpr const uint32_t GUI_R = (0x06 & FLAG_EXT); + /// APPS + static constexpr const uint32_t APPS = (0x07 & FLAG_EXT); + + /// Shift, Ctrl, Alt + /// L Shift + static constexpr const uint32_t SHIFT_L = (0x08 & FLAG_EXT); + /// R Shift + static constexpr const uint32_t SHIFT_R = (0x09 & FLAG_EXT); + /// L Ctrl + static constexpr const uint32_t CTRL_L = (0x0A & FLAG_EXT); + /// R Ctrl + static constexpr const uint32_t CTRL_R = (0x0B & FLAG_EXT); + /// L Alt + static constexpr const uint32_t ALT_L = (0x0C & FLAG_EXT); + /// R Alt + static constexpr const uint32_t ALT_R = (0x0D & FLAG_EXT); + + /// Lock keys + /// Caps Lock + static constexpr const uint32_t CAPS_LOCK = (0x0E & FLAG_EXT); + /// Number Lock + static constexpr const uint32_t NUM_LOCK = (0x0F & FLAG_EXT); + /// Scroll Lock + static constexpr const uint32_t SCROLL_LOCK = (0x10 & FLAG_EXT); + + /// Function keys + /// F1 + static constexpr const uint32_t F1 = (0x11 & FLAG_EXT); + /// F2 + static constexpr const uint32_t F2 = (0x12 & FLAG_EXT); + /// F3 + static constexpr const uint32_t F3 = (0x13 & FLAG_EXT); + /// F4 + static constexpr const uint32_t F4 = (0x14 & FLAG_EXT); + /// F5 + static constexpr const uint32_t F5 = (0x15 & FLAG_EXT); + /// F6 + static constexpr const uint32_t F6 = (0x16 & FLAG_EXT); + /// F7 + static constexpr const uint32_t F7 = (0x17 & FLAG_EXT); + /// F8 + static constexpr const uint32_t F8 = (0x18 & FLAG_EXT); + /// F9 + static constexpr const uint32_t F9 = (0x19 & FLAG_EXT); + /// F10 + static constexpr const uint32_t F10 = (0x1A & FLAG_EXT); + /// F11 + static constexpr const uint32_t F11 = (0x1B & FLAG_EXT); + /// F12 + static constexpr const uint32_t F12 = (0x1C & FLAG_EXT); + + /// Control Pad + /// Print Screen + static constexpr const uint32_t PRINTSCREEN = (0x1D & FLAG_EXT); + /// Pause/Break + static constexpr const uint32_t PAUSEBREAK = (0x1E & FLAG_EXT); + /// Insert + static constexpr const uint32_t INSERT = (0x1F & FLAG_EXT); + /// Delete + static constexpr const uint32_t DELETE = (0x20 & FLAG_EXT); + /// Home + static constexpr const uint32_t HOME = (0x21 & FLAG_EXT); + /// End + static constexpr const uint32_t END = (0x22 & FLAG_EXT); + /// Page Up + static constexpr const uint32_t PAGEUP = (0x23 & FLAG_EXT); + /// Page Down + static constexpr const uint32_t PAGEDOWN = (0x24 & FLAG_EXT); + /// Up + static constexpr const uint32_t UP = (0x25 & FLAG_EXT); + /// Down + static constexpr const uint32_t DOWN = (0x26 & FLAG_EXT); + /// Left + static constexpr const uint32_t LEFT = (0x27 & FLAG_EXT); + /// Right + static constexpr const uint32_t RIGHT = (0x28 & FLAG_EXT); + + /// ACPI keys + /// Power + static constexpr const uint32_t POWER = (0x29 & FLAG_EXT); + /// Sleep + static constexpr const uint32_t SLEEP = (0x2A & FLAG_EXT); + /// Wake Up + static constexpr const uint32_t WAKE = (0x2B & FLAG_EXT); + + /// Num Pad + /// / + static constexpr const uint32_t PAD_SLASH = (0x2C & FLAG_EXT); + /// * + static constexpr const uint32_t PAD_STAR = (0x2D & FLAG_EXT); + /// - + static constexpr const uint32_t PAD_MINUS = (0x2E & FLAG_EXT); + /// & + static constexpr const uint32_t PAD_PLUS = (0x2F & FLAG_EXT); + /// Enter + static constexpr const uint32_t PAD_ENTER = (0x30 & FLAG_EXT); + /// . + static constexpr const uint32_t PAD_DOT = (0x31 & FLAG_EXT); + /// 0 + static constexpr const uint32_t PAD_0 = (0x32 & FLAG_EXT); + /// 1 + static constexpr const uint32_t PAD_1 = (0x33 & FLAG_EXT); + /// 2 + static constexpr const uint32_t PAD_2 = (0x34 & FLAG_EXT); + /// 3 + static constexpr const uint32_t PAD_3 = (0x35 & FLAG_EXT); + /// 4 + static constexpr const uint32_t PAD_4 = (0x36 & FLAG_EXT); + /// 5 + static constexpr const uint32_t PAD_5 = (0x37 & FLAG_EXT); + /// 6 + static constexpr const uint32_t PAD_6 = (0x38 & FLAG_EXT); + /// 7 + static constexpr const uint32_t PAD_7 = (0x39 & FLAG_EXT); + /// 8 + static constexpr const uint32_t PAD_8 = (0x3A & FLAG_EXT); + /// 9 + static constexpr const uint32_t PAD_9 = (0x3B & FLAG_EXT); + /// Up + static constexpr const uint32_t PAD_UP = PAD_8; + /// Down + static constexpr const uint32_t PAD_DOWN = PAD_2; + /// Left + static constexpr const uint32_t PAD_LEFT = PAD_4; + /// Right + static constexpr const uint32_t PAD_RIGHT = PAD_6; + /// Home + static constexpr const uint32_t PAD_HOME = PAD_7; + /// End + static constexpr const uint32_t PAD_END = PAD_1; + /// Page Up + static constexpr const uint32_t PAD_PAGEUP = PAD_9; + /// Page Down + static constexpr const uint32_t PAD_PAGEDOWN = PAD_3; + /// Ins + static constexpr const uint32_t PAD_INS = PAD_0; + /// Middle key + static constexpr const uint32_t PAD_MID = PAD_5; + /// Del + static constexpr const uint32_t PAD_DEL = PAD_DOT; + /// 键盘映射 + static constexpr const uint8_t keymap[NR_SCAN_CODES * MAP_COLS] = { + /* scan-code !Shift Shift E0 XX + */ + /* ==================================================================== + */ + /* 0x00 - none */ 0, + 0, + 0, + /* 0x01 - ESC */ ESC, + ESC, + 0, + /* 0x02 - '1' */ '1', + '!', + 0, + /* 0x03 - '2' */ '2', + '@', + 0, + /* 0x04 - '3' */ '3', + '#', + 0, + /* 0x05 - '4' */ '4', + '$', + 0, + /* 0x06 - '5' */ '5', + '%', + 0, + /* 0x07 - '6' */ '6', + '^', + 0, + /* 0x08 - '7' */ '7', + '&', + 0, + /* 0x09 - '8' */ '8', + '*', + 0, + /* 0x0A - '9' */ '9', + '(', + 0, + /* 0x0B - '0' */ '0', + ')', + 0, + /* 0x0C - '-' */ '-', + '_', + 0, + /* 0x0D - '=' */ '=', + '+', + 0, + /* 0x0E - BS */ BACKSPACE, + BACKSPACE, + 0, + /* 0x0F - TAB */ TAB, + TAB, + 0, + /* 0x10 - 'q' */ 'q', + 'Q', + 0, + /* 0x11 - 'w' */ 'w', + 'W', + 0, + /* 0x12 - 'e' */ 'e', + 'E', + 0, + /* 0x13 - 'r' */ 'r', + 'R', + 0, + /* 0x14 - 't' */ 't', + 'T', + 0, + /* 0x15 - 'y' */ 'y', + 'Y', + 0, + /* 0x16 - 'u' */ 'u', + 'U', + 0, + /* 0x17 - 'i' */ 'i', + 'I', + 0, + /* 0x18 - 'o' */ 'o', + 'O', + 0, + /* 0x19 - 'p' */ 'p', + 'P', + 0, + /* 0x1A - '[' */ '[', + '{', + 0, + /* 0x1B - ']' */ ']', + '}', + 0, + /* 0x1C - CR/LF */ ENTER, + ENTER, + PAD_ENTER, + /* 0x1D - l. Ctrl */ CTRL_L, + CTRL_L, + CTRL_R, + /* 0x1E - 'a' */ 'a', + 'A', + 0, + /* 0x1F - 's' */ 's', + 'S', + 0, + /* 0x20 - 'd' */ 'd', + 'D', + 0, + /* 0x21 - 'f' */ 'f', + 'F', + 0, + /* 0x22 - 'g' */ 'g', + 'G', + 0, + /* 0x23 - 'h' */ 'h', + 'H', + 0, + /* 0x24 - 'j' */ 'j', + 'J', + 0, + /* 0x25 - 'k' */ 'k', + 'K', + 0, + /* 0x26 - 'l' */ 'l', + 'L', + 0, + /* 0x27 - ';' */ ';', + ':', + 0, + /* 0x28 - '\'' */ '\'', + '"', + 0, + /* 0x29 - '`' */ '`', + '~', + 0, + /* 0x2A - l. SHIFT */ SHIFT_L, + SHIFT_L, + 0, + /* 0x2B - '\' */ '\\', + '|', + 0, + /* 0x2C - 'z' */ 'z', + 'Z', + 0, + /* 0x2D - 'x' */ 'x', + 'X', + 0, + /* 0x2E - 'c' */ 'c', + 'C', + 0, + /* 0x2F - 'v' */ 'v', + 'V', + 0, + /* 0x30 - 'b' */ 'b', + 'B', + 0, + /* 0x31 - 'n' */ 'n', + 'N', + 0, + /* 0x32 - 'm' */ 'm', + 'M', + 0, + /* 0x33 - ',' */ ',', + '<', + 0, + /* 0x34 - '.' */ '.', + '>', + 0, + /* 0x35 - '/' */ '/', + '?', + PAD_SLASH, + /* 0x36 - r. SHIFT */ SHIFT_R, + SHIFT_R, + 0, + /* 0x37 - '*' */ '*', + '*', + 0, + /* 0x38 - ALT */ ALT_L, + ALT_L, + ALT_R, + /* 0x39 - ' ' */ ' ', + ' ', + 0, + /* 0x3A - CapsLock */ CAPS_LOCK, + CAPS_LOCK, + 0, + /* 0x3B - F1 */ F1, + F1, + 0, + /* 0x3C - F2 */ F2, + F2, + 0, + /* 0x3D - F3 */ F3, + F3, + 0, + /* 0x3E - F4 */ F4, + F4, + 0, + /* 0x3F - F5 */ F5, + F5, + 0, + /* 0x40 - F6 */ F6, + F6, + 0, + /* 0x41 - F7 */ F7, + F7, + 0, + /* 0x42 - F8 */ F8, + F8, + 0, + /* 0x43 - F9 */ F9, + F9, + 0, + /* 0x44 - F10 */ F10, + F10, + 0, + /* 0x45 - NumLock */ NUM_LOCK, + NUM_LOCK, + 0, + /* 0x46 - ScrLock */ SCROLL_LOCK, + SCROLL_LOCK, + 0, + /* 0x47 - Home */ PAD_HOME, + '7', + HOME, + /* 0x48 - CurUp */ PAD_UP, + '8', + UP, + /* 0x49 - PgUp */ PAD_PAGEUP, + '9', + PAGEUP, + /* 0x4A - '-' */ PAD_MINUS, + '-', + 0, + /* 0x4B - Left */ PAD_LEFT, + '4', + LEFT, + /* 0x4C - MID */ PAD_MID, + '5', + 0, + /* 0x4D - Right */ PAD_RIGHT, + '6', + RIGHT, + /* 0x4E - '+' */ PAD_PLUS, + '+', + 0, + /* 0x4F - End */ PAD_END, + '1', + END, + /* 0x50 - Down */ PAD_DOWN, + '2', + DOWN, + /* 0x51 - PgDown */ PAD_PAGEDOWN, + '3', + PAGEDOWN, + /* 0x52 - Insert */ PAD_INS, + '0', + INSERT, + /* 0x53 - Delete */ PAD_DOT, + '.', + DELETE, + /* 0x54 - Enter */ 0, + 0, + 0, + /* 0x55 - ??? */ 0, + 0, + 0, + /* 0x56 - ??? */ 0, + 0, + 0, + /* 0x57 - F11 */ F11, + F11, + 0, + /* 0x58 - F12 */ F12, + F12, + 0, + /* 0x59 - ??? */ 0, + 0, + 0, + /* 0x5A - ??? */ 0, + 0, + 0, + /* 0x5B - ??? */ 0, + 0, + GUI_L, + /* 0x5C - ??? */ 0, + 0, + GUI_R, + /* 0x5D - ??? */ 0, + 0, + APPS, + /* 0x5E - ??? */ 0, + 0, + 0, + /* 0x5F - ??? */ 0, + 0, + 0, + /* 0x60 - ??? */ 0, + 0, + 0, + /* 0x61 - ??? */ 0, + 0, + 0, + /* 0x62 - ??? */ 0, + 0, + 0, + /* 0x63 - ??? */ 0, + 0, + 0, + /* 0x64 - ??? */ 0, + 0, + 0, + /* 0x65 - ??? */ 0, + 0, + 0, + /* 0x66 - ??? */ 0, + 0, + 0, + /* 0x67 - ??? */ 0, + 0, + 0, + /* 0x68 - ??? */ 0, + 0, + 0, + /* 0x69 - ??? */ 0, + 0, + 0, + /* 0x6A - ??? */ 0, + 0, + 0, + /* 0x6B - ??? */ 0, + 0, + 0, + /* 0x6C - ??? */ 0, + 0, + 0, + /* 0x6D - ??? */ 0, + 0, + 0, + /* 0x6E - ??? */ 0, + 0, + 0, + /* 0x6F - ??? */ 0, + 0, + 0, + /* 0x70 - ??? */ 0, + 0, + 0, + /* 0x71 - ??? */ 0, + 0, + 0, + /* 0x72 - ??? */ 0, + 0, + 0, + /* 0x73 - ??? */ 0, + 0, + 0, + /* 0x74 - ??? */ 0, + 0, + 0, + /* 0x75 - ??? */ 0, + 0, + 0, + /* 0x76 - ??? */ 0, + 0, + 0, + /* 0x77 - ??? */ 0, + 0, + 0, + /* 0x78 - ??? */ 0, + 0, + 0, + /* 0x78 - ??? */ 0, + 0, + 0, + /* 0x7A - ??? */ 0, + 0, + 0, + /* 0x7B - ??? */ 0, + 0, + 0, + /* 0x7C - ??? */ 0, + 0, + 0, + /* 0x7D - ??? */ 0, + 0, + 0, + /* 0x7E - ??? */ 0, + 0, + 0, + /* 0x7F - ??? */ 0, + 0, + 0, + }; + bool shift; + bool caps; + bool ctrl; + bool num; + bool alt; + +protected: + +public: + KEYBOARD(void); + ~KEYBOARD(void); + + /** + * @brief 获取单例 + * @return KEYBOARD& 静态对象 + */ + static KEYBOARD& get_instance(void); + + /** + * @brief 初始化 + * @return int32_t 成功返回 0 + */ + int32_t init(void); + + /** + * @brief 从键盘读 + * @return uint8_t 读到的数据 + */ + uint8_t read(void); + + /** + * @brief 设置键盘中断处理函数 + * @param _h 处理函数 + * @return int32_t 设置成功返回 0 + */ + int32_t set_handle(INTR::interrupt_handler_t _h); +}; + +#endif /* _KEYBOARD_H_ */ diff --git a/src/drv/keyboard/keyboard.cpp b/src/drv/keyboard/keyboard.cpp new file mode 100644 index 000000000..1eb116afb --- /dev/null +++ b/src/drv/keyboard/keyboard.cpp @@ -0,0 +1,130 @@ + +/** + * @file keyboard.cpp + * @brief 中断抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on Orange's 一个操作系统的实现 + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "keyboard.h" +#include "cstdio" +#include "io.h" + +/** + * @brief 默认处理函数 + */ +static void default_keyboard_handle(INTR::intr_context_t*) { + KEYBOARD::get_instance().read(); + return; +} + +KEYBOARD::KEYBOARD(void) { + shift = false; + caps = false; + ctrl = false; + num = true; + alt = false; + return; +} + +KEYBOARD::~KEYBOARD(void) { + return; +} + +uint8_t KEYBOARD::read(void) { + uint8_t scancode = IO::get_instance().inb(KB_DATA); + // 判断是否出错 + if (!scancode) { + warn("scancode error.\n"); + return '\0'; + } + uint8_t letter = 0; + // 开始处理 + switch (scancode) { + // 如果是特殊字符,则单独处理 + case KB_SHIFT_L: + shift = true; + break; + // 扫描码 + 0x80 即为松开的编码 + case KB_SHIFT_L | RELEASED_MASK: + shift = false; + break; + case KB_SHIFT_R: + shift = true; + break; + case KB_SHIFT_R | RELEASED_MASK: + shift = false; + break; + case KB_CTRL_L: + ctrl = true; + break; + case KB_CTRL_L | RELEASED_MASK: + ctrl = false; + break; + case KB_ALT_L: + alt = true; + break; + case KB_ALT_L | RELEASED_MASK: + alt = false; + break; + case KB_CAPS_LOCK: + // 与上次按下的状态相反 + caps = ((!caps) & 0x01); + break; + case KB_NUM_LOCK: + num = ((!num) & 0x01); + break; + case KB_BACKSPACE: + IO::get_instance().put_char('\b'); + letter = '\b'; + break; + case KB_ENTER: + IO::get_instance().put_char('\n'); + letter = '\n'; + break; + case KB_TAB: + IO::get_instance().put_char('\t'); + letter = '\t'; + break; + // 一般字符输出 + default: + // 首先排除释放按键 + if (!(scancode & RELEASED_MASK)) { + // 计算在 keymap 中的位置 + letter = keymap[(uint8_t)(scancode * 3) + (uint8_t)shift]; + IO::get_instance().put_char(letter); + break; + } + else { + break; + } + } + return letter; +} + +KEYBOARD& KEYBOARD::get_instance(void) { + /// 定义全局 KEYBOARD 对象 + static KEYBOARD keyboard; + return keyboard; +} + +int32_t KEYBOARD::init(void) { + set_handle(&default_keyboard_handle); + INTR::get_instance().enable_irq(INTR::IRQ1); + info("keyboard init.\n"); + return 0; +} + +int32_t KEYBOARD::set_handle(INTR::interrupt_handler_t _h) { + INTR::get_instance().register_interrupt_handler(INTR::IRQ1, _h); + return 0; +} diff --git a/src/drv/multiboot2/include/multiboot2.h b/src/drv/multiboot2/include/multiboot2.h new file mode 100644 index 000000000..62b077ad3 --- /dev/null +++ b/src/drv/multiboot2/include/multiboot2.h @@ -0,0 +1,341 @@ + +/** + * @file multiboot2.h + * @brief multiboot2 解析 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_MULTIBOOT2_H +#define SIMPLEKERNEL_MULTIBOOT2_H + +#include "boot_info.h" +#include "cstdbool" +#include "cstdint" + +/// @see Multiboot2 Specification version 2.0.pdf +// 启动后,在 32 位内核进入点,机器状态如下: +// 1. CS 指向基地址为 0x00000000,限长为4G – 1的代码段描述符。 +// 2. DS,SS,ES,FS 和 GS 指向基地址为0x00000000,限长为4G – +// 1的数据段描述符。 +// 3. A20 地址线已经打开。 +// 4. 页机制被禁止。 +// 5. 中断被禁止。 +// 6. EAX = 0x2BADB002 +// 7. 系统信息和启动信息块的线性地址保存在 EBX中(相当于一个指针)。 +// 以下即为这个信息块的结构 + +/** + * @brief MULTIBOOT2 接口抽象 + */ +class MULTIBOOT2 { +private: + /* How many bytes from the start of the file we search for the header. */ + static constexpr const uint32_t MULTIBOOT_SEARCH = 32768; + static constexpr const uint32_t MULTIBOOT_HEADER_ALIGN = 8; + + /* The magic field should contain this. */ + static constexpr const uint32_t MULTIBOOT2_HEADER_MAGIC = 0xe85250d6; + + /* This should be in %eax. */ + static constexpr const uint32_t MULTIBOOT2_BOOTLOADER_MAGIC = 0x36d76289; + + /* Alignment of multiboot modules. */ + static constexpr const uint32_t MULTIBOOT_MOD_ALIGN = 0x00001000; + + /* Alignment of the multiboot info structure. */ + static constexpr const uint32_t MULTIBOOT_INFO_ALIGN = 0x00000008; + + /* Flags set in the 'flags' member of the multiboot header. */ + + static constexpr const uint32_t MULTIBOOT_TAG_ALIGN = 8; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_END = 0; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_CMDLINE = 1; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME = 2; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_MODULE = 3; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_BASIC_MEMINFO = 4; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_BOOTDEV = 5; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_MMAP = 6; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_VBE = 7; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_FRAMEBUFFER = 8; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_ELF_SECTIONS = 9; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_APM = 10; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_EFI32 = 11; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_EFI64 = 12; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_SMBIOS = 13; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_ACPI_OLD = 14; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_ACPI_NEW = 15; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_NETWORK = 16; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_EFI_MMAP = 17; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_EFI_BS = 18; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_EFI32_IH = 19; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_EFI64_IH = 20; + static constexpr const uint32_t MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR = 21; + + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_END = 0; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST + = 1; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_ADDRESS = 2; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS = 3; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS = 4; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_FRAMEBUFFER = 5; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_MODULE_ALIGN = 6; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_EFI_BS = 7; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 + = 8; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 + = 9; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_RELOCATABLE = 10; + + static constexpr const uint32_t MULTIBOOT_ARCHITECTURE_I386 = 0; + static constexpr const uint32_t MULTIBOOT_ARCHITECTURE_MIPS32 = 4; + static constexpr const uint32_t MULTIBOOT_HEADER_TAG_OPTIONAL = 1; + + static constexpr const uint32_t MULTIBOOT_LOAD_PREFERENCE_NONE = 0; + static constexpr const uint32_t MULTIBOOT_LOAD_PREFERENCE_LOW = 1; + static constexpr const uint32_t MULTIBOOT_LOAD_PREFERENCE_HIGH = 2; + + static constexpr const uint32_t MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED + = 1; + static constexpr const uint32_t MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED + = 2; + + struct multiboot_header_t { + // Must be MULTIBOOT_MAGIC - see above. + uint32_t magic; + // ISA + uint32_t architecture; + // Total header length. + uint32_t header_length; + // The above fields plus this one must equal 0 mod 2^32. + uint32_t checksum; + }; + + struct multiboot_header_tag_t { + uint16_t type; + uint16_t flags; + uint32_t size; + }; + + struct multiboot_header_tag_information_request_t : multiboot_header_tag_t { + uint32_t requests[0]; + }; + + struct multiboot_header_tag_address_t : multiboot_header_tag_t { + uint32_t header_addr; + uint32_t load_addr; + uint32_t load_end_addr; + uint32_t bss_end_addr; + }; + + struct multiboot_header_tag_entry_address_t : multiboot_header_tag_t { + uint32_t entry_addr; + }; + + struct multiboot_header_tag_console_flags_t : multiboot_header_tag_t { + uint32_t console_flags; + }; + + struct multiboot_header_tag_framebuffer_t : multiboot_header_tag_t { + uint32_t width; + uint32_t height; + uint32_t depth; + }; + + struct multiboot_header_tag_module_align_t : multiboot_header_tag_t { + ; + }; + + struct multiboot_header_tag_relocatable_t : multiboot_header_tag_t { + uint32_t min_addr; + uint32_t max_addr; + uint32_t align; + uint32_t preference; + }; + + struct multiboot_color_t { + uint8_t red; + uint8_t green; + uint8_t blue; + }; + + static constexpr const uint32_t MULTIBOOT_MEMORY_AVAILABLE = 1; + static constexpr const uint32_t MULTIBOOT_MEMORY_RESERVED = 2; + static constexpr const uint32_t MULTIBOOT_MEMORY_ACPI_RECLAIMABLE = 3; + static constexpr const uint32_t MULTIBOOT_MEMORY_NVS = 4; + static constexpr const uint32_t MULTIBOOT_MEMORY_BADRAM = 5; + + struct multiboot_mmap_entry_t { + uint64_t addr; + uint64_t len; + uint32_t type; + uint32_t zero; + }; + + struct multiboot_tag_t { + uint32_t type; + uint32_t size; + }; + + struct multiboot_tag_string_t : multiboot_tag_t { + char string[0]; + }; + + struct multiboot_tag_module_t : multiboot_tag_t { + uint32_t mod_start; + uint32_t mod_end; + char cmdline[0]; + }; + + struct multiboot_tag_basic_meminfo_t : multiboot_tag_t { + uint32_t mem_lower; + uint32_t mem_upper; + }; + + struct multiboot_tag_bootdev_t : multiboot_tag_t { + uint32_t biosdev; + uint32_t slice; + uint32_t part; + }; + + struct multiboot_tag_mmap_t : multiboot_tag_t { + uint32_t entry_size; + uint32_t entry_version; + multiboot_mmap_entry_t entries[0]; + }; + + struct multiboot_vbe_info_block_t { + uint8_t external_specification[512]; + }; + + struct multiboot_vbe_mode_info_block_t { + uint8_t external_specification[256]; + }; + + struct multiboot_tag_vbe_t : multiboot_tag_t { + uint16_t vbe_mode; + uint16_t vbe_interface_seg; + uint16_t vbe_interface_off; + uint16_t vbe_interface_len; + + multiboot_vbe_info_block_t vbe_control_info; + multiboot_vbe_mode_info_block_t vbe_mode_info; + }; + + struct multiboot_tag_elf_sections_t : multiboot_tag_t { + uint32_t num; + uint32_t entsize; + // 段字符串表索引 + uint32_t shndx; + char sections[0]; + }; + + struct multiboot_tag_apm_t : multiboot_tag_t { + uint16_t version; + uint16_t cseg; + uint32_t offset; + uint16_t cseg_16; + uint16_t dseg; + uint16_t flags; + uint16_t cseg_len; + uint16_t cseg_16_len; + uint16_t dseg_len; + }; + + struct multiboot_tag_efi32_t : multiboot_tag_t { + uint32_t pointer; + }; + + struct multiboot_tag_efi64_t : multiboot_tag_t { + uint64_t pointer; + }; + + struct multiboot_tag_smbios_t : multiboot_tag_t { + uint8_t major; + uint8_t minor; + uint8_t reserved[6]; + uint8_t tables[0]; + }; + + struct multiboot_tag_old_acpi_t : multiboot_tag_t { + uint8_t rsdp[0]; + }; + + struct multiboot_tag_new_acpi_t : multiboot_tag_t { + uint8_t rsdp[0]; + }; + + struct multiboot_tag_network_t : multiboot_tag_t { + uint8_t dhcpack[0]; + }; + + struct multiboot_tag_efi_mmap_t : multiboot_tag_t { + uint32_t descr_size; + uint32_t descr_vers; + uint8_t efi_mmap[0]; + }; + + struct multiboot_tag_efi32_ih_t : multiboot_tag_t { + uint32_t pointer; + }; + + struct multiboot_tag_efi64_ih_t : multiboot_tag_t { + uint64_t pointer; + }; + + struct multiboot_tag_load_base_addr_t : multiboot_tag_t { + uint32_t load_base_addr; + }; + + // 迭代变量 + // 与 multiboot_tag_t 相同 + struct iter_data_t { + uint32_t type; + uint32_t size; + }; + +public: + /** + * @brief 获取单例 + * @return MULTIBOOT2& 静态对象 + */ + static MULTIBOOT2& get_instance(void); + + /** + * @brief 初始化 + * @return true 成功 + * @return false 失败 + */ + bool multiboot2_init(void); + + /** + * @brief 迭代器 + * @param _fun 迭代操作 + * @param _data 数据 + */ + void multiboot2_iter(bool (*_fun)(const iter_data_t*, void*), void* _data); + + /** + * @brief 获取内存信息 + * @param _iter_data 迭代变量 + * @param _data 数据 + * @return true 成功 + * @return false 失败 + */ + static bool get_memory(const iter_data_t* _iter_data, void* _data); +}; + +namespace BOOT_INFO { +/// 魔数 +extern "C" uint32_t multiboot2_magic; +}; // namespace BOOT_INFO + +#endif /* SIMPLEKERNEL_MULTIBOOT2_H */ diff --git a/src/drv/multiboot2/multiboot2.cpp b/src/drv/multiboot2/multiboot2.cpp new file mode 100644 index 000000000..463a3dedb --- /dev/null +++ b/src/drv/multiboot2/multiboot2.cpp @@ -0,0 +1,121 @@ + +/** + * @file multiboot2.cpp + * @brief multiboot2 解析实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "multiboot2.h" +#include "boot_info.h" +#include "cassert" +#include "common.h" +#include "cstdio" +#include "resource.h" + +MULTIBOOT2& MULTIBOOT2::get_instance(void) { + /// 定义全局 MULTIBOOT2 对象 + static MULTIBOOT2 multiboot2; + return multiboot2; +} + +bool MULTIBOOT2::multiboot2_init(void) { + uintptr_t addr = BOOT_INFO::boot_info_addr; + // 判断魔数是否正确 + assert(BOOT_INFO::multiboot2_magic == MULTIBOOT2_BOOTLOADER_MAGIC); + assert((reinterpret_cast(addr) & 7) == 0); + // addr+0 保存大小 + BOOT_INFO::boot_info_size = *(uint32_t*)addr; + return true; +} + +/// @todo 优化 +void MULTIBOOT2::multiboot2_iter(bool (*_fun)(const iter_data_t*, void*), + void* _data) { + uintptr_t addr = BOOT_INFO::boot_info_addr; + // 下一字节开始为 tag 信息 + iter_data_t* tag = (iter_data_t*)(addr + 8); + for (; tag->type != MULTIBOOT_TAG_TYPE_END; + tag = (iter_data_t*)((uint8_t*)tag + COMMON::ALIGN(tag->size, 8))) { + if (_fun(tag, _data) == true) { + return; + } + } + return; +} + +// 读取 grub2 传递的物理内存信息,保存到 e820map_t 结构体中 +// 一般而言是这样的 +// 地址(长度) 类型 +// 0x00(0x9F000) 0x1 +// 0x9F000(0x1000) 0x2 +// 0xE8000(0x18000) 0x2 +// 0x100000(0x7EF0000) 0x1 +// 0x7FF0000(0x10000) 0x3 +// 0xFFFC0000(0x40000) 0x2 +bool MULTIBOOT2::get_memory(const iter_data_t* _iter_data, void* _data) { + if (_iter_data->type != MULTIBOOT2::MULTIBOOT_TAG_TYPE_MMAP) { + return false; + } + resource_t* resource = (resource_t*)_data; + resource->type |= resource_t::MEM; + resource->name = (char*)"available phy memory"; + resource->mem.addr = 0x0; + resource->mem.len = 0; + MULTIBOOT2::multiboot_mmap_entry_t* mmap + = ((MULTIBOOT2::multiboot_tag_mmap_t*)_iter_data)->entries; + for (; (uint8_t*)mmap < (uint8_t*)_iter_data + _iter_data->size; + mmap + = (MULTIBOOT2:: + multiboot_mmap_entry_t*)((uint8_t*)mmap + + ((MULTIBOOT2::multiboot_tag_mmap_t*) + _iter_data) + ->entry_size)) { + // 如果是可用内存或地址小于 1M + // 这里将 0~1M 的空间全部算为可用,在 c++ 库可用后进行优化 + if (mmap->type == MULTIBOOT_MEMORY_AVAILABLE + || mmap->addr < 1 * COMMON::MB) { + // 长度+ + resource->mem.len += mmap->len; + } + } + return true; +} + +namespace BOOT_INFO { +// 地址 +uintptr_t boot_info_addr; +// 长度 +size_t boot_info_size; +// 魔数 +uint32_t multiboot2_magic; + +bool inited = false; + +bool init(void) { + auto res = MULTIBOOT2::get_instance().multiboot2_init(); + if (inited == false) { + inited = true; + info("BOOT_INFO init.\n"); + } + else { + info("BOOT_INFO reinit.\n"); + } + return res; +} + +resource_t get_memory(void) { + resource_t resource; + MULTIBOOT2::get_instance().multiboot2_iter(MULTIBOOT2::get_memory, + &resource); + return resource; +} +}; // namespace BOOT_INFO diff --git a/src/drv/opensbi/include/opensbi.h b/src/drv/opensbi/include/opensbi.h new file mode 100644 index 000000000..c02b641a1 --- /dev/null +++ b/src/drv/opensbi/include/opensbi.h @@ -0,0 +1,155 @@ + +/** + * @file opensbi.cpp + * @brief opensbi 接口头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_OPENSBI_H +#define SIMPLEKERNEL_OPENSBI_H + +#include "cstdint" + +/** + * @brief opensbi 接口抽象 + * @see + * https://github.com/riscv-non-isa/riscv-sbi-doc/blob/master/riscv-sbi.adoc + */ +class OPENSBI { +public: + /** + * @brief sbi 返回值 + */ + struct sbiret_t { + enum : long { + SUCCESS = 0, + ERR_FAILED = -1, + ERR_NOT_SUPPORTED = -2, + ERR_INVALID_PARAM = -3, + ERR_DENIED = -4, + ERR_INVALID_ADDRESS = -5, + ERR_ALREADY_AVAILABLE = -6, + ERR_ALREADY_STARTED = -7, + ERR_ALREADY_STOPPED = -8, + }; + + /// 错误码 + long error; + /// 返回值 + long value; + }; + +private: + /// 设置定时器 + static constexpr const uint32_t FID_SET_TIMER = 0x0; + static constexpr const uint32_t EID_SET_TIMER = 0x54494D45; + + /// uart 输出字符 + static constexpr const uint32_t FID_CONSOLE_PUTCHAR = 0x0; + static constexpr const uint32_t EID_CONSOLE_PUTCHAR = 0x1; + + /// uart 获取字符 + static constexpr const uint32_t FID_CONSOLE_GETCHAR = 0x0; + static constexpr const uint32_t EID_CONSOLE_GETCHAR = 0x2; + + /// 清空 IPI + static constexpr const uint32_t FID_CLEAR_IPI = 0x0; + static constexpr const uint32_t EID_CLEAR_IPI = 0x3; + + /// 发送 IPI + static constexpr const uint32_t FID_SEND_IPI = 0x0; + static constexpr const uint32_t EID_SEND_IPI = 0x735049; + + /// 关机 + static constexpr const uint32_t FID_SHUTDOWN = 0x0; + static constexpr const uint32_t EID_SHUTDOWN = 0x8; + + /// 启动 hart + static constexpr const uint32_t FID_HART_START = 0x0; + static constexpr const uint32_t EID_HART_START = 0x48534D; + + /** + * @brief ecall 借口 + * @param _arg0 使用 a0 传递 + * @param _arg1 使用 a1 传递 + * @param _arg2 使用 a2 传递 + * @param _arg3 使用 a3 传递 + * @param _arg4 使用 a4 传递 + * @param _arg5 使用 a5 传递 + * @param _fid 使用 a6 传递 + * @param _eid 使用 a7 传递 + * @return sbiret_t + */ + sbiret_t + ecall(unsigned long _arg0, unsigned long _arg1, unsigned long _arg2, + unsigned long _arg3, unsigned long _arg4, unsigned long _arg5, + int _fid, int _eid); + +protected: + +public: + /** + * @brief 获取单例 + * @return OPENSBI& 静态对象 + */ + static OPENSBI& get_instance(void); + + /** + * @brief 输出一个字符 + * @param _c 要输出的字符 + */ + void put_char(const char _c); + + /** + * @brief 从 uart 读取一个字符 + * @return uint8_t 读取到的字符,没有读到数据返回 0xFF + * @note 不会阻塞 + */ + uint8_t get_char(void); + + /** + * @brief 设置时钟 + * @param _value 要设置的时间 + * @return sbiret_t 返回值 + */ + sbiret_t set_timer(uint64_t _value); + + /** + * @brief 发送 ipi(inter-processor interrupt) 给指定的 hart + * @param _hart_mask 要发送给的 hart + * @note hart_mask is a virtual address that points to a bit-vector of + * harts. The bit vector is represented as a sequence of unsigned longs + * whose length equals the number of harts in the system divided by the + * number of bits in an unsigned long, rounded up to the next integer. + * @return sbiret_t 返回值 + */ + sbiret_t send_ipi(const unsigned long* _hart_mask); + + /** + * @brief 启动指定的 hart + * @param _hartid 要启动的 hart id + * @param _start_addr 启动后执行的程序地址 + * @param _opaque 参数 + * The opaque parameter is a XLEN-bit value which will be set in the a1 + * register when the hart starts executing at start_addr. + * @return sbiret_t 返回值 + * @note 启动后的寄存器状态 + * satp: 0 + * sstatus.SIE: 0 + * a0: hartid + * a1: _opaque + */ + sbiret_t hart_start(unsigned long _hartid, unsigned long _start_addr, + unsigned long _opaque); +}; + +#endif /* SIMPLEKERNEL_OPENSBI_H */ diff --git a/src/drv/opensbi/opensbi.cpp b/src/drv/opensbi/opensbi.cpp new file mode 100644 index 000000000..c544d469d --- /dev/null +++ b/src/drv/opensbi/opensbi.cpp @@ -0,0 +1,72 @@ + +/** + * @file opensbi.cpp + * @brief opensbi 接口实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "opensbi.h" + +OPENSBI::sbiret_t +OPENSBI::ecall(unsigned long _arg0, unsigned long _arg1, unsigned long _arg2, + unsigned long _arg3, unsigned long _arg4, unsigned long _arg5, + int _fid, int _eid) { + OPENSBI::sbiret_t ret; + register uintptr_t a0 asm("a0") = (uintptr_t)(_arg0); + register uintptr_t a1 asm("a1") = (uintptr_t)(_arg1); + register uintptr_t a2 asm("a2") = (uintptr_t)(_arg2); + register uintptr_t a3 asm("a3") = (uintptr_t)(_arg3); + register uintptr_t a4 asm("a4") = (uintptr_t)(_arg4); + register uintptr_t a5 asm("a5") = (uintptr_t)(_arg5); + register uintptr_t a6 asm("a6") = (uintptr_t)(_fid); + register uintptr_t a7 asm("a7") = (uintptr_t)(_eid); + asm("ecall" + : "+r"(a0), "+r"(a1) + : "r"(a2), "r"(a3), "r"(a4), "r"(a5), "r"(a6), "r"(a7) + : "memory"); + ret.error = a0; + ret.value = a1; + return ret; +} + +OPENSBI& OPENSBI::get_instance(void) { + /// 定义全局 OPENSBI 对象 + static OPENSBI opensbi; + return opensbi; +} + +void OPENSBI::put_char(const char _c) { + ecall(_c, 0, 0, 0, 0, 0, FID_CONSOLE_PUTCHAR, EID_CONSOLE_PUTCHAR); + return; +} + +uint8_t OPENSBI::get_char(void) { + return (uint8_t)ecall(0, 0, 0, 0, 0, 0, FID_CONSOLE_GETCHAR, + EID_CONSOLE_GETCHAR) + .value; +} + +OPENSBI::sbiret_t OPENSBI::set_timer(uint64_t _value) { + return ecall(_value, 0, 0, 0, 0, 0, FID_SET_TIMER, EID_SET_TIMER); +} + +OPENSBI::sbiret_t OPENSBI::send_ipi(const unsigned long* _hart_mask) { + return ecall((uintptr_t)_hart_mask, 0, 0, 0, 0, 0, FID_SEND_IPI, + EID_SEND_IPI); +} + +OPENSBI::sbiret_t +OPENSBI::hart_start(unsigned long _hartid, unsigned long _start_addr, + unsigned long _opaque) { + return ecall(_hartid, _start_addr, _opaque, 0, 0, 0, FID_HART_START, + EID_HART_START); +} diff --git a/src/drv/sbi_console/include/sbi_console.h b/src/drv/sbi_console/include/sbi_console.h new file mode 100644 index 000000000..b71dcb862 --- /dev/null +++ b/src/drv/sbi_console/include/sbi_console.h @@ -0,0 +1,76 @@ + +/** + * @file sbi_console.h + * @brief opensbi console 接口头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_SBI_CONSOLE_H +#define SIMPLEKERNEL_SBI_CONSOLE_H + +#include "color.h" +#include "cstddef" +#include "cstdint" + +class SBI_CONSOLE { +private: + /// 当前命令行颜色 + static COLOR::color_t color; + +protected: + +public: + SBI_CONSOLE(void); + ~SBI_CONSOLE(void); + + /** + * @brief 写字符 + * @param _c 要写的字符 + */ + void put_char(const char _c) const; + + /** + * @brief 写字符串 + * @param _s 要写的字符串 + */ + void write_string(const char* _s) const; + + /** + * @brief 写指定长度的字符串 + * @param _s 要写的字符串 + * @param _len 要写的长度 + */ + void write(const char* _s, size_t _len) const; + + /** + * @brief 读一个字符 + * @return uint8_t 读取到的字符 + * @todo + */ + uint8_t get_char(void) const; + + /** + * @brief 设置颜色 + * @param _color 要设置的颜色 + * @todo + */ + void set_color(const COLOR::color_t _color) const; + + /** + * @brief 获取正在使用的颜色 + * @return COLOR::color_t 使用的颜色 + * @todo + */ + COLOR::color_t get_color(void) const; +}; + +#endif /* SIMPLEKERNEL_SBI_CONSOLE_H */ diff --git a/src/drv/sbi_console/sbi_console.cpp b/src/drv/sbi_console/sbi_console.cpp new file mode 100644 index 000000000..20b1f7e5d --- /dev/null +++ b/src/drv/sbi_console/sbi_console.cpp @@ -0,0 +1,133 @@ + +/** + * @file sbi_console.cpp + * @brief opensbi console 接口实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "sbi_console.h" +#include "cstring" +#include "opensbi.h" + +// 默认颜色为白色 +COLOR::color_t SBI_CONSOLE::color = COLOR::WHITE; + +SBI_CONSOLE::SBI_CONSOLE(void) { + // 输出初始化信息 + write_string("sbi console init.\n"); + return; +} + +SBI_CONSOLE::~SBI_CONSOLE(void) { + return; +} + +void SBI_CONSOLE::put_char(const char _c) const { + // 调用 opensbi 提供的接口 + OPENSBI::get_instance().put_char(_c); + return; +} + +void SBI_CONSOLE::write_string(const char* _s) const { + write(_s, strlen(_s)); + return; +} + +void SBI_CONSOLE::write(const char* _s, size_t _len) const { + for (size_t i = 0; i < _len; i++) { + put_char(_s[i]); + } + return; +} + +uint8_t SBI_CONSOLE::get_char(void) const { + return 0; +} + +void SBI_CONSOLE::set_color(const COLOR::color_t _color) const { + // 根据 _color 构造字符串 + char* tmp = nullptr; + switch (_color) { + case COLOR::BLACK: { + tmp = (char*)"\033[30m"; + break; + } + case COLOR::RED: { + tmp = (char*)"\033[31m"; + break; + } + case COLOR::GREEN: { + tmp = (char*)"\033[32m"; + break; + } + case COLOR::YELLOW: { + tmp = (char*)"\033[33m"; + break; + } + case COLOR::BLUE: { + tmp = (char*)"\033[34m"; + break; + } + case COLOR::PURPLE: { + tmp = (char*)"\033[35m"; + break; + } + case COLOR::CYAN: { + tmp = (char*)"\033[36m"; + break; + } + case COLOR::WHITE: { + tmp = (char*)"\033[37m"; + break; + } + case COLOR::GREY: { + tmp = (char*)"\033[90m"; + break; + } + case COLOR::LIGHT_RED: { + tmp = (char*)"\033[91m"; + break; + } + case COLOR::LIGHT_GREEN: { + tmp = (char*)"\033[92m"; + break; + } + case COLOR::LIGHT_YELLOW: { + tmp = (char*)"\033[93m"; + break; + } + case COLOR::LIGHT_BLUE: { + tmp = (char*)"\033[94m"; + break; + } + case COLOR::LIGHT_PURPLE: { + tmp = (char*)"\033[95m"; + break; + } + case COLOR::LIGHT_CYAN: { + tmp = (char*)"\033[96m"; + break; + } + case COLOR::LIGHT_WHITE: { + tmp = (char*)"\033[97m"; + break; + } + } + // 写入 + write_string(tmp); + color = _color; + return; +} + +COLOR::color_t SBI_CONSOLE::get_color(void) const { + return color; +} diff --git a/src/drv/tui/include/tui.h b/src/drv/tui/include/tui.h new file mode 100644 index 000000000..435964d9b --- /dev/null +++ b/src/drv/tui/include/tui.h @@ -0,0 +1,227 @@ + +/** + * @file tui.h + * @brief TUI 接口头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_TUI_H +#define SIMPLEKERNEL_TUI_H + +#include "color.h" +#include "cstddef" +#include "cstdint" + +/** + * @brief 位置信息 + */ +class pos_t { +public: + /** + * @brief 构造一个位置对象 + * @param _col 列 + * @param _row 行 + */ + pos_t(const uint8_t _col, const uint8_t _row); + + ~pos_t(void); + // 列 + uint8_t col; + // 行 + uint8_t row; +}; + +/** + * @brief 颜色信息 + */ +class col_t { +public: + /** + * @brief 构造一个颜色对象 + * @param _fore 前景色 + * @param _back 背景色 + */ + col_t(const COLOR::color_t _fore, const COLOR::color_t _back); + + ~col_t(void); + // 前景色 + uint8_t fore : 4; + // 背景色 + uint8_t back : 4; +}; + +/** + * @brief 内存中的字符对象 + */ +class char_t { +public: + char_t(void); + + /** + * @brief 构造一个内存中的字符对象 + * @param _c 字符 + * @param _color 颜色 + */ + char_t(const uint8_t _c, const col_t _color); + + ~char_t(void); + // 字符 + uint8_t c; + // 颜色 + col_t color; +}; + +/** + * @brief TUI 接口 + */ +class TUI { +private: + /// CRT 控制寄存器-地址 + static constexpr const uint32_t TUI_ADDR = 0x3D4; + /// CRT 控制寄存器-数据 + static constexpr const uint32_t TUI_DATA = 0x3D5; + /// 光标高位 + static constexpr const uint32_t TUI_CURSOR_H = 0xE; + /// 光标低位 + static constexpr const uint32_t TUI_CURSOR_L = 0xF; + /// TUI 缓存基址 + /// @todo 从 grub 获取 + static constexpr const uint32_t TUI_MEM_BASE = 0xB8000; + /// TUI 缓存大小 + /// @todo 从 grub 获取 + static constexpr size_t TUI_MEM_SIZE = 0x8000; + /// 规定显示行数 + /// @todo 从 grub 获取 + static constexpr const size_t WIDTH = 80; + /// 规定显示列数 + /// @todo 从 grub 获取 + static constexpr const size_t HEIGHT = 25; + // TUI 缓存 + char_t* const buffer = (char_t*)TUI_MEM_BASE; + /// 记录当前位置 + static pos_t pos; + /// 记录当前命令行颜色 + static col_t color; + + /** + * @brief 在指定位置输出 + * @param _c 字符 + * @param _color 颜色 + * @param _x 行 + * @param _y 列 + */ + void put_entry_at(const char _c, const col_t _color, const size_t _x, + const size_t _y); + + /** + * @brief 转义字符处理 + * @param _c 要处理的字符 + * @return true _c 是一个转义字符 + * @return false _c 不是一个转义字符 + */ + bool escapeconv(const char _c); + + /** + * @brief 滚动显示 + */ + void scroll(void); + +protected: + +public: + TUI(void); + ~TUI(void); + + /** + * @brief 设置颜色 + * @param _color 要设置的颜色 + * @todo 支持分别字体与背景色 + */ + void set_color(const COLOR::color_t _color); + + /** + * @brief 获取颜色 + * @return COLOR::color_t 正在使用的颜色 + */ + COLOR::color_t get_color(void) const; + + /** + * @brief 设置光标位置 + * @param _pos 要设置的位置 + */ + void set_pos(const pos_t _pos); + + /** + * @brief 设置行 + * @param _row 要设置的行 + */ + void set_pos_row(const size_t _row); + + /** + * @brief 设置列 + * @param _col 要设置的列 + */ + void set_pos_col(const size_t _col); + + /** + * @brief 获取光标位置 + * @return pos_t 光标的位置 + */ + pos_t get_pos(void) const; + + /** + * @brief 写 TUI 缓存 + * @param _idx 要写的位置 + * @param _data 要写的数据 + */ + void write(const size_t _idx, const char_t _data); + + /** + * @brief 读 TUI 缓存 + * @param _idx 要读的位置 + * @return char_t 该位置处的 char_t 对象 + */ + char_t read(const size_t _idx) const; + + /** + * @brief 写字符 + * @param _c 要写的字符 + */ + void put_char(const char _c); + + /** + * @brief 读字符 + * @return uint8_t 读到的字符 + * @note tui 没有读字符的操作,这里只是保持接口一致 + */ + uint8_t get_char(void) const; + + /** + * @brief 写字符串 + * @param _s 要写的字符串 + */ + void write_string(const char* _s); + + /** + * @brief 写指定长度的字符串 + * @param _s 要写的字符串 + * @param _len 要写的长度 + */ + void write(const char* _s, const size_t _len); + + /** + * @brief 清屏,清空 TUI 缓存 + */ + void clear(void); +}; + +#endif /* SIMPLEKERNEL_TUI_H */ diff --git a/src/drv/tui/tui.cpp b/src/drv/tui/tui.cpp new file mode 100644 index 000000000..a927215ac --- /dev/null +++ b/src/drv/tui/tui.cpp @@ -0,0 +1,220 @@ + +/** + * @file tui.cpp + * @brief TUI 接口实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "tui.h" +#include "cstddef" +#include "cstdint" +#include "cstring" +#include "port.h" + +pos_t::pos_t(const uint8_t _col, const uint8_t _row) : col(_col), row(_row) { + return; +} + +pos_t::~pos_t(void) { + return; +} + +// See https://wiki.osdev.org/Text_UI +col_t::col_t(const COLOR::color_t _fore, const COLOR::color_t _back) + : fore(_fore), back(_back) { + return; +} + +col_t::~col_t(void) { + return; +} + +char_t::char_t(const uint8_t _c, const col_t _color) : c(_c), color(_color) { + return; +} + +char_t::~char_t(void) { + return; +} + +// 当前位置 +pos_t TUI::pos(0, 0); +// 当前命令行颜色 +col_t TUI::color(COLOR::WHITE, COLOR::BLACK); + +TUI::TUI(void) { + clear(); + this->write_string("TUI init.\n"); + return; +} + +TUI::~TUI(void) { + return; +} + +void TUI::put_entry_at(const char _c, const col_t _color, const size_t _x, + const size_t _y) { + // 计算索引 + const size_t index = _y * WIDTH + _x; + write(index, char_t(_c, _color)); + return; +} + +bool TUI::escapeconv(const char _c) { + switch (_c) { + // 如果是 \n + case '\n': { + // 行+1 + pos.row++; + // 列归零 + pos.col = 0; + return true; + } + // 如果是 \t + case '\t': { + // 取整对齐 + pos.col += (pos.col % 4 == 0) ? 4 : 4 - (pos.col % 4); + return true; + } + // 如果是 \b + case '\b': { + if (pos.col > 0) { + // 删除一个字符 + write(pos.row * WIDTH + --pos.col, char_t(' ', color)); + } + return true; + } + } + return false; +} + +void TUI::scroll(void) { + if (pos.row >= HEIGHT) { + // 将所有行的显示数据复制到上一行 + for (size_t i = 0; i < (HEIGHT - 1) * WIDTH; i++) { + write(i, read(i + WIDTH)); + } + // 最后的一行数据现在填充空格,不显示任何字符 + for (size_t i = (HEIGHT - 1) * WIDTH; i < HEIGHT * WIDTH; i++) { + write(i, char_t(' ', color)); + } + // 向上移动了一行,所以 cursor_y 现在是 24 + pos.row = HEIGHT - 1; + } + return; +} + +void TUI::set_color(const COLOR::color_t _color) { + this->color = col_t(_color, COLOR::BLACK); + return; +} + +COLOR::color_t TUI::get_color(void) const { + return (COLOR::color_t)(this->color.back | this->color.fore); +} + +void TUI::set_pos(const pos_t _pos) { + const uint16_t index = _pos.row * this->WIDTH + _pos.col; + this->pos = _pos; + // 光标的设置,见参考资料 + // 告诉 TUI 我们要设置光标的高字节 + PORT::outb(TUI_ADDR, TUI_CURSOR_H); + // 发送高 8 位 + PORT::outb(TUI_DATA, index >> 8); + // 告诉 TUI 我们要设置光标的低字节 + PORT::outb(TUI_ADDR, TUI_CURSOR_L); + // 发送低 8 位 + PORT::outb(TUI_DATA, index); + return; +} + +void TUI::set_pos_row(const size_t _row) { + pos.row = _row; + set_pos(pos); + return; +} + +void TUI::set_pos_col(const size_t _col) { + pos.col = _col; + set_pos(pos); + return; +} + +pos_t TUI::get_pos(void) const { + // 通过读写相应寄存器获取光标位置 + PORT::outb(TUI_ADDR, TUI_CURSOR_H); + size_t cursor_pos_h = PORT::inb(TUI_DATA); + PORT::outb(TUI_ADDR, TUI_CURSOR_L); + size_t cursor_pos_l = PORT::inb(TUI_DATA); + // 返回光标位置 + return pos_t(cursor_pos_l, cursor_pos_h); +} + +void TUI::write(const size_t _idx, const char_t _data) { + // 向缓冲区写数据 + this->buffer[_idx] = _data; + return; +} + +char_t TUI::read(const size_t _idx) const { + // 从缓冲区读数据 + return this->buffer[_idx]; +} + +void TUI::put_char(const char _c) { + // 转义字符处理 + if (escapeconv(_c) == false) { + // 在指定位置输出指定字符 + put_entry_at(_c, color, pos.col, pos.row); + // 如果到达最后一列则换行 + if (++pos.col >= WIDTH) { + pos.col = 0; + pos.row++; + } + } + // 屏幕滚动 + scroll(); + // 更新光标位置 + set_pos(pos); + return; +} + +uint8_t TUI::get_char(void) const { + return 0; +} + +void TUI::write_string(const char* _s) { + write(_s, strlen(_s)); + return; +} + +void TUI::write(const char* _s, const size_t _len) { + for (size_t i = 0; i < _len; i++) { + put_char(_s[i]); + } + return; +} + +void TUI::clear(void) { + // 从左上角开始 + for (size_t y = 0; y < HEIGHT; y++) { + for (size_t x = 0; x < WIDTH; x++) { + const size_t index = y * WIDTH + x; + // 用 ' ' 填满屏幕 + // 字体为灰色,背景为黑色 + write(index, char_t(' ', color)); + } + } + // 将光标位置设为屏幕左上角 + set_pos(pos_t(0, 0)); + return; +} diff --git a/src/drv/uart/include/uart.h b/src/drv/uart/include/uart.h new file mode 100644 index 000000000..1467950f6 --- /dev/null +++ b/src/drv/uart/include/uart.h @@ -0,0 +1,68 @@ + +/** + * @file uart.h + * @brief uart 驱动 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_UART_H +#define SIMPLEKERNEL_UART_H + +#include "color.h" +#include "cstddef" +#include "cstdint" +#include "hardware.h" + +class UART { +private: + // uart 地址 + // uart0 + static constexpr const uint32_t UART0_BASE = HARDWARE::GPIO_BASE + 0x1000; + static constexpr const uint32_t UART0_DR = UART0_BASE + 0x00; + static constexpr const uint32_t UART0_RSRECR = UART0_BASE + 0x04; + static constexpr const uint32_t UART0_FR = UART0_BASE + 0x18; + static constexpr const uint32_t UART0_ILPR = UART0_BASE + 0x20; + static constexpr const uint32_t UART0_IBRD = UART0_BASE + 0x24; + static constexpr const uint32_t UART0_FBRD = UART0_BASE + 0x28; + static constexpr const uint32_t UART0_LCRH = UART0_BASE + 0x2C; + static constexpr const uint32_t UART0_CR = UART0_BASE + 0x30; + static constexpr const uint32_t UART0_IFLS = UART0_BASE + 0x34; + static constexpr const uint32_t UART0_IMSC = UART0_BASE + 0x38; + static constexpr const uint32_t UART0_RIS = UART0_BASE + 0x3C; + static constexpr const uint32_t UART0_MIS = UART0_BASE + 0x40; + static constexpr const uint32_t UART0_ICR = UART0_BASE + 0x44; + static constexpr const uint32_t UART0_DMACR = UART0_BASE + 0x48; + static constexpr const uint32_t UART0_ITCR = UART0_BASE + 0x80; + static constexpr const uint32_t UART0_ITIP = UART0_BASE + 0x84; + static constexpr const uint32_t UART0_ITOP = UART0_BASE + 0x88; + static constexpr const uint32_t UART0_TDR = UART0_BASE + 0x8C; + void delay(int32_t count) const; + +protected: + +public: + UART(void); + ~UART(void); + void put_char(const char _c) const; + // 写字符串 + void write_string(const char* _s) const; + // 写字符串 + void write(const char* _s, size_t _len) const; + // 读字符 TODO + uint8_t get_char(void) const; + // 设置颜色 TODO + void set_color(const COLOR::color_t _color) const; + // 获取颜色 TODO + COLOR::color_t get_color(void) const; +}; + +#endif /* SIMPLEKERNEL_UART_H */ diff --git a/src/drv/uart/uart.cpp b/src/drv/uart/uart.cpp new file mode 100644 index 000000000..20c40e186 --- /dev/null +++ b/src/drv/uart/uart.cpp @@ -0,0 +1,113 @@ + +/** + * @file uart.cpp + * @brief uart 驱动实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://wiki.osdev.org/Raspberry_Pi_Bare_Bones + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "uart.h" +#include "cstddef" +#include "cstring" +#include "port.h" + +UART::UART(void) { + // Disable UART0. + PORT::outd(UART0_CR, 0x00000000); + // Setup the GPIO pin 14 && 15. + + // Disable pull up/down for all GPIO pins & delay for 150 cycles. + PORT::outd(HARDWARE::GPPUD, 0x00000000); + delay(150); + + // Disable pull up/down for pin 14,15 & delay for 150 cycles. + PORT::outd(HARDWARE::GPPUDCLK0, (1 << 14) | (1 << 15)); + delay(150); + + // Write 0 to GPPUDCLK0 to make it take effect. + PORT::outd(HARDWARE::GPPUDCLK0, 0x00000000); + + // Clear pending interrupts. + PORT::outd(UART0_ICR, 0x7FF); + + // Set integer & fractional part of baud rate. + // Divider = UART_CLOCK/(16 * Baud) + // Fraction part register = (Fractional part * 64) + 0.5 + // Baud = 115200. + // Divider = 3000000 / (16 * 115200) = 1.627 = ~1. + PORT::outd(UART0_IBRD, 1); + // Fractional part register = (.627 * 64) + 0.5 = 40.6 = ~40. + PORT::outd(UART0_FBRD, 40); + + // Enable FIFO & 8 bit data transmission (1 stop bit, no parity). + PORT::outd(UART0_LCRH, (1 << 4) | (1 << 5) | (1 << 6)); + + // Mask all interrupts. + PORT::outd(UART0_IMSC, (1 << 1) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) + | (1 << 8) | (1 << 9) | (1 << 10)); + + // Enable UART0, receive & transfer part of UART. + PORT::outd(UART0_CR, (1 << 0) | (1 << 8) | (1 << 9)); + write_string("uart init\n"); + return; +} + +UART::~UART(void) { + return; +} + +// Loop times in a way that the compiler won't optimize away +void UART::delay(int32_t count) const { + asm("__delay_%=: subs %[count], %[count], #1" + : "=r"(count) + : [count] "0"(count) + : "cc"); +} + +void UART::put_char(const char _c) const { + // Wait for UART to become ready to transmit. + while (PORT::ind(UART0_FR) & (1 << 5)) { + ; + } + PORT::outd(UART0_DR, _c); + return; +} + +void UART::write_string(const char* _s) const { + write(_s, strlen(_s)); + return; +} + +void UART::write(const char* _s, size_t _len) const { + for (size_t i = 0; i < _len; i++) { + put_char(_s[i]); + } + return; +} + +uint8_t UART::get_char(void) const { + // Wait for UART to have received something. + while (PORT::ind(UART0_FR) & (1 << 4)) { + ; + } + return PORT::ind(UART0_DR); +} + +// TODO +void UART::set_color(const COLOR::color_t _color __attribute((unused))) const { + return; +} + +// TODO +COLOR::color_t UART::get_color(void) const { + return COLOR::BLACK; +} diff --git a/src/drv/virtio/include/virtio_mmio_drv.h b/src/drv/virtio/include/virtio_mmio_drv.h new file mode 100644 index 000000000..31176a45f --- /dev/null +++ b/src/drv/virtio/include/virtio_mmio_drv.h @@ -0,0 +1,607 @@ + +/** + * @file virtio_mmio_drv.h + * @brief virtio mmio 驱动头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_VIRTIO_MMIO_DRV_H +#define SIMPLEKERNEL_VIRTIO_MMIO_DRV_H + +#include "cstdint" +#include "driver_base.h" +#include "io.h" +#include "resource.h" +#include "string" +#include "vector" +#include "virtqueue.h" + +/** + * @brief virtio,mmio 驱动 + * @todo 暂时只初始化 BLOCK_DEVICE 设备 + */ +class virtio_mmio_drv_t : public driver_base_t { +public: + /** + * @brief 块设备请求结构 + * @see virtio-v1.1#5.2.6 + */ + struct virtio_blk_req_t { + /// 请求类型 + /// 读取 + static constexpr const uint32_t IN = 0; + /// 写入 + static constexpr const uint32_t OUT = 1; + /// 刷新 + static constexpr const uint32_t FLUSH = 4; + static constexpr const uint32_t DISCARD = 11; + static constexpr const uint32_t WRITE_ZEROES = 13; + uint32_t type; + uint32_t reserved; + uint64_t sector; + uint8_t* data; + /// 设备返回状态 成功 + static constexpr const uint32_t OK = 0; + /// 设备返回状态 设备或驱动出错 + static constexpr const uint32_t IOERR = 1; + /// 设备返回状态 不支持的请求 + static constexpr const uint32_t UNSUPP = 2; + uint8_t status; + /// type + reserved + sector 的大小 + static constexpr const size_t HEADER_SIZE = 16; + /// 扇区大小 + static constexpr const size_t SECTOR_SIZE = 512; + /// status 大小 + static constexpr const size_t FOOTER_SIZE = 1; + + friend std::ostream& + operator<<(std::ostream& _os, const virtio_blk_req_t& _virtio_blk_req) { + printf("type: %s, sector: 0x%X", + _virtio_blk_req.type == IN ? "IN" : "OUT", + _virtio_blk_req.sector); +// #define DEBUG +#ifdef DEBUG + printf(", data["); + for (size_t i = 0; i < SECTOR_SIZE; i++) { + printf("0x%X ", _virtio_blk_req.data[i]); + } + printf("]"); +# undef DEBUG +#endif + printf(", "); + if (_virtio_blk_req.status == OK) { + printf("status: OK"); + } + else if (_virtio_blk_req.status == IOERR) { + printf("status: IOERR"); + } + else if (_virtio_blk_req.status == UNSUPP) { + printf("status: UNSUPP"); + } + else { + printf("status: UNKNOWN [0x%X]", _virtio_blk_req.status); + } + + return _os; + } + } __attribute__((packed)); + +private: + /** + * @brief 魔数 + * @see virtio-v1.1#4.2.2 + */ + static constexpr const uint32_t MAGIC_VALUE = 0x74726976; + + /** + * @brief 版本 + * @see virtio-v1.1#4.2.2 + */ + static constexpr const uint32_t VERSION = 0x02; + + /** + * @brief virtio 设备类型 + * @see virtio-v1.1#5 + */ + enum device_type_t : uint32_t { + RESERVED = 0x00, + NETWORK_CARD, + BLOCK_DEVICE, + CONSOLE, + ENTROPY_SOURCE, + MEMORY_BALLOONING, + IOMEMORY, + RPMSG, + SCSI_HOST, + NINEP_TRANSPORT, + MAC_80211_WLAN, + RPROC_SERIAL, + VIRTIO_CAIF, + MEMORY_BALLOON, + GPU_DEVICE = 0x10, + TIMER_CLOCK_DEVICE, + INPUT_DEVICE, + SOCKET_DEVICE, + CRYPTO_DEVICE, + SIGNAL_DISTRIBUTION_MODULE, + PSTORE_DEVICE, + IOMMU_DEVICE, + MEMORY_DEVICE, + }; + + /// 设备类型 + device_type_t device_type; + + /** + * @brief virtio 设备类型名名称 + * @see virtio-v1.1#5 + */ + static constexpr const char* const virtio_device_name[25] = { + "reserved (invalid)", + "network card", + "block device", + "console", + "entropy source", + "memory ballooning(traditional)", + "ioMemory", + "rpmsg", + "SCSI host", + "9P transport", + "mac80211 wlan", + "rproc serial", + "virtio CAIF", + "memory balloon", + "null", + "null", + "GPU device", + "Timer / Clock device", + "Input device", + "Socket device", + "Crypto device", + "Signal Distribution Module", + "pstore device", + "IOMMU device", + "Memory device", + }; + + /** + * @brief 设备状态标志 Device Status Field + * @see virtio-v1.1#2.1 + */ + /// OS 已识别设备 + static constexpr const uint32_t DEVICE_STATUS_ACKNOWLEDGE = 0x1; + /// OS 已匹配驱动 + static constexpr const uint32_t DEVICE_STATUS_DRIVER = 0x2; + /// 驱动准备就绪 + static constexpr const uint32_t DEVICE_STATUS_DRIVER_OK = 0x4; + /// 设备特性设置就绪 + static constexpr const uint32_t DEVICE_STATUS_FEATURES_OK = 0x8; + /// 设备设置错误 + static constexpr const uint32_t DEVICE_STATUS_DEVICE_NEEDS_RESET = 0x40; + /// 设备出错 + static constexpr const uint32_t DEVICE_STATUS_FAILED = 0x80; + + /** + * @brief virtio mmio 控制寄存器 + * @see virtio-v1.1#4.2.2 + */ + struct virtio_regs_t { + static constexpr const size_t MAGIC_OFFSET = 0; + static constexpr const size_t VERSION_OFFSET = 4; + static constexpr const size_t DEVICE_ID_OFFSET = 8; + static constexpr const size_t VENDOR_ID_OFFSET = 12; + static constexpr const size_t DEVICE_FEATURES_OFFSET = 16; + static constexpr const size_t DEVICE_FEATURES_SEL_OFFSET = 20; + static constexpr const size_t _RESERVED0_OFFSET = 24; + static constexpr const size_t DRIVER_FEATURES_OFFSET = 32; + static constexpr const size_t DRIVER_FEATURES_SEL_OFFSET = 36; + static constexpr const size_t _RESERVED1_OFFSET = 40; + static constexpr const size_t QUEUE_SEL_OFFSET = 48; + static constexpr const size_t QUEUE_NUM_MAX_OFFSET = 52; + static constexpr const size_t QUEUE_NUM_OFFSET = 56; + static constexpr const size_t _RESERVED2_OFFSET = 60; + static constexpr const size_t QUEUE_READY_OFFSET = 68; + static constexpr const size_t _RESERVED3_OFFSET = 72; + static constexpr const size_t QUEUE_NOTIFY_OFFSET = 80; + static constexpr const size_t _RESERVED4_OFFSET = 84; + static constexpr const size_t INTERRUPT_STATUS_OFFSET = 96; + static constexpr const size_t INTERRUPT_ACK_OFFSET = 100; + static constexpr const size_t _RESERVED5_OFFSET = 104; + static constexpr const size_t STATUS_OFFSET = 112; + static constexpr const size_t _RESERVED6_OFFSET = 116; + static constexpr const size_t QUEUE_DESC_LOW_OFFSET = 128; + static constexpr const size_t QUEUE_DESC_HIGH_OFFSET = 132; + static constexpr const size_t _RESERVED7_OFFSET = 136; + static constexpr const size_t QUEUE_DRIVER_LOW_OFFSET = 144; + static constexpr const size_t QUEUE_DRIVER_HIGH_OFFSET = 148; + static constexpr const size_t _RESERVED8_OFFSET = 152; + static constexpr const size_t QUEUE_DEVICE_LOW_OFFSET = 160; + static constexpr const size_t QUEUE_DEVICE_HIGH_OFFSET = 164; + static constexpr const size_t _RESERVED9_OFFSET = 168; + static constexpr const size_t CONFIG_GENERATION_OFFSET = 252; + static constexpr const size_t CONFIG_OFFSET = 256; + + /// a Little Endian equivalent of the “virt” string: 0x74726976 + uint32_t* magic; + /// Device version number + // 0x2, Legacy devices(see 4.2.4 Legacy interface) used 0x1. + uint32_t* version; + /// Virtio Subsystem Device ID + uint32_t* device_id; + /// Virtio Subsystem Vendor ID + uint32_t* Vendor_id; + /// Flags representing features the device supports + uint32_t* device_features; + /// Device (host) features word selection. + uint32_t* device_features_sel; + uint32_t* _reserved0; + /// Flags representing device features understood and activated by + /// the driver + uint32_t* driver_features; + /// Activated (guest) features word selection + uint32_t* driver_features_sel; + uint32_t* _reserved1; + /// Virtual queue index + uint32_t* queue_sel; + /// Maximum virtual queue size + uint32_t* queue_num_max; + /// Virtual queue size + uint32_t* queue_num; + uint32_t* _reserved2; + /// Virtual queue ready bit + uint32_t* queue_ready; + uint32_t* _reserved3; + /// Queue notifier + uint32_t* queue_notify; + uint32_t* _reserved4; + /// Interrupt status + uint32_t* interrupt_status; + /// Interrupt acknowledge + uint32_t* interrupt_ack; + uint32_t* _reserved5; + /// Device status + uint32_t* status; + uint32_t* _reserved6; + /// Virtual queue’s Descriptor Area 64 bit long physical address + uint32_t* queue_desc_low; + uint32_t* queue_desc_high; + uint32_t* _reserved7; + /// Virtual queue’s Driver Area 64 bit long physical address + uint32_t* queue_driver_low; + uint32_t* queue_driver_high; + uint32_t* _reserved8; + /// Virtual queue’s Device Area 64 bit long physical address + uint32_t* queue_device_low; + uint32_t* queue_device_high; + uint32_t* _reserved9; + /// Configuration atomicity value + uint32_t* config_generation; + /// Configuration space + uint32_t* config; + + virtio_regs_t(void) = default; + + virtio_regs_t(uintptr_t _base_addr) { + magic = (uint32_t*)(_base_addr + MAGIC_OFFSET); + version = (uint32_t*)(_base_addr + VERSION_OFFSET); + device_id = (uint32_t*)(_base_addr + DEVICE_ID_OFFSET); + Vendor_id = (uint32_t*)(_base_addr + VENDOR_ID_OFFSET); + device_features = (uint32_t*)(_base_addr + DEVICE_FEATURES_OFFSET); + device_features_sel + = (uint32_t*)(_base_addr + DEVICE_FEATURES_SEL_OFFSET); + _reserved0 = (uint32_t*)(_base_addr + _RESERVED0_OFFSET); + driver_features = (uint32_t*)(_base_addr + DRIVER_FEATURES_OFFSET); + driver_features_sel + = (uint32_t*)(_base_addr + DRIVER_FEATURES_SEL_OFFSET); + _reserved1 = (uint32_t*)(_base_addr + _RESERVED1_OFFSET); + queue_sel = (uint32_t*)(_base_addr + QUEUE_SEL_OFFSET); + queue_num_max = (uint32_t*)(_base_addr + QUEUE_NUM_MAX_OFFSET); + queue_num = (uint32_t*)(_base_addr + QUEUE_NUM_OFFSET); + _reserved2 = (uint32_t*)(_base_addr + _RESERVED2_OFFSET); + queue_ready = (uint32_t*)(_base_addr + QUEUE_READY_OFFSET); + _reserved3 = (uint32_t*)(_base_addr + _RESERVED3_OFFSET); + queue_notify = (uint32_t*)(_base_addr + QUEUE_NOTIFY_OFFSET); + _reserved4 = (uint32_t*)(_base_addr + _RESERVED4_OFFSET); + interrupt_status + = (uint32_t*)(_base_addr + INTERRUPT_STATUS_OFFSET); + interrupt_ack = (uint32_t*)(_base_addr + INTERRUPT_ACK_OFFSET); + _reserved5 = (uint32_t*)(_base_addr + _RESERVED5_OFFSET); + status = (uint32_t*)(_base_addr + STATUS_OFFSET); + _reserved6 = (uint32_t*)(_base_addr + _RESERVED6_OFFSET); + queue_desc_low = (uint32_t*)(_base_addr + QUEUE_DESC_LOW_OFFSET); + queue_desc_high = (uint32_t*)(_base_addr + QUEUE_DESC_HIGH_OFFSET); + _reserved7 = (uint32_t*)(_base_addr + _RESERVED7_OFFSET); + queue_driver_low + = (uint32_t*)(_base_addr + QUEUE_DRIVER_LOW_OFFSET); + queue_driver_high + = (uint32_t*)(_base_addr + QUEUE_DRIVER_HIGH_OFFSET); + _reserved8 = (uint32_t*)(_base_addr + _RESERVED8_OFFSET); + queue_device_low + = (uint32_t*)(_base_addr + QUEUE_DEVICE_LOW_OFFSET); + queue_device_high + = (uint32_t*)(_base_addr + QUEUE_DEVICE_HIGH_OFFSET); + _reserved9 = (uint32_t*)(_base_addr + _RESERVED9_OFFSET); + config_generation + = (uint32_t*)(_base_addr + CONFIG_GENERATION_OFFSET); + config = (uint32_t*)(_base_addr + CONFIG_OFFSET); + } + + ~virtio_regs_t(void) = default; + } __attribute__((packed)); + + /** + * @brief Reserved Feature Bits + * @see virtio-v1.1#6 + */ + static constexpr const uint32_t VIRTIO_F_RING_INDIRECT_DESC = 0x1C; + static constexpr const uint32_t VIRTIO_F_RING_EVENT_IDX = 0x1D; + static constexpr const uint32_t VIRTIO_F_VERSION_1 = 0x20; + static constexpr const uint32_t VIRTIO_F_ACCESS_PLATFORM = 0x21; + static constexpr const uint32_t VIRTIO_F_RING_PACKED = 0x22; + static constexpr const uint32_t VIRTIO_F_IN_ORDER = 0x23; + static constexpr const uint32_t VIRTIO_F_ORDER_PLATFORM = 0x24; + static constexpr const uint32_t VIRTIO_F_SR_IOV = 0x25; + static constexpr const uint32_t VIRTIO_F_NOTIFICATION_DATA = 0x26; + + /** + * @brief feature 信息 + */ + struct feature_t { + /// feature 名称 + mystl::string name; + /// 第几位 + uint32_t bit; + /// 状态 + bool status; + }; + + /** + * @brief 公共基础特性 + * @note QEMU emulator version 7.0.0 (Debian 1:7.0+dfsg-7ubuntu2.3) 不支持 + * VIRTIO_F_RING_PACKED 属性,改为 false + */ + const feature_t base_features[4] = { + {"VIRTIO_F_RING_INDIRECT_DESC", VIRTIO_F_RING_INDIRECT_DESC, false}, + { "VIRTIO_F_RING_EVENT_IDX", VIRTIO_F_RING_EVENT_IDX, false}, + { "VIRTIO_F_VERSION_1", VIRTIO_F_VERSION_1, false}, + { "VIRTIO_F_RING_PACKED", VIRTIO_F_RING_PACKED, false}, + }; + + /// 设备属性 + mystl::vector features; + + /** + * @brief 块设备 feature bits + * @see virtio-v1.1#5.2.3 + */ + /// Device supports request barriers. + static constexpr const uint32_t BLK_F_BARRIER = 0; + /// Maximum size of any single segment is in size_max. + static constexpr const uint32_t BLK_F_SIZE_MAX = 1; + /// Maximum number of segments in a request is in seg_max. + static constexpr const uint32_t BLK_F_SEG_MAX = 2; + /// Disk-style geometry specified in geometry. + static constexpr const uint32_t BLK_F_GEOMETRY = 4; + /// Device is read-only. + static constexpr const uint32_t BLK_F_RO = 5; + /// Block size of disk is in blk_size. + static constexpr const uint32_t BLK_F_BLK_SIZE = 6; + /// Cache flush command support. + static constexpr const uint32_t BLK_F_FLUSH = 9; + /// Device exports information on optimal I/O alignment. + static constexpr const uint32_t BLK_F_TOPOLOGY = 10; + /// Device can toggle its cache between writeback and writethrough modes. + static constexpr const uint32_t BLK_F_CONFIG_WCE = 11; + /// Device can support discard command, maximum discard sectors size in + /// max_discard_sectors and maximum discard segment number in + /// max_discard_seg. + static constexpr const uint32_t BLK_F_DISCARD = 13; + /// Device can support write zeroes command,maximum write zeroes sectors + /// size in max_write_zeroes_sectors and maximum write zeroes segment number + /// in max_write_- zeroes_seg. + static constexpr const uint32_t BLK_F_WRITE_ZEROES = 14; + + feature_t blk_features[8] = { + { "BLK_F_SIZE_MAX", BLK_F_SIZE_MAX, false}, + { "BLK_F_SEG_MAX", BLK_F_SEG_MAX, false}, + { "BLK_F_GEOMETRY", BLK_F_GEOMETRY, false}, + { "BLK_F_RO", BLK_F_RO, false}, + { "BLK_F_BLK_SIZE", BLK_F_BLK_SIZE, false}, + { "BLK_F_FLUSH", BLK_F_FLUSH, false}, + { "BLK_F_TOPOLOGY", BLK_F_TOPOLOGY, false}, + {"BLK_F_CONFIG_WCE", BLK_F_CONFIG_WCE, false}, + }; + + /** + * @brief 块设备配置结构 + * @see virtio-v1.1#5.2.4 + */ + struct virtio_blk_config_t { + uint64_t capacity; + uint32_t size_max; + uint32_t seg_max; + + struct { + uint16_t cylinders; + uint8_t heads; + uint8_t sectors; + } geometry; + + uint32_t blk_size; + + struct { + // # of logical blocks per physical block (log2) + uint8_t physical_block_exp; + // offset of first aligned logical block + uint8_t alignment_offset; + // suggested minimum I/O size in blocks + uint16_t min_io_size; + // optimal (suggested maximum) I/O size in blocks + uint32_t opt_io_size; + } topology; + + uint8_t writeback; + uint8_t unused0[3]; + uint32_t max_discard_sectors; + uint32_t max_discard_seg; + uint32_t discard_sector_alignment; + uint32_t max_write_zeroes_sectors; + uint32_t max_write_zeroes_seg; + uint8_t write_zeroes_may_unmap; + uint8_t unused1[3]; + + friend std::ostream& + operator<<(std::ostream& _os, virtio_blk_config_t* _virtio_blk_config) { + printf("capacity: 0x%X\n", + IO::get_instance().read64(&_virtio_blk_config->capacity)); + printf("size_max: 0x%X\n", + IO::get_instance().read32(&_virtio_blk_config->size_max)); + printf("seg_max: 0x%X\n", + IO::get_instance().read32(&_virtio_blk_config->seg_max)); + printf("cylinders: 0x%X\n", + IO::get_instance().read16( + &_virtio_blk_config->geometry.cylinders)); + printf("heads: 0x%X\n", IO::get_instance().read8( + &_virtio_blk_config->geometry.heads)); + printf("sectors: 0x%X\n", IO::get_instance().read8( + &_virtio_blk_config->geometry.sectors)); + printf("blk_size: 0x%X\n", + IO::get_instance().read32(&_virtio_blk_config->blk_size)); + printf("physical_block_exp: 0x%X\n", + IO::get_instance().read8( + &_virtio_blk_config->topology.physical_block_exp)); + printf("alignment_offset: 0x%X\n", + IO::get_instance().read8( + &_virtio_blk_config->topology.alignment_offset)); + printf("min_io_size: 0x%X\n", + IO::get_instance().read16( + &_virtio_blk_config->topology.min_io_size)); + printf("opt_io_size: 0x%X\n", + IO::get_instance().read8( + &_virtio_blk_config->topology.opt_io_size)); + printf("writeback: 0x%X\n", + IO::get_instance().read8(&_virtio_blk_config->writeback)); + printf("max_discard_sectors: 0x%X\n", + IO::get_instance().read32( + &_virtio_blk_config->max_discard_sectors)); + printf( + "max_discard_seg: 0x%X\n", + IO::get_instance().read32(&_virtio_blk_config->max_discard_seg)); + printf("discard_sector_alignment: 0x%X\n", + IO::get_instance().read32( + &_virtio_blk_config->discard_sector_alignment)); + printf("max_write_zeroes_sectors: 0x%X\n", + IO::get_instance().read32( + &_virtio_blk_config->max_write_zeroes_sectors)); + printf("max_write_zeroes_seg: 0x%X\n", + IO::get_instance().read32( + &_virtio_blk_config->max_write_zeroes_seg)); + printf("write_zeroes_may_unmap: 0x%X", + IO::get_instance().read8( + &_virtio_blk_config->write_zeroes_may_unmap)); + return _os; + } + } __attribute__((packed)); + + /// 块设备配置信息指针 + virtio_blk_config_t* blk_config; + + /** + * @brief blk mmio 读写 + * @param _req 请求结构. + * @return size_t 返回 0 + */ + size_t blk_rw(virtio_blk_req_t& _req); + + /** + * @brief 设置设备 features + * @param _features 要设置的 feature 向量 + */ + void set_features(const mystl::vector& _features); + + /** + * @brief 将队列设置传递到相应寄存器 + * @param _queue_sel 第几个队列,从 0 开始 + */ + void add_to_device(uint32_t _queue_sel); + +protected: + +public: + static constexpr const char* NAME = "virtio,mmio"; + + /// virtio mmio 寄存器基地址 + virtio_regs_t regs; + /// virtio queue + /// @todo 有些设备使用多个队列 + split_virtqueue_t queue; + + /** + * @brief 构造函数 + * @param _resource 设备使用的资源 + */ + virtio_mmio_drv_t(const resource_t& _resource); + + /** + * @brief 构造函数 + * @param _resource 设备使用的资源 + * @param _drv 总线名称 + */ + virtio_mmio_drv_t(const resource_t& _resource, driver_base_t* _drv); + + /** + * @brief 使用默认析构函数 + */ + ~virtio_mmio_drv_t(void) = default; + + /** + * @brief mmio 中断处理 + * @param _buf 缓冲区 + * @param _buf 缓冲区 + */ + void set_intr_ack(void); + + /** + * @brief 获取队列长度 + * @return size_t 队列长度 + */ + size_t get_queue_len(void); + + /** + * @brief 从设备读 + * @param _buf 缓冲区 + */ + int read(buf_t& _buf) override final; + + /** + * @brief 向设备写 + * @param _buf 缓冲区 + */ + int write(buf_t& _buf) override final; + + /** + * @brief ioctl 控制 + * @param _resource 设备使用的资源 + * @param _buf 缓冲区,512 字节 + */ + int ioctl(uint8_t _cmd, void* _buf) override final; + + /** + * @brief 获取设备状态 + * @param _cmd 指令 + */ + int status(uint8_t _cmd) override final; +}; + +declare_call_back(virtio_mmio_drv_t); + +#endif /* SIMPLEKERNEL_VIRTIO_MMIO_DRV_H */ diff --git a/src/drv/virtio/include/virtqueue.h b/src/drv/virtio/include/virtqueue.h new file mode 100644 index 000000000..37db3c17f --- /dev/null +++ b/src/drv/virtio/include/virtqueue.h @@ -0,0 +1,302 @@ + +/** + * @file virtqueue.h + * @brief virtqueue 头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-21 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_VIRTQUEUE_H +#define SIMPLEKERNEL_VIRTQUEUE_H + +#include "cstddef" +#include "cstdint" + +/** + * @brief To mark a descriptor as available, the driver sets the + * VIRTQ_DESC_F_AVAIL bit in Flags to match the internal Driver Ring Wrap + * Counter. It also sets the VIRTQ_DESC_F_USED bit to match the inverse value + * (i.e. to not match the internal Driver Ring Wrap Counter) + * @see virtio-v1.1#2.7.1 + */ +static constexpr const uint32_t VIRTQ_DESC_F_AVAIL = (1 << 7); + +/** + * @brief To mark a descriptor as used, the device sets the VIRTQ_DESC_F_USED + * bit in Flags to match the internal Device Ring Wrap Counter. It also sets the + * VIRTQ_DESC_F_AVAIL bit to match the same value. + * @see virtio-v1.1#2.7.1 + */ +static constexpr const uint32_t VIRTQ_DESC_F_USED = (1 << 15); + +/** + * @brief This marks a descriptor as device write-only (otherwise device + * read-only). + * @see virtio-v1.1#2.7.3 + */ +static constexpr const uint32_t VIRTQ_DESC_F_WRITE = 2; + +/** + * @brief This marks a buffer as continuing. + * @see virtio-v1.1#2.7.6 + */ +static constexpr const uint32_t VIRTQ_DESC_F_NEXT = 1; + +/** + * @brief This means the element contains a table of descriptors. + * @see virtio-v1.1#2.7.7 + */ +static constexpr const uint32_t VIRTQ_DESC_F_INDIRECT = 4; + +/** + * @brief Enable events + * @see virtio-v1.1#2.7.10 + */ +static constexpr const uint32_t RING_EVENT_FLAGS_ENABLE = 0x0; + +/** + * @brief Disable events + * @see virtio-v1.1#2.7.10 + */ +static constexpr const uint32_t RING_EVENT_FLAGS_DISABLE = 0x1; + +/** + * @brief Enable events for a specific descriptor + * (as specified by Descriptor Ring Change Event Offset/Wrap Counter). + * Only valid if VIRTIO_F_RING_EVENT_IDX has been negotiated. + * @see virtio-v1.1#2.7.10 + */ +static constexpr const uint32_t RING_EVENT_FLAGS_DESC = 0x2; + +/** + * @brief This feature indicates that the device accepts arbitrary descriptor + * layouts + * @see virtio-v1.1#6.3 + */ +static constexpr const uint32_t VIRTIO_F_ANY_LAYOUT = 27; + +/** + * @brief Support for indirect descriptors + * @see virtio-v1.1#Appendix A. virtio_queue.h + */ +static constexpr const uint32_t VIRTIO_F_INDIRECT_DESC = 28; + +/** + * @brief Support for avail_event and used_event fields + * @see virtio-v1.1#Appendix A. virtio_queue.h + */ +static constexpr const uint32_t VIRTIO_F_EVENT_IDX = 29; + +/** + * @brief The driver uses this in avail->flags to advise the device: don't + * interrupt me when you consume a buffer. It's unreliable, so it's + * simply an optimization. + * @see virtio-v1.1#Appendix A. virtio_queue.h + */ +static constexpr const uint32_t VIRTQ_AVAIL_F_NO_INTERRUPT = 1; + +/** + * @brief The device uses this in used->flags to advise the driver: don't kick + * me when you add a buffer. It's unreliable, so it's simply an optimization. + * @see virtio-v1.1#Appendix A. virtio_queue.h + */ +static constexpr const uint32_t VIRTQ_USED_F_NO_NOTIFY = 1; + +/** + * @brief virtio 队列,使用 Split Virtqueues + * @see virtio-v1.1#2.6 + */ +struct split_virtqueue_t { + // 默认队列大小 + static constexpr const size_t DEFAULT_SIZE = 16; + + // virtio-v1.1#2.6.5 + struct virtq_desc_t { + /// 对齐大小 + static constexpr const size_t ALIGN = 16; + /// Address(guest - physical). + uint64_t addr; + /// Length. + // 当描述符作为节点连接一个描述符表时,描述符项的个数为 + // len/sizeof(virtq_desc_t) + uint32_t len; + /// The flags as indicated above. + uint16_t flags; + /// Next field if flags & NEXT + uint16_t next; + } __attribute__((packed)); + + /** + * @brief 可用队列 + * @see virtio-v1.1#2.6.6 + */ + struct virtq_avail_t { + /// 对齐大小 + static constexpr const size_t ALIGN = 2; + uint16_t flags; + uint16_t idx; + // queue size + uint16_t ring[DEFAULT_SIZE]; + // Only if VIRTIO_F_EVENT_IDX + uint16_t used_event; + } __attribute__((packed)); + + /** + * @brief 已用队列数据 + * @see virtio-v1.1#2.6.8 + */ + struct virtq_used_elem_t { + /// Index of start of used descriptor chain. + uint32_t id; + /// Total length of the descriptor chain which was used (written to) + uint32_t len; + } __attribute__((packed)); + + /** + * @brief 已用队列 + * @see virtio-v1.1#2.6.8 + */ + struct virtq_used_t { + /// 对齐大小 + static constexpr const size_t ALIGN = 4; + uint16_t flags; + uint16_t idx; + // queue size + virtq_used_elem_t ring[DEFAULT_SIZE]; + // Only if VIRTIO_F_EVENT_IDX + // uint16_t avail_event; + } __attribute__((packed)); + + /** + * @brief 完整的队列结构 + */ + struct virtq_t { + // 此结构的物理地址 + uint64_t phys; + // 数组长度 + uint32_t len; + uint32_t seen_used; + uint32_t free_desc; + + volatile virtq_desc_t* desc; + volatile virtq_avail_t* avail; + volatile uint16_t* used_event; + volatile virtq_used_t* used; + volatile uint16_t* avail_event; + + // 此结构的虚拟地址 + void** desc_virt; + } __attribute__((packed)); + + // virtq_t 各个结构体的偏移 + uint64_t off_desc; + uint64_t off_driver; + uint64_t off_device; + uint64_t off_driver_event; + uint64_t off_device_event; + uint64_t off_desc_virt; + + /// 队列指针 + virtq_t* virtq; + + /** + * @brief 构造函数 + * @param _size 需要的队列数量,必须是 2 的幂,默认为 + * DEFAULT_SIZE + * @see virtio-v1.1#2.5, virtio-v1.1#2.6 + */ + split_virtqueue_t(size_t _size = DEFAULT_SIZE); + + /** + * @brief 析构函数 + */ + ~split_virtqueue_t(void); + + /** + * @brief 分配 desc + * @param _addr 队列地址 + * @return uint32_t 可用的 desc 地址 + */ + uint32_t alloc_desc(void* _addr); + + /** + * @brief 回收 desc + * @param _desc 要回收的 desc + */ + void free_desc(uint32_t _desc); +}; + +/** + * @brief virtio 队列,使用 Packed Virtqueues + * @see virtio-v1.1#2.7 + * @todo + */ +struct packed_virtqueue_t { + /** + * @brief The available descriptor refers to the buffers the driver is + * sending to the device. addr is a physical address, and the descriptor is + * identified with a buffer using the id field. + * @note The descriptor ring is zero-initialized. + * @see virtio-v1.1#2.7.13 + */ + struct pvirtq_desc_t { + /// 对齐大小 + static constexpr const size_t ALIGN = 16; + /// Buffer Address. + uint64_t addr; + /// Buffer Length. + uint32_t len; + /// Buffer ID. + uint16_t id; + /// The flags depending on descriptor type. + uint16_t flags; + }; + + /** + * @brief The following structure is used to reduce the number of + * notifications sent between driver and device + * @see virtio-v1.1#2.7.14 + */ + struct pvirtq_event_suppress_t { + /// 对齐大小 + static constexpr const size_t ALIGN = 4; + + struct { + /// Descriptor Ring Change Event Offset + uint16_t desc_event_off : 15; + /// Descriptor Ring Change Event Wrap Counter + uint16_t desc_event_wrap : 1; + } desc; + + /// If desc_event_flags set to RING_EVENT_FLAGS_DESC + struct { + /// Descriptor Ring Change Event Flags + uint16_t desc_event_flags : 2; + /// Reserved, set to 0 + uint16_t reserved : 14; + } flags; + }; + + /** + * @brief 构造函数 + * @param _size 需要的队列数量,必须是 2 的幂,默认为 + * DEFAULT_SIZE + * @see virtio-v1.1#2.5, virtio-v1.1#2.6 + */ + packed_virtqueue_t(size_t _size); + + /** + * @brief 析构函数 + */ + ~packed_virtqueue_t(void); +}; + +#endif /* SIMPLEKERNEL_VIRTQUEUE_H */ diff --git a/src/drv/virtio/packed_virtqueue.cpp b/src/drv/virtio/packed_virtqueue.cpp new file mode 100644 index 000000000..452692eb9 --- /dev/null +++ b/src/drv/virtio/packed_virtqueue.cpp @@ -0,0 +1,26 @@ + +/** + * @file packed_virtqueue.cpp + * @brief packed virtqueue 实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-21 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#include "virtqueue.h" + +packed_virtqueue_t::packed_virtqueue_t(size_t _size) { + (void)_size; + return; +} + +packed_virtqueue_t::~packed_virtqueue_t(void) { + return; +} diff --git a/src/drv/virtio/split_virtqueue.cpp b/src/drv/virtio/split_virtqueue.cpp new file mode 100644 index 000000000..d0c863562 --- /dev/null +++ b/src/drv/virtio/split_virtqueue.cpp @@ -0,0 +1,109 @@ + +/** + * @file split_virtqueue.cpp + * @brief split virtqueue 实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-21 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#include "cassert" +#include "common.h" +#include "cstdio" +#include "cstdlib" +#include "virtqueue.h" +#include "vmm.h" + +split_virtqueue_t::split_virtqueue_t(size_t _size) { + // _size 应该为 2 的幂 + assert((_size & (_size - 1)) == 0); + // 计算偏移 + // desc 偏移为 64 + off_desc = COMMON::ALIGN(sizeof(virtq_t), virtq_desc_t::ALIGN); + // avail 偏移为在 desc 基地址+desc 个数*desc 长度,最后进行对齐 + off_driver = COMMON::ALIGN(off_desc + _size * sizeof(virtq_desc_t), + virtq_avail_t::ALIGN); + off_device_event + = (off_driver + sizeof(virtq_avail_t) + _size * sizeof(uint16_t)); + + off_device + = COMMON::ALIGN(off_device_event + sizeof(uint16_t), virtq_used_t::ALIGN); + + off_driver_event + = (off_device + sizeof(virtq_used_t) + _size * sizeof(virtq_used_elem_t)); + + off_desc_virt + = COMMON::ALIGN(off_driver_event + sizeof(uint16_t), sizeof(void*)); + + // 如果需要的内存大于1页则出错 + if (off_desc_virt + _size * sizeof(void*) > COMMON::PAGE_SIZE) { + printf("virtq_create: error, too big for two pages\n"); + return; + } + + virtq = (virtq_t*)kmalloc(COMMON::PAGE_SIZE); + + uint8_t* page_virt = (uint8_t*)virtq; + + virtq->phys = VMM_VA2PA((uintptr_t)virtq); + virtq->len = _size; + + virtq->desc = (virtq_desc_t*)(page_virt + off_desc); + virtq->avail = (virtq_avail_t*)(page_virt + off_driver); + virtq->used_event = (uint16_t*)(page_virt + off_device_event); + virtq->used = (virtq_used_t*)(page_virt + off_device); + virtq->avail_event = (uint16_t*)(page_virt + off_driver_event); + virtq->desc_virt = (void**)(page_virt + off_desc_virt); + + virtq->avail->idx = 0; + virtq->used->idx = 0; + virtq->seen_used = virtq->used->idx; + virtq->free_desc = 0; + + for (size_t i = 0; i < _size; i++) { + virtq->desc[i].next = i + 1; + } + + return; +} + +split_virtqueue_t::~split_virtqueue_t(void) { + if (virtq != nullptr) { + free(virtq); + } + return; +} + +uint32_t split_virtqueue_t::alloc_desc(void* _addr) { + // 获取空闲 desc 索引 + uint32_t desc = virtq->free_desc; + // 获取下一个 desc 索引 + uint32_t next = virtq->desc[desc].next; + if (desc == virtq->len) { + printf("ERROR: ran out of virtqueue descriptors\n"); + } + // 更新 free desc 索引 + virtq->free_desc = next; + // 设置当前 desc addr 项 + virtq->desc[desc].addr = VMM_VA2PA((uintptr_t)_addr); + // 设置当前 desc virt_addr 项 + virtq->desc_virt[desc] = _addr; + return desc; +} + +void split_virtqueue_t::free_desc(uint32_t _desc) { + // 要释放 desc 的下一项指向另一个 free 的 desc + virtq->desc[_desc].next = virtq->free_desc; + // free 索引设为当前索引 + virtq->free_desc = _desc; + // virt 地址置 0 + virtq->desc_virt[_desc] = nullptr; + return; +} diff --git a/src/drv/virtio/virtio_mmio_drv.cpp b/src/drv/virtio/virtio_mmio_drv.cpp new file mode 100644 index 000000000..706f8931b --- /dev/null +++ b/src/drv/virtio/virtio_mmio_drv.cpp @@ -0,0 +1,304 @@ + +/** + * @file virtio_mmio_drv.cpp + * @brief virtio mmio 驱动实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01Zone.N迁移到 doxygen + *
+ */ + +#include "virtio_mmio_drv.h" +#include "driver_base.h" +#include "intr.h" +#include "io.h" +#include "string" +#include "vector" +#include "virtqueue.h" +#include "vmm.h" + +void virtio_mmio_drv_t::set_features( + const mystl::vector& _features) { + // 首先获取硬件信息 + // 0~31 位 + IO::get_instance().write32(regs.device_features_sel, 0); + uint32_t device_feature_low + = IO::get_instance().read32(regs.device_features); + // 32~63 位 + IO::get_instance().write32(regs.device_features_sel, 1); + uint32_t device_feature_high + = IO::get_instance().read32(regs.device_features); + + // TODO: 如果有设备不支持的 feature,需要有错误反馈 + for (auto i : _features) { + // 如果 i.bit 大于 31,那么意味着需要 DeviceFeatures 的 32~63 位, + // 将 DeviceFeaturesSel 置位即可 + if (i.bit > 31) { + // 如果设备支持且需要此属性 + if ((i.status == true)) { + if ((device_feature_high & (1 << (i.bit - 32))) == true) { + // 选择写高位 + IO::get_instance().write32(regs.device_features_sel, 1); + // 写入 + IO::get_instance().write32( + regs.driver_features, + IO::get_instance().read32(regs.driver_features) + | (1 << (i.bit - 32))); + } + else { + err("Not support: %s\n", i.name.c_str()); + } + } + } + else { + // 如果设备支持且需要此属性 + if ((i.status == true)) { + if (((device_feature_low & (1 << i.bit)) != false)) { + // 选择写低位 + IO::get_instance().write32(regs.driver_features_sel, 0); + // 写入 + IO::get_instance().write32( + regs.driver_features, + IO::get_instance().read32(regs.driver_features) + | (1 << i.bit)); + } + else { + err("Not support: %s\n", i.name.c_str()); + } + } + } + } + return; +} + +void virtio_mmio_drv_t::add_to_device(uint32_t _queue_sel) { + // 选择队列号 + IO::get_instance().write32(regs.queue_sel, _queue_sel); + // 如果该队列已设置 + if (IO::get_instance().read32(regs.queue_ready) == 1) { + err("already used!\n"); + // 直接返回 + return; + } + // max 为零则表示不支持 + assert(IO::get_instance().read32(regs.queue_num_max) != 0); + // 如果长度大于允许的最大值 + if (queue.virtq->len > IO::get_instance().read32(regs.queue_num_max)) { + err("queue 0x%X too long!\n", _queue_sel); + return; + } + // 设置长度 + IO::get_instance().write32(regs.queue_num, queue.virtq->len); + // 将 queue 的物理地址写入相应寄存器 + // 写 desc 低位 + IO::get_instance().write32(regs.queue_desc_low, + queue.virtq->phys + queue.off_desc); + // 写 desc 高位 + IO::get_instance().write32(regs.queue_desc_high, 0); + // 写 driver 低位 + IO::get_instance().write32(regs.queue_driver_low, + queue.virtq->phys + queue.off_driver); + // 写 driver 高位 + IO::get_instance().write32(regs.queue_driver_high, 0); + // 写 device 低位 + IO::get_instance().write32(regs.queue_device_low, + queue.virtq->phys + queue.off_device); + // 写 device 高位 + IO::get_instance().write32(regs.queue_device_high, 0); + // ready 置位 + IO::get_instance().write32(regs.queue_ready, 1); + return; +} + +extern void virtio_mmio_intr(uint8_t _no); + +virtio_mmio_drv_t::virtio_mmio_drv_t(const resource_t& _resource) + : driver_base_t(NAME) { + // 映射内存 + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), _resource.mem.addr, + _resource.mem.addr, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + regs = virtio_regs_t(_resource.mem.addr); + + // 检查相关值 + assert(IO::get_instance().read32(regs.magic) == MAGIC_VALUE); + assert(IO::get_instance().read32(regs.version) == VERSION); + + // 检查类型是否符合 + device_type = (device_type_t)IO::get_instance().read32(regs.device_id); + // 初始化 + // virtio-v1.1#3.1.1 + // 重置设备 + IO::get_instance().write32(regs.status, 0); + // 置位 ACKNOWLEDGE + IO::get_instance().write32(regs.status, + IO::get_instance().read32(regs.status) + | DEVICE_STATUS_ACKNOWLEDGE); + // 置位 DRIVER + IO::get_instance().write32(regs.status, + IO::get_instance().read32(regs.status) + | DEVICE_STATUS_DRIVER); + // 接下来设置设备相关 feature,交给特定设备进行 + // 跳转到 virtio_blk.cpp 的构造函数 + // virtio-v1.1#3.1.1 + // 设置属性 + for (auto i : base_features) { + features.push_back(i); + } + + switch (device_type) { + case BLOCK_DEVICE: { + for (auto i : blk_features) { + features.push_back(i); + } + break; + } + default: { + warn("NOT SUPPORT device type : [%s]\n", + virtio_device_name[device_type]); + return; + } + } + + set_features(features); + // 属性设置完成 + // 置位 FEATURES_OK + IO::get_instance().write32(regs.status, + IO::get_instance().read32(regs.status) + | DEVICE_STATUS_FEATURES_OK); + // 再次读取以确认设置成功 + if ((IO::get_instance().read32(regs.status) & DEVICE_STATUS_FEATURES_OK) + == false) { + // 失败则报错 + assert(0); + return; + } + + switch (device_type) { + case BLOCK_DEVICE: { + // 更新设备信息指针 + blk_config = (virtio_blk_config_t*)regs.config; + // 设置队列 + /// @todo 多队列支持 + add_to_device(0); +// #define DEBUG +#ifdef DEBUG + uint32_t i = 0; + uint32_t j = 0; + do { + i = IO::get_instance().read32(regs.config_generation); + std::cout << blk_config << std::endl; + j = IO::get_instance().read32(regs.config_generation); + } while (i != j); +# undef DEBUG +#endif + break; + } + default: { + warn("NOT SUPPORT device type : [%s]\n", + virtio_device_name[device_type]); + return; + } + } + + IO::get_instance().write32(regs.status, + IO::get_instance().read32(regs.status) + | DEVICE_STATUS_DRIVER_OK); + // 至此 virtio-blk 设备的设置就完成了 + // 注册外部中断处理函数 + PLIC::get_instance().register_externel_handler(_resource.intr_no, + virtio_mmio_intr); + // 允许中断 + PLIC::get_instance().set(_resource.intr_no, true); + + printf("virtio mmio drv init\n"); + return; +} + +size_t virtio_mmio_drv_t::blk_rw(virtio_blk_req_t& _req) { + /// @todo 错误处理 + /// @see virtio-v1.1#5.2.6 + uint32_t mode = 0; + uint32_t desc1 = 0; + uint32_t desc2 = 0; + uint32_t desc3 = 0; + + if (_req.type == virtio_blk_req_t::IN) { + // mark page writeable + mode = VIRTQ_DESC_F_WRITE; + } + + desc1 = queue.alloc_desc(&_req); + desc2 = queue.alloc_desc(_req.data); + desc3 = queue.alloc_desc(&_req.status); + + queue.virtq->desc[desc1].len + = virtio_mmio_drv_t::virtio_blk_req_t::HEADER_SIZE; + queue.virtq->desc[desc1].flags = VIRTQ_DESC_F_NEXT; + queue.virtq->desc[desc1].next = desc2; + + queue.virtq->desc[desc2].len + = virtio_mmio_drv_t::virtio_blk_req_t::SECTOR_SIZE; + queue.virtq->desc[desc2].flags |= mode | VIRTQ_DESC_F_NEXT; + queue.virtq->desc[desc2].next = desc3; + + queue.virtq->desc[desc3].len + = virtio_mmio_drv_t::virtio_blk_req_t::FOOTER_SIZE; + queue.virtq->desc[desc3].flags = VIRTQ_DESC_F_WRITE; + queue.virtq->desc[desc3].next = 0; + + queue.virtq->avail->ring[queue.virtq->avail->idx % queue.virtq->len] + = desc1; + queue.virtq->avail->idx += 1; + IO::get_instance().write32(regs.queue_notify, 0); + return 0; +} + +void virtio_mmio_drv_t::set_intr_ack(void) { + IO::get_instance().write32( + regs.interrupt_ack, IO::get_instance().read32(regs.interrupt_status)); + return; +} + +size_t virtio_mmio_drv_t::get_queue_len(void) { + return queue.virtq->len; +} + +int virtio_mmio_drv_t::read(buf_t& _buf) { + /// @note 在 virtio_blk_handle_used 中释放 + virtio_blk_req_t* req = new virtio_blk_req_t; + req->type = virtio_blk_req_t::IN; + req->sector = _buf.sector; + req->data = _buf.data; + auto ret = blk_rw(*req); + return ret; +} + +int virtio_mmio_drv_t::write(buf_t& _buf) { + /// @note 在 virtio_blk_handle_used 中释放 + virtio_blk_req_t* req = new virtio_blk_req_t; + req->type = virtio_blk_req_t::OUT; + req->sector = _buf.sector; + req->data = _buf.data; + auto ret = blk_rw(*req); + return ret; +} + +int virtio_mmio_drv_t::ioctl(uint8_t _cmd, void* _buf) { + (void)_cmd; + (void)_buf; + return 0; +} + +int virtio_mmio_drv_t::status(uint8_t _cmd) { + (void)_cmd; + return 0; +} + +define_call_back(virtio_mmio_drv_t); diff --git a/src/drv/virtio/virtio_mmio_intr.cpp b/src/drv/virtio/virtio_mmio_intr.cpp new file mode 100644 index 000000000..59361fb13 --- /dev/null +++ b/src/drv/virtio/virtio_mmio_intr.cpp @@ -0,0 +1,110 @@ + +/** + * @file virtio_mmio_intr.cpp + * @brief virtio mmio 中断处理 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-12-23 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-23Zone.N新增文件 + *
+ */ + +#include "dev_drv_manager.h" +#include "string" +#include "virtio_mmio_drv.h" +#include "virtqueue.h" + +static void virtio_blk_handle_used(device_base_t* _dev, uint32_t _usedidx) { + assert(_dev != nullptr); + virtio_mmio_drv_t* drv = (virtio_mmio_drv_t*)_dev->drv; + uint32_t desc1 = 0; + uint32_t desc2 = 0; + uint32_t desc3 = 0; + virtio_mmio_drv_t::virtio_blk_req_t* req; + + desc1 = drv->queue.virtq->used->ring[_usedidx].id; + if (!(drv->queue.virtq->desc[desc1].flags & VIRTQ_DESC_F_NEXT)) { + err("virtio_blk_handle_used received malformed descriptors\n"); + return; + } + + desc2 = drv->queue.virtq->desc[desc1].next; + if (!(drv->queue.virtq->desc[desc2].flags & VIRTQ_DESC_F_NEXT)) { + err("virtio_blk_handle_used received malformed descriptors\n"); + return; + } + + desc3 = drv->queue.virtq->desc[desc2].next; + if (drv->queue.virtq->desc[desc1].len + != virtio_mmio_drv_t::virtio_blk_req_t::HEADER_SIZE + || drv->queue.virtq->desc[desc2].len + != virtio_mmio_drv_t::virtio_blk_req_t::SECTOR_SIZE + || drv->queue.virtq->desc[desc3].len + != virtio_mmio_drv_t::virtio_blk_req_t::FOOTER_SIZE) { + err("virtio_blk_handle_used received malformed descriptors\n"); + return; + } + req = (virtio_mmio_drv_t::virtio_blk_req_t*) + drv->queue.virtq->desc_virt[desc1]; +// #define DEBUG +#ifdef DEBUG + auto data = (uint8_t*)drv->queue.virtq->desc_virt[desc2]; + if (req->type == virtio_mmio_drv_t::virtio_blk_req_t::IN) { + printf("virtio_blk_handle_used: result: \"%s\"\n", data); + for (size_t i = 0; i < 512; i++) { + printf("0x%X ", data[i]); + } + } +# undef DEBUG +#endif + + switch (req->status) { + case virtio_mmio_drv_t::virtio_blk_req_t::OK: { + info("status [%d] in virtio_blk irq\n", req->status); + break; + } + case virtio_mmio_drv_t::virtio_blk_req_t::IOERR: { + info("status [%d] in virtio_blk irq\n", req->status); + break; + } + default: { + err("Unhandled status [%d] in virtio_blk irq\n", req->status); + break; + } + } + + delete req; + + drv->queue.free_desc(desc1); + drv->queue.free_desc(desc2); + drv->queue.free_desc(desc3); + + return; +} + +void virtio_mmio_intr(uint8_t _no) { + printf("virtio_mmio_intr: 0x%X\n", _no); + // 遍历设备列表,寻找驱动号对应的设备 + device_base_t* dev + = DEV_DRV_MANAGER::get_instance().get_dev_via_intr_no(_no); + assert(dev != nullptr); + virtio_mmio_drv_t* drv = (virtio_mmio_drv_t*)dev->drv; + drv->set_intr_ack(); + size_t len = drv->get_queue_len(); + size_t rev_len = ~len; + for (size_t i = drv->queue.virtq->seen_used; + i != (drv->queue.virtq->used->idx % len); i = ((i + 1) & rev_len)) { + virtio_blk_handle_used(dev, i); + } + + drv->queue.virtq->seen_used = drv->queue.virtq->used->idx % len; + + dev->buf.valid = true; + + return; +} diff --git a/src/fs/CMakeLists.txt b/src/fs/CMakeLists.txt new file mode 100644 index 000000000..3ab441579 --- /dev/null +++ b/src/fs/CMakeLists.txt @@ -0,0 +1,20 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +PROJECT(filesystem CXX) + +aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fatfs fatfs_src) +set(filesystem_src ${fatfs_src}) + +add_library(${PROJECT_NAME} OBJECT ${filesystem_src}) + +target_include_kernel_header_files(${PROJECT_NAME}) +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) +target_include_dev_header_files(${PROJECT_NAME}) +target_include_drv_header_files(${PROJECT_NAME}) +target_include_fs_header_files(${PROJECT_NAME}) diff --git a/src/fs/fatfs/00readme.txt b/src/fs/fatfs/00readme.txt new file mode 100644 index 000000000..3de3aeaa2 --- /dev/null +++ b/src/fs/fatfs/00readme.txt @@ -0,0 +1,21 @@ +FatFs Module Source Files R0.15 + + +FILES + + 00readme.txt This file. + 00history.txt Revision history. + ff.c FatFs module. + ffconf.h Configuration file of FatFs module. + ff.h Common include file for FatFs and application module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + ffunicode.c Optional Unicode utility functions. + ffsystem.c An example of optional O/S related functions. + + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and it does not depend on any specific + storage device. You need to provide a low level disk I/O module written to + control the storage device that attached to the target system. + diff --git a/src/fs/fatfs/LICENSE.txt b/src/fs/fatfs/LICENSE.txt new file mode 100644 index 000000000..a9e57a905 --- /dev/null +++ b/src/fs/fatfs/LICENSE.txt @@ -0,0 +1,24 @@ +FatFs License + +FatFs has being developped as a personal project of the author, ChaN. It is free from the code anyone else wrote at current release. Following code block shows a copy of the FatFs license document that heading the source files. + +/*----------------------------------------------------------------------------/ +/ FatFs - Generic FAT Filesystem Module Rx.xx / +/-----------------------------------------------------------------------------/ +/ +/ Copyright (C) 20xx, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/----------------------------------------------------------------------------*/ + +Therefore FatFs license is one of the BSD-style licenses, but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code, binary library and any forms without source code, do not need to include about FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most of open source software licenses include GNU GPL. When you redistribute the FatFs source code with changes or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software license that not conflict with FatFs license. diff --git a/src/fs/fatfs/diskio.cpp b/src/fs/fatfs/diskio.cpp new file mode 100644 index 000000000..69c77d0a3 --- /dev/null +++ b/src/fs/fatfs/diskio.cpp @@ -0,0 +1,190 @@ + +/** + * @file diskio.c + * @brief Low level disk I/O module SKELETON for FatFs + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +/*-----------------------------------------------------------------------*/ +/* If a working storage control module is available, it should be */ +/* attached to the FatFs via a glue function rather than modifying it. */ +/* This is an example of glue functions to attach various existing */ +/* storage control modules to the FatFs module with a defined API. */ +/*-----------------------------------------------------------------------*/ + +// Obtains integer types +#include "ff.h" +// Declarations of disk functions +#include "diskio.h" + +#include "buf.h" +#include "dev_drv_manager.h" +#include "device_base.h" + +// Definitions of physical drive number for each drive +/// Example: Map Ramdisk to physical drive 0 +#define DEV_MMIO 0 +/// Example: Map MMC/SD card to physical drive 1 +#define DEV_MMC 1 +/// Example: Map USB MSD to physical drive 2 +#define DEV_USB 2 + +DWORD get_fattime(void) { + return 0; +} + +DSTATUS disk_status(BYTE _pdrv) { + DSTATUS status = STA_OK; + switch (_pdrv) { + case DEV_MMIO: { + break; + } + case DEV_MMC: { + break; + } + case DEV_USB: { + break; + } + default: { + warn("disk_status unhandled device.\n"); + break; + } + } + return status; +} + +DSTATUS disk_initialize(BYTE _pdrv) { + DSTATUS status = STA_OK; + switch (_pdrv) { + case DEV_MMIO: { + break; + } + case DEV_MMC: { + break; + } + case DEV_USB: { + break; + } + default: { + warn("disk_initialize unhandled device.\n"); + break; + } + } + return status; +} + +DRESULT disk_read(BYTE _pdrv, BYTE* _buff, LBA_t _sector, UINT _count) { + assert(_count == 1); + DRESULT result = RES_OK; + info("disk_read [%d] _sector: 0x%X, _count: 0x%X\n", _pdrv, _sector, + _count); + + switch (_pdrv) { + case DEV_MMIO: { + device_base_t* dev = (device_base_t*)DEV_DRV_MANAGER::get_instance() + .get_dev_via_intr_no(1); + + buf_t buf; + buf.sector = _sector; + + dev->read(buf); + + memcpy(_buff, buf.data, COMMON::BUFFFER_SIZE); + +// #define DEBUG +#ifdef DEBUG + for (size_t i = 0; i < COMMON::BUFFFER_SIZE; i++) { + printf("0x%X ", buf.data[i]); + } + +# undef DEBUG +#endif + break; + } + case DEV_MMC: { + break; + } + case DEV_USB: { + break; + } + default: { + warn("disk_read unhandled device.\n"); + break; + } + } + + warn("read done\n"); + return result; +} + +#if FF_FS_READONLY == 0 + +DRESULT disk_write(BYTE _pdrv, const BYTE* _buff, LBA_t _sector, UINT _count) { + assert(_count == 1); + DRESULT result = RES_OK; + info("disk_write [%d] _sector: 0x%X, _count: 0x%X\n", _pdrv, _sector, + _count); + + switch (_pdrv) { + case DEV_MMIO: { + device_base_t* dev = (device_base_t*)DEV_DRV_MANAGER::get_instance() + .get_dev_via_intr_no(1); + buf_t buf; + buf.sector = _sector; + + memcpy(buf.data, _buff, COMMON::BUFFFER_SIZE); + + dev->write(buf); + + break; + } + case DEV_MMC: { + break; + } + case DEV_USB: { + break; + } + default: { + warn("disk_write unhandled device.\n"); + break; + } + } + + warn("write done\n"); + return result; +} + +#endif /* FF_FS_READONLY == 0 */ + +DRESULT disk_ioctl(BYTE _pdrv, BYTE _cmd, void* _buff) { + (void)_cmd; + (void)_buff; + DRESULT result = RES_OK; + switch (_pdrv) { + case DEV_MMIO: { + break; + } + case DEV_MMC: { + break; + } + case DEV_USB: { + break; + } + default: { + warn("disk_ioctl unhandled device.\n"); + break; + } + } + + return result; +} diff --git a/src/fs/fatfs/ff.cpp b/src/fs/fatfs/ff.cpp new file mode 100644 index 000000000..8cc359c91 --- /dev/null +++ b/src/fs/fatfs/ff.cpp @@ -0,0 +1,10492 @@ + +/** + * @file ff.c + * @brief FatFs - Generic FAT Filesystem Module R0.15 w/patch1 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +/*----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2022, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + +#include +/// Declarations of FatFs API +#include "ff.h" +/// Declarations of device I/O functions +#include "diskio.h" + +// Module Private Definitions + +/// Revision ID +#if FF_DEFINED != 80286 +# error Wrong include file (ff.h). +#endif + +/// Limits and boundaries +/// Max size of FAT directory +static constexpr const uint32_t MAX_DIR = 0x200000; +/// Max size of exFAT directory +static constexpr const uint32_t MAX_DIR_EX = 0x10000000; +/// Max FAT12 clusters (differs from specs, but right for real DOS/Windows +/// behavior) +static constexpr const uint32_t MAX_FAT12 = 0xFF5; +/// Max FAT16 clusters (differs from specs, but right for real DOS/Windows +/// behavior) +static constexpr const uint32_t MAX_FAT16 = 0xFFF5; +/// Max FAT32 clusters (not specified, practical limit) +static constexpr const uint32_t MAX_FAT32 = 0x0FFFFFF5; +/// Max exFAT clusters (differs from specs, implementation limit) +static constexpr const uint32_t MAX_EXFAT = 0x7FFFFFFD; + +/// Character code support macros +#define IsUpper(_c) ((_c) >= 'A' && (_c) <= 'Z') +#define IsLower(_c) ((_c) >= 'a' && (_c) <= 'z') +#define IsDigit(_c) ((_c) >= '0' && (_c) <= '9') +#define IsSeparator(_c) ((_c) == '/' || (_c) == '\\') +#define IsTerminator(_c) ((UINT)(_c) < (FF_USE_LFN ? ' ' : '!')) +#define IsSurrogate(_c) ((_c) >= 0xD800 && (_c) <= 0xDFFF) +#define IsSurrogateH(_c) ((_c) >= 0xD800 && (_c) <= 0xDBFF) +#define IsSurrogateL(_c) ((_c) >= 0xDC00 && (_c) <= 0xDFFF) + +/// Additional file access control and file status flags for internal use +/// Seek to end of the file on file open +static constexpr const uint32_t FA_SEEKEND = 0x20; +/// File has been modified +static constexpr const uint32_t FA_MODIFIED = 0x40; +/// FIL.buf[] needs to be written-back +static constexpr const uint32_t FA_DIRTY = 0x80; + +/// Additional file attribute bits for internal use +/// Volume label +static constexpr const uint32_t AM_VOL = 0x08; +/// LFN entry +static constexpr const uint32_t AM_LFN = 0x0F; +/// Mask of defined bits in FAT +static constexpr const uint32_t AM_MASK = 0x3F; +/// Mask of defined bits in exFAT +static constexpr const uint32_t AM_MASKX = 0x37; + +/// Name status flags in fn[11] +/// Index of the name status byte +static constexpr const uint32_t NSFLAG = 11; +/// Out of 8.3 format +static constexpr const uint32_t NS_LOSS = 0x01; +/// Force to create LFN entry +static constexpr const uint32_t NS_LFN = 0x02; +/// Last segment +static constexpr const uint32_t NS_LAST = 0x04; +/// Lower case flag (body) +static constexpr const uint32_t NS_BODY = 0x08; +/// Lower case flag (ext) +static constexpr const uint32_t NS_EXT = 0x10; +/// Dot entry +static constexpr const uint32_t NS_DOT = 0x20; +/// Do not find LFN +static constexpr const uint32_t NS_NOLFN = 0x40; +/// Not followed +static constexpr const uint32_t NS_NONAME = 0x80; + +/// exFAT directory entry types +/// Allocation bitmap +static constexpr const uint32_t ET_BITMAP = 0x81; +/// Up-case table +static constexpr const uint32_t ET_UPCASE = 0x82; +/// Volume label +static constexpr const uint32_t ET_VLABEL = 0x83; +/// File and directory +static constexpr const uint32_t ET_FILEDIR = 0x85; +/// Stream extension +static constexpr const uint32_t ET_STREAM = 0xC0; +/// Name extension +static constexpr const uint32_t ET_FILENAME = 0xC1; + +// FatFs refers the FAT structure as simple byte array instead of structure +// member because the C structure is not binary compatible between different +// platforms + +/// x86 jump instruction (3-byte) +static constexpr const uint32_t BS_JmpBoot = 0; +/// OEM name (8-byte) +static constexpr const uint32_t BS_OEMName = 3; +/// Sector size [byte] (WORD) +static constexpr const uint32_t BPB_BytsPerSec = 11; +/// Cluster size [sector] (BYTE) +static constexpr const uint32_t BPB_SecPerClus = 13; +/// Size of reserved area [sector] (WORD) +static constexpr const uint32_t BPB_RsvdSecCnt = 14; +/// Number of FATs (BYTE) +static constexpr const uint32_t BPB_NumFATs = 16; +/// Size of root directory area for FAT [entry] (WORD) +static constexpr const uint32_t BPB_RootEntCnt = 17; +/// Volume size (16-bit) [sector] (WORD) +static constexpr const uint32_t BPB_TotSec16 = 19; +/// Media descriptor byte (BYTE) +static constexpr const uint32_t BPB_Media = 21; +/// FAT size (16-bit) [sector] (WORD) +static constexpr const uint32_t BPB_FATSz16 = 22; +/// Number of sectors per track for int13h [sector] (WORD) +static constexpr const uint32_t BPB_SecPerTrk = 24; +/// Number of heads for int13h (WORD) +static constexpr const uint32_t BPB_NumHeads = 26; +/// Volume offset from top of the drive (DWORD) +static constexpr const uint32_t BPB_HiddSec = 28; +/// Volume size (32-bit) [sector] (DWORD) +static constexpr const uint32_t BPB_TotSec32 = 32; +/// Physical drive number for int13h (BYTE) +static constexpr const uint32_t BS_DrvNum = 36; +/// WindowsNT error flag (BYTE) +static constexpr const uint32_t BS_NTres = 37; +/// Extended boot signature (BYTE) +static constexpr const uint32_t BS_BootSig = 38; +/// Volume serial number (DWORD) +static constexpr const uint32_t BS_VolID = 39; +/// Volume label string (8-byte) +static constexpr const uint32_t BS_VolLab = 43; +/// Filesystem type string (8-byte) +static constexpr const uint32_t BS_FilSysType = 54; +/// Boot code (448-byte) +static constexpr const uint32_t BS_BootCode = 62; +/// Signature word (WORD) +static constexpr const uint32_t BS_55AA = 510; + +/// FAT32: FAT size [sector] (DWORD) +static constexpr const uint32_t BPB_FATSz32 = 36; +/// FAT32: Extended flags (WORD) +static constexpr const uint32_t BPB_ExtFlags32 = 40; +/// FAT32: Filesystem version (WORD) +static constexpr const uint32_t BPB_FSVer32 = 42; +/// FAT32: Root directory cluster (DWORD) +static constexpr const uint32_t BPB_RootClus32 = 44; +/// FAT32: Offset of FSINFO sector (WORD) +static constexpr const uint32_t BPB_FSInfo32 = 48; +/// FAT32: Offset of backup boot sector (WORD) +static constexpr const uint32_t BPB_BkBootSec32 = 50; +/// FAT32: Physical drive number for int13h (BYTE) +static constexpr const uint32_t BS_DrvNum32 = 64; +/// FAT32: Error flag (BYTE) +static constexpr const uint32_t BS_NTres32 = 65; +/// FAT32: Extended boot signature (BYTE) +static constexpr const uint32_t BS_BootSig32 = 66; +/// FAT32: Volume serial number (DWORD) +static constexpr const uint32_t BS_VolID32 = 67; +/// FAT32: Volume label string (8-byte) +static constexpr const uint32_t BS_VolLab32 = 71; +/// FAT32: Filesystem type string (8-byte) +static constexpr const uint32_t BS_FilSysType32 = 82; +/// FAT32: Boot code (420-byte) +static constexpr const uint32_t BS_BootCode32 = 90; + +/// exFAT: MBZ field (53-byte) +static constexpr const uint32_t BPB_ZeroedEx = 11; +/// exFAT: Volume offset from top of the drive [sector] (QWORD) +static constexpr const uint32_t BPB_VolOfsEx = 64; +/// exFAT: Volume size [sector] (QWORD) +static constexpr const uint32_t BPB_TotSecEx = 72; +/// exFAT: FAT offset from top of the volume [sector] (DWORD) +static constexpr const uint32_t BPB_FatOfsEx = 80; +/// exFAT: FAT size [sector] (DWORD) +static constexpr const uint32_t BPB_FatSzEx = 84; +/// exFAT: Data offset from top of the volume [sector] (DWORD) +static constexpr const uint32_t BPB_DataOfsEx = 88; +/// exFAT: Number of clusters (DWORD) +static constexpr const uint32_t BPB_NumClusEx = 92; +/// exFAT: Root directory start cluster (DWORD) +static constexpr const uint32_t BPB_RootClusEx = 96; +/// exFAT: Volume serial number (DWORD) +static constexpr const uint32_t BPB_VolIDEx = 100; +/// exFAT: Filesystem version (WORD) +static constexpr const uint32_t BPB_FSVerEx = 104; +/// exFAT: Volume flags (WORD) +static constexpr const uint32_t BPB_VolFlagEx = 106; +/// exFAT: Log2 of sector size in unit of byte (BYTE) +static constexpr const uint32_t BPB_BytsPerSecEx = 108; +/// exFAT: Log2 of cluster size in unit of sector (BYTE) +static constexpr const uint32_t BPB_SecPerClusEx = 109; +/// exFAT: Number of FATs (BYTE) +static constexpr const uint32_t BPB_NumFATsEx = 110; +/// exFAT: Physical drive number for int13h (BYTE) +static constexpr const uint32_t BPB_DrvNumEx = 111; +/// exFAT: Percent in use (BYTE) +static constexpr const uint32_t BPB_PercInUseEx = 112; +/// exFAT: Reserved (7-byte) +static constexpr const uint32_t BPB_RsvdEx = 113; +/// exFAT: Boot code (390-byte) +static constexpr const uint32_t BS_BootCodeEx = 120; + +/// Short file name (11-byte) +static constexpr const uint32_t DIR_Name = 0; +/// Attribute (BYTE) +static constexpr const uint32_t DIR_Attr = 11; +/// Lower case flag (BYTE) +static constexpr const uint32_t DIR_NTres = 12; +/// Created time sub-second (BYTE) +static constexpr const uint32_t DIR_CrtTime10 = 13; +/// Created time (DWORD) +static constexpr const uint32_t DIR_CrtTime = 14; +/// Last accessed date (WORD) +static constexpr const uint32_t DIR_LstAccDate = 18; +/// Higher 16-bit of first cluster (WORD) +static constexpr const uint32_t DIR_FstClusHI = 20; +/// Modified time (DWORD) +static constexpr const uint32_t DIR_ModTime = 22; +/// Lower 16-bit of first cluster (WORD) +static constexpr const uint32_t DIR_FstClusLO = 26; +/// File size (DWORD) +static constexpr const uint32_t DIR_FileSize = 28; +/// LFN: LFN order and LLE flag (BYTE) +static constexpr const uint32_t LDIR_Ord = 0; +/// LFN: LFN attribute (BYTE) +static constexpr const uint32_t LDIR_Attr = 11; +/// LFN: Entry type (BYTE) +static constexpr const uint32_t LDIR_Type = 12; +/// LFN: Checksum of the SFN (BYTE) +static constexpr const uint32_t LDIR_Chksum = 13; +/// LFN: MBZ field (WORD) +static constexpr const uint32_t LDIR_FstClusLO = 26; +/// exFAT: Type of exFAT directory entry (BYTE) +static constexpr const uint32_t XDIR_Type = 0; +/// exFAT: Number of volume label characters (BYTE) +static constexpr const uint32_t XDIR_NumLabel = 1; +/// exFAT: Volume label (11-WORD) +static constexpr const uint32_t XDIR_Label = 2; +/// exFAT: Sum of case conversion table (DWORD) +static constexpr const uint32_t XDIR_CaseSum = 4; +/// exFAT: Number of secondary entries (BYTE) +static constexpr const uint32_t XDIR_NumSec = 1; +/// exFAT: Sum of the set of directory entries (WORD) +static constexpr const uint32_t XDIR_SetSum = 2; +/// exFAT: File attribute (WORD) +static constexpr const uint32_t XDIR_Attr = 4; +/// exFAT: Created time (DWORD) +static constexpr const uint32_t XDIR_CrtTime = 8; +/// exFAT: Modified time (DWORD) +static constexpr const uint32_t XDIR_ModTime = 12; +/// exFAT: Last accessed time (DWORD) +static constexpr const uint32_t XDIR_AccTime = 16; +/// exFAT: Created time subsecond (BYTE) +static constexpr const uint32_t XDIR_CrtTime10 = 20; +/// exFAT: Modified time subsecond (BYTE) +static constexpr const uint32_t XDIR_ModTime10 = 21; +/// exFAT: Created timezone (BYTE) +static constexpr const uint32_t XDIR_CrtTZ = 22; +/// exFAT: Modified timezone (BYTE) +static constexpr const uint32_t XDIR_ModTZ = 23; +/// exFAT: Last accessed timezone (BYTE) +static constexpr const uint32_t XDIR_AccTZ = 24; +/// exFAT: General secondary flags (BYTE) +static constexpr const uint32_t XDIR_GenFlags = 33; +/// exFAT: Number of file name characters (BYTE) +static constexpr const uint32_t XDIR_NumName = 35; +/// exFAT: Hash of file name (WORD) +static constexpr const uint32_t XDIR_NameHash = 36; +/// exFAT: Valid file size (QWORD) +static constexpr const uint32_t XDIR_ValidFileSize = 40; +/// exFAT: First cluster of the file data (DWORD) +static constexpr const uint32_t XDIR_FstClus = 52; +/// exFAT: File/Directory size (QWORD) +static constexpr const uint32_t XDIR_FileSize = 56; + +/// Size of a directory entry +static constexpr const uint32_t SZDIRE = 32; +/// Deleted directory entry mark set to DIR_Name[0] +static constexpr const uint32_t DDEM = 0xE5; +/// Replacement of the character collides with DDEM +static constexpr const uint32_t RDDEM = 0x05; +/// Last long entry flag in LDIR_Ord +static constexpr const uint32_t LLEF = 0x40; + +/// FAT32 FSI: Leading signature (DWORD) +static constexpr const uint32_t FSI_LeadSig = 0; +/// FAT32 FSI: Structure signature (DWORD) +static constexpr const uint32_t FSI_StrucSig = 484; +/// FAT32 FSI: Number of free clusters (DWORD) +static constexpr const uint32_t FSI_Free_Count = 488; +/// FAT32 FSI: Last allocated cluster (DWORD) +static constexpr const uint32_t FSI_Nxt_Free = 492; + +/// MBR: Offset of partition table in the MBR +static constexpr const uint32_t MBR_Table = 446; +/// MBR: Size of a partition table entry +static constexpr const uint32_t SZ_PTE = 16; +/// MBR PTE: Boot indicator +static constexpr const uint32_t PTE_Boot = 0; +/// MBR PTE: Start head +static constexpr const uint32_t PTE_StHead = 1; +/// MBR PTE: Start sector +static constexpr const uint32_t PTE_StSec = 2; +/// MBR PTE: Start cylinder +static constexpr const uint32_t PTE_StCyl = 3; +/// MBR PTE: System ID +static constexpr const uint32_t PTE_System = 4; +/// MBR PTE: End head +static constexpr const uint32_t PTE_EdHead = 5; +/// MBR PTE: End sector +static constexpr const uint32_t PTE_EdSec = 6; +/// MBR PTE: End cylinder +static constexpr const uint32_t PTE_EdCyl = 7; +/// MBR PTE: Start in LBA +static constexpr const uint32_t PTE_StLba = 8; +/// MBR PTE: Size in LBA +static constexpr const uint32_t PTE_SizLba = 12; + +/// GPT HDR: Signature (8-byte) +static constexpr const uint32_t GPTH_Sign = 0; +/// GPT HDR: Revision (DWORD) +static constexpr const uint32_t GPTH_Rev = 8; +/// GPT HDR: Header size (DWORD) +static constexpr const uint32_t GPTH_Size = 12; +/// GPT HDR: Header BCC (DWORD) +static constexpr const uint32_t GPTH_Bcc = 16; +/// GPT HDR: This header LBA (QWORD) +static constexpr const uint32_t GPTH_CurLba = 24; +/// GPT HDR: Another header LBA (QWORD) +static constexpr const uint32_t GPTH_BakLba = 32; +/// GPT HDR: First LBA for partition data (QWORD) +static constexpr const uint32_t GPTH_FstLba = 40; +/// GPT HDR: Last LBA for partition data (QWORD) +static constexpr const uint32_t GPTH_LstLba = 48; +/// GPT HDR: Disk GUID (16-byte) +static constexpr const uint32_t GPTH_DskGuid = 56; +/// GPT HDR: Partition table LBA (QWORD) +static constexpr const uint32_t GPTH_PtOfs = 72; +/// GPT HDR: Number of table entries (DWORD) +static constexpr const uint32_t GPTH_PtNum = 80; +/// GPT HDR: Size of table entry (DWORD) +static constexpr const uint32_t GPTH_PteSize = 84; +/// GPT HDR: Partition table BCC (DWORD) +static constexpr const uint32_t GPTH_PtBcc = 88; +/// GPT PTE: Size of partition table entry +static constexpr const uint32_t SZ_GPTE = 128; +/// GPT PTE: Partition type GUID (16-byte) +static constexpr const uint32_t GPTE_PtGuid = 0; +/// GPT PTE: Partition unique GUID (16-byte) +static constexpr const uint32_t GPTE_UpGuid = 16; +/// GPT PTE: First LBA of partition (QWORD) +static constexpr const uint32_t GPTE_FstLba = 32; +/// GPT PTE: Last LBA of partition (QWORD) +static constexpr const uint32_t GPTE_LstLba = 40; +/// GPT PTE: Partition flags (QWORD) +static constexpr const uint32_t GPTE_Flags = 48; +/// GPT PTE: Partition name +static constexpr const uint32_t GPTE_Name = 56; + +/// Post process on fatal error in the file operations +#define ABORT(_fs, _res) \ + { \ + fp->err = (BYTE)(_res); \ + LEAVE_FF(_fs, _res); \ + } + +/// Re-entrancy related +#if FF_FS_REENTRANT +# if FF_USE_LFN == 1 +# error Static LFN work area cannot be used in thread-safe configuration +# endif +# define LEAVE_FF(_fs, _res) \ + { \ + unlock_volume(_fs, _res); \ + return _res; \ + } +#else +# define LEAVE_FF(_fs, _res) return _res +#endif + +/// Definitions of logical drive - physical location conversion +#if FF_MULTI_PARTITION +/// Get physical drive number +# define LD2PD(_vol) VolToPart[_vol].pd +/// Get partition number (0:auto search, 1..:forced partition number) +# define LD2PT(_vol) VolToPart[_vol].pt +#else +/// Each logical drive is associated with the same physical drive number +# define LD2PD(_vol) (BYTE)(_vol) +/// Auto partition search +# define LD2PT(_vol) 0 +#endif + +/// Definitions of sector size +#if (FF_MAX_SS < FF_MIN_SS) \ + || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 \ + && FF_MAX_SS != 4096) \ + || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 \ + && FF_MIN_SS != 4096) +# error Wrong sector size configuration +#endif +#if FF_MAX_SS == FF_MIN_SS +/// Fixed sector size +# define SS(_fs) ((UINT)FF_MAX_SS) +#else +/// Variable sector size +# define SS(_fs) ((_fs)->ssize) +#endif + +/// Timestamp +#if FF_FS_NORTC == 1 +# if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 \ + || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31 +# error Invalid FF_FS_NORTC settings +# endif +# define GET_FATTIME() \ + ((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 \ + | (DWORD)FF_NORTC_MDAY << 16) +#else +# define GET_FATTIME() get_fattime() +#endif + +/// File lock controls +#if FF_FS_LOCK +# if FF_FS_READONLY +# error FF_FS_LOCK must be 0 at read-only configuration +# endif +struct FILESEM { + /// Object ID 1, volume (NULL:blank entry) + FATFS* fs; + /// Object ID 2, containing directory (0:root) + DWORD clu; + /// Object ID 3, offset in the directory + DWORD ofs; + /// Object open counter, 0:none, 0x01..0xFF:read mode open count, + /// 0x100:write mode + UINT ctr; +}; +#endif + +/// SBCS up-case tables (\x80-\xFF) +static constexpr const uint8_t TBL_CT437[] + = { 0x80, 0x9A, 0x45, 0x41, 0x8E, 0x41, 0x8F, 0x80, 0x45, 0x45, 0x45, 0x49, + 0x49, 0x49, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0x4F, 0x99, 0x4F, 0x55, 0x55, + 0x59, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x41, 0x49, 0x4F, 0x55, + 0xA5, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT720[] + = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, + 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT737[] + = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0xAA, 0x92, 0x93, 0x94, 0x95, 0x96, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0x97, 0xEA, 0xEB, 0xEC, 0xE4, 0xED, 0xEE, 0xEF, 0xF5, 0xF0, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT771[] + = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDC, 0xDE, 0xDE, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x9C, 0x9D, 0x9E, 0x9F, 0xF0, 0xF0, 0xF2, 0xF2, 0xF4, 0xF4, 0xF6, 0xF6, + 0xF8, 0xF8, 0xFA, 0xFA, 0xFC, 0xFC, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT775[] + = { 0x80, 0x9A, 0x91, 0xA0, 0x8E, 0x95, 0x8F, 0x80, 0xAD, 0xED, 0x8A, 0x8A, + 0xA1, 0x8D, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0xE2, 0x99, 0x95, 0x96, 0x97, + 0x97, 0x99, 0x9A, 0x9D, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xE0, 0xA3, + 0xA3, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xB5, 0xB6, 0xB7, 0xB8, + 0xBD, 0xBE, 0xC6, 0xC7, 0xA5, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE5, 0xE5, 0xE6, 0xE3, 0xE8, 0xE8, 0xEA, 0xEA, + 0xEE, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT850[] + = { 0x43, 0x55, 0x45, 0x41, 0x41, 0x41, 0x41, 0x43, 0x45, 0x45, 0x45, 0x49, + 0x49, 0x49, 0x41, 0x41, 0x45, 0x92, 0x92, 0x4F, 0x4F, 0x4F, 0x55, 0x55, + 0x59, 0x4F, 0x55, 0x4F, 0x9C, 0x4F, 0x9E, 0x9F, 0x41, 0x49, 0x4F, 0x55, + 0xA5, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0x41, 0x41, 0x41, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0x41, 0x41, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD1, 0xD1, 0x45, 0x45, + 0x45, 0x49, 0x49, 0x49, 0x49, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0x49, 0xDF, + 0x4F, 0xE1, 0x4F, 0x4F, 0x4F, 0x4F, 0xE6, 0xE8, 0xE8, 0x55, 0x55, 0x55, + 0x59, 0x59, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT852[] + = { 0x80, 0x9A, 0x90, 0xB6, 0x8E, 0xDE, 0x8F, 0x80, 0x9D, 0xD3, 0x8A, 0x8A, + 0xD7, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x91, 0xE2, 0x99, 0x95, 0x95, 0x97, + 0x97, 0x99, 0x9A, 0x9B, 0x9B, 0x9D, 0x9E, 0xAC, 0xB5, 0xD6, 0xE0, 0xE9, + 0xA4, 0xA4, 0xA6, 0xA6, 0xA8, 0xA8, 0xAA, 0x8D, 0xAC, 0xB8, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBD, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC6, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD1, 0xD1, 0xD2, 0xD3, + 0xD2, 0xD5, 0xD6, 0xD7, 0xB7, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE3, 0xD5, 0xE6, 0xE6, 0xE8, 0xE9, 0xE8, 0xEB, + 0xED, 0xED, 0xDD, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xEB, 0xFC, 0xFC, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT855[] + = { 0x81, 0x81, 0x83, 0x83, 0x85, 0x85, 0x87, 0x87, 0x89, 0x89, 0x8B, 0x8B, + 0x8D, 0x8D, 0x8F, 0x8F, 0x91, 0x91, 0x93, 0x93, 0x95, 0x95, 0x97, 0x97, + 0x99, 0x99, 0x9B, 0x9B, 0x9D, 0x9D, 0x9F, 0x9F, 0xA1, 0xA1, 0xA3, 0xA3, + 0xA5, 0xA5, 0xA7, 0xA7, 0xA9, 0xA9, 0xAB, 0xAB, 0xAD, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB6, 0xB6, 0xB8, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBE, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC7, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD1, 0xD1, 0xD3, 0xD3, + 0xD5, 0xD5, 0xD7, 0xD7, 0xDD, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xE0, 0xDF, + 0xE0, 0xE2, 0xE2, 0xE4, 0xE4, 0xE6, 0xE6, 0xE8, 0xE8, 0xEA, 0xEA, 0xEC, + 0xEC, 0xEE, 0xEE, 0xEF, 0xF0, 0xF2, 0xF2, 0xF4, 0xF4, 0xF6, 0xF6, 0xF8, + 0xF8, 0xFA, 0xFA, 0xFC, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT857[] + = { 0x80, 0x9A, 0x90, 0xB6, 0x8E, 0xB7, 0x8F, 0x80, 0xD2, 0xD3, 0xD4, 0xD8, + 0xD7, 0x49, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0xE2, 0x99, 0xE3, 0xEA, 0xEB, + 0x98, 0x99, 0x9A, 0x9D, 0x9C, 0x9D, 0x9E, 0x9E, 0xB5, 0xD6, 0xE0, 0xE9, + 0xA5, 0xA5, 0xA6, 0xA6, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC7, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0x49, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE5, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xDE, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT860[] + = { 0x80, 0x9A, 0x90, 0x8F, 0x8E, 0x91, 0x86, 0x80, 0x89, 0x89, 0x92, 0x8B, + 0x8C, 0x98, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x8C, 0x99, 0xA9, 0x96, 0x9D, + 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x86, 0x8B, 0x9F, 0x96, + 0xA5, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT861[] + = { 0x80, 0x9A, 0x90, 0x41, 0x8E, 0x41, 0x8F, 0x80, 0x45, 0x45, 0x45, 0x8B, + 0x8B, 0x8D, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0x4F, 0x99, 0x8D, 0x55, 0x97, + 0x97, 0x99, 0x9A, 0x9D, 0x9C, 0x9D, 0x9E, 0x9F, 0xA4, 0xA5, 0xA6, 0xA7, + 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT862[] + = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x41, 0x49, 0x4F, 0x55, + 0xA5, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT863[] + = { 0x43, 0x55, 0x45, 0x41, 0x41, 0x41, 0x86, 0x43, 0x45, 0x45, 0x45, 0x49, + 0x49, 0x8D, 0x41, 0x8F, 0x45, 0x45, 0x45, 0x4F, 0x45, 0x49, 0x55, 0x55, + 0x98, 0x4F, 0x55, 0x9B, 0x9C, 0x55, 0x55, 0x9F, 0xA0, 0xA1, 0x4F, 0x55, + 0xA4, 0xA5, 0xA6, 0xA7, 0x49, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT864[] + = { 0x80, 0x9A, 0x45, 0x41, 0x8E, 0x41, 0x8F, 0x80, 0x45, 0x45, 0x45, 0x49, + 0x49, 0x49, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0x4F, 0x99, 0x4F, 0x55, 0x55, + 0x59, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x41, 0x49, 0x4F, 0x55, + 0xA5, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT865[] + = { 0x80, 0x9A, 0x90, 0x41, 0x8E, 0x41, 0x8F, 0x80, 0x45, 0x45, 0x45, 0x49, + 0x49, 0x49, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0x4F, 0x99, 0x4F, 0x55, 0x55, + 0x59, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x41, 0x49, 0x4F, 0x55, + 0xA5, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, + 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT866[] + = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, + 0x9C, 0x9D, 0x9E, 0x9F, 0xF0, 0xF0, 0xF2, 0xF2, 0xF4, 0xF4, 0xF6, 0xF6, + 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; + +static constexpr const uint8_t TBL_CT869[] + = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, + 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, + 0x98, 0x99, 0x9A, 0x86, 0x9C, 0x8D, 0x8F, 0x90, 0x91, 0x90, 0x92, 0x95, + 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, + 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, + 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, + 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, + 0xD4, 0xD5, 0xA4, 0xA5, 0xA6, 0xD9, 0xDA, 0xDB, 0xDC, 0xA7, 0xA8, 0xDF, + 0xA9, 0xAA, 0xAC, 0xAD, 0xB5, 0xB6, 0xB7, 0xB8, 0xBD, 0xBE, 0xC6, 0xC7, + 0xCF, 0xCF, 0xD0, 0xEF, 0xF0, 0xF1, 0xD1, 0xD2, 0xD3, 0xF5, 0xD4, 0xF7, + 0xF8, 0xF9, 0xD5, 0x96, 0x95, 0x98, 0xFE, 0xFF }; + +/* DBCS code range |----- 1st byte -----| |----------- 2nd byte -----------| */ +/* <------> <------> <------> <------> <------> */ +static constexpr const uint8_t TBL_DC932[] + = { 0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00 }; +static constexpr const uint8_t TBL_DC936[] + = { 0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00 }; +static constexpr const uint8_t TBL_DC949[] + = { 0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE }; +static constexpr const uint8_t TBL_DC950[] + = { 0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00 }; + +/// Macros for table definitions +#define MERGE_2STR(_a, _b) _a##_b +#define MKCVTBL(_hd, _cp) MERGE_2STR(_hd, _cp) + +/*-------------------------------------------------------------------------- + + Module Private Work Area + +---------------------------------------------------------------------------*/ +/* Remark: Variables defined here without initial value shall be guaranteed +/ zero/null at start-up. If not, the linker option or start-up routine is +/ not compliance with C standard. */ + +/*--------------------------------*/ +/* File/Volume controls */ +/*--------------------------------*/ + +#if FF_VOLUMES < 1 || FF_VOLUMES > 10 +# error Wrong FF_VOLUMES setting +#endif +/// Pointer to the filesystem objects (logical drives) +static FATFS* FatFs[FF_VOLUMES]; +/// Filesystem mount ID +static WORD Fsid; + +#if FF_FS_RPATH != 0 +/// Current drive set by f_chdrive() +static BYTE CurrVol; +#endif + +#if FF_FS_LOCK != 0 +/// Open object lock semaphores +static FILESEM Files[FF_FS_LOCK]; +# if FF_FS_REENTRANT +/// System lock flag (0:no mutex, 1:unlocked, 2:locked) +static BYTE SysLock; +# endif +#endif + +#if FF_STR_VOLUME_ID +# ifdef FF_VOLUME_STRS +/// Pre-defined volume ID +static const char* const VolumeStr[FF_VOLUMES] = { FF_VOLUME_STRS }; +# endif +#endif + +#if FF_LBA64 +# if FF_MIN_GPT > 0x100000000 +# error Wrong FF_MIN_GPT setting +# endif +static const BYTE GUID_MS_Basic[16] + = { 0xA2, 0xA0, 0xD0, 0xEB, 0xE5, 0xB9, 0x33, 0x44, + 0x87, 0xC0, 0x68, 0xB6, 0xB7, 0x26, 0x99, 0xC7 }; +#endif + +/*--------------------------------*/ +/* LFN/Directory working buffer */ +/*--------------------------------*/ + +/// Non-LFN configuration +#if FF_USE_LFN == 0 +# if FF_FS_EXFAT +# error LFN must be enabled when enable exFAT +# endif +# define DEF_NAMBUF +# define INIT_NAMBUF(_fs) +# define FREE_NAMBUF() +# define LEAVE_MKFS(_res) return _res + +/// LFN configurations +#else +# if FF_MAX_LFN < 12 || FF_MAX_LFN > 255 +# error Wrong setting of FF_MAX_LFN +# endif +# if FF_LFN_BUF < FF_SFN_BUF || FF_SFN_BUF < 12 +# error Wrong setting of FF_LFN_BUF or FF_SFN_BUF +# endif +# if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3 +# error Wrong setting of FF_LFN_UNICODE +# endif +/// FAT: Offset of LFN characters in the directory entry +static const BYTE LfnOfs[] = { 1, 3, 5, 7, 9, 14, 16, 18, 20, 22, 24, 28, 30 }; +/// exFAT: Size of directory entry block scratchpad buffer needed for the name +/// length +# define MAXDIRB(_nc) ((_nc + 44U) / 15 * SZDIRE) + +/// LFN enabled with static working buffer +# if FF_USE_LFN == 1 +# if FF_FS_EXFAT +/// Directory entry block scratchpad buffer +static BYTE DirBuf[MAXDIRB(FF_MAX_LFN)]; +# endif +/// LFN working buffer +static WCHAR LfnBuf[FF_MAX_LFN + 1]; +# define DEF_NAMBUF +# define INIT_NAMBUF(_fs) +# define FREE_NAMBUF() +# define LEAVE_MKFS(_res) return _res + +/// LFN enabled with dynamic working buffer on the stack +# elif FF_USE_LFN == 2 +# if FF_FS_EXFAT +/// LFN working buffer and directory entry block scratchpad buffer +# define DEF_NAMBUF \ + WCHAR lbuf[FF_MAX_LFN + 1]; \ + BYTE dbuf[MAXDIRB(FF_MAX_LFN)]; +# define INIT_NAMBUF(_fs) \ + { \ + (_fs)->lfnbuf = lbuf; \ + (_fs)->dirbuf = dbuf; \ + } +# define FREE_NAMBUF() +# else +/// LFN working buffer +# define DEF_NAMBUF WCHAR lbuf[FF_MAX_LFN + 1]; +# define INIT_NAMBUF(_fs) \ + { (_fs)->lfnbuf = lbuf; } +# define FREE_NAMBUF() +# endif +# define LEAVE_MKFS(_res) return _res + +/// LFN enabled with dynamic working buffer on the heap +# elif FF_USE_LFN == 3 +# if FF_FS_EXFAT +/// Pointer to LFN working buffer and directory entry block scratchpad buffer +# define DEF_NAMBUF WCHAR* lfn; +# define INIT_NAMBUF(_fs) \ + { \ + lfn = ff_memalloc((FF_MAX_LFN + 1) * 2 \ + + MAXDIRB(FF_MAX_LFN)); \ + if (!lfn) \ + LEAVE_FF(_fs, FR_NOT_ENOUGH_CORE); \ + (_fs)->lfnbuf = lfn; \ + (_fs)->dirbuf = (BYTE*)(lfn + FF_MAX_LFN + 1); \ + } +# define FREE_NAMBUF() ff_memfree(lfn) +# else +/// Pointer to LFN working buffer +# define DEF_NAMBUF WCHAR* lfn; +# define INIT_NAMBUF(_fs) \ + { \ + lfn = ff_memalloc((FF_MAX_LFN + 1) * 2); \ + if (!lfn) \ + LEAVE_FF(_fs, FR_NOT_ENOUGH_CORE); \ + (_fs)->lfnbuf = lfn; \ + } +# define FREE_NAMBUF() ff_memfree(lfn) +# endif +# define LEAVE_MKFS(_res) \ + { \ + if (!work) \ + ff_memfree(buf); \ + return _res; \ + } +/// Must be >=FF_MAX_SS +static constexpr const uint32_t MAX_MALLOC = 0x8000; + +# else +# error Wrong setting of FF_USE_LFN + +/// FF_USE_LFN == 1 +# endif +/// FF_USE_LFN == 0 +#endif + +/*--------------------------------*/ +/* Code conversion tables */ +/*--------------------------------*/ + +/// Run-time code page configuration +#if FF_CODE_PAGE == 0 +# define CODEPAGE CodePage +/// Current code page +static WORD CodePage; +/// Ptr to SBCS up-case table Ct???[] (null:not used) +static const BYTE* ExCvt; +/// Ptr to DBCS code range table Dc???[] (null:not used) +static const BYTE* DbcTbl; + +static const BYTE Ct437[] = TBL_CT437; +static const BYTE Ct720[] = TBL_CT720; +static const BYTE Ct737[] = TBL_CT737; +static const BYTE Ct771[] = TBL_CT771; +static const BYTE Ct775[] = TBL_CT775; +static const BYTE Ct850[] = TBL_CT850; +static const BYTE Ct852[] = TBL_CT852; +static const BYTE Ct855[] = TBL_CT855; +static const BYTE Ct857[] = TBL_CT857; +static const BYTE Ct860[] = TBL_CT860; +static const BYTE Ct861[] = TBL_CT861; +static const BYTE Ct862[] = TBL_CT862; +static const BYTE Ct863[] = TBL_CT863; +static const BYTE Ct864[] = TBL_CT864; +static const BYTE Ct865[] = TBL_CT865; +static const BYTE Ct866[] = TBL_CT866; +static const BYTE Ct869[] = TBL_CT869; +static const BYTE Dc932[] = TBL_DC932; +static const BYTE Dc936[] = TBL_DC936; +static const BYTE Dc949[] = TBL_DC949; +static const BYTE Dc950[] = TBL_DC950; + +/// Static code page configuration (SBCS) +#elif FF_CODE_PAGE < 900 +# define CODEPAGE FF_CODE_PAGE +static constexpr const auto ExCvt = MKCVTBL(TBL_CT, FF_CODE_PAGE); +/// Static code page configuration (DBCS) +#else +# define CODEPAGE FF_CODE_PAGE +static constexpr const auto DbcTbl = MKCVTBL(TBL_DC, FF_CODE_PAGE); + +#endif + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +/*-----------------------------------------------------------------------*/ +/* Load/Store multi-byte word in the FAT structure */ +/*-----------------------------------------------------------------------*/ + +/// Load a 2-byte little-endian word +static WORD ld_word(const BYTE* ptr) { + WORD rv; + + rv = ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +/// Load a 4-byte little-endian word +static DWORD ld_dword(const BYTE* ptr) { + DWORD rv; + + rv = ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} + +#if FF_FS_EXFAT +/// Load an 8-byte little-endian word +static QWORD ld_qword(const BYTE* ptr) { + QWORD rv; + + rv = ptr[7]; + rv = rv << 8 | ptr[6]; + rv = rv << 8 | ptr[5]; + rv = rv << 8 | ptr[4]; + rv = rv << 8 | ptr[3]; + rv = rv << 8 | ptr[2]; + rv = rv << 8 | ptr[1]; + rv = rv << 8 | ptr[0]; + return rv; +} +#endif + +#if !FF_FS_READONLY +/// Store a 2-byte word in little-endian +static void st_word(BYTE* ptr, WORD val) { + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; +} + +/// Store a 4-byte word in little-endian +static void st_dword(BYTE* ptr, DWORD val) { + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; +} + +/// Store an 8-byte word in little-endian +# if FF_FS_EXFAT +static void st_qword(BYTE* ptr, QWORD val) { + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; + val >>= 8; + *ptr++ = (BYTE)val; +} +# endif + +#endif /* !FF_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/// Test if the byte is DBC 1st byte + +static int dbc_1st(BYTE c) { + /// Variable code page +#if FF_CODE_PAGE == 0 + if (DbcTbl && c >= DbcTbl[0]) { + /// 1st byte range 1 + if (c <= DbcTbl[1]) { + return 1; + } + /// 1st byte range 2 + if (c >= DbcTbl[2] && c <= DbcTbl[3]) { + return 1; + } + } + /// DBCS fixed code page +#elif FF_CODE_PAGE >= 900 + if (c >= DbcTbl[0]) { + if (c <= DbcTbl[1]) { + return 1; + } + if (c >= DbcTbl[2] && c <= DbcTbl[3]) { + return 1; + } + } + /// SBCS fixed code page +#else + /// Always false + if (c != 0) { + return 0; + } +#endif + return 0; +} + +/// Test if the byte is DBC 2nd byte + +static int dbc_2nd(BYTE c) { + /// Variable code page +#if FF_CODE_PAGE == 0 + if (DbcTbl && c >= DbcTbl[4]) { + /// 2nd byte range 1 + if (c <= DbcTbl[5]) { + return 1; + } + /// 2nd byte range 2 + if (c >= DbcTbl[6] && c <= DbcTbl[7]) { + return 1; + } + /// 2nd byte range 3 + if (c >= DbcTbl[8] && c <= DbcTbl[9]) { + return 1; + } + } + /// DBCS fixed code page +#elif FF_CODE_PAGE >= 900 + if (c >= DbcTbl[4]) { + if (c <= DbcTbl[5]) { + return 1; + } + if (c >= DbcTbl[6] && c <= DbcTbl[7]) { + return 1; + } + if (c >= DbcTbl[8] && c <= DbcTbl[9]) { + return 1; + } + } + /// SBCS fixed code page +#else + /// Always false + if (c != 0) { + return 0; + } +#endif + return 0; +} + +#if FF_USE_LFN + +/// Get a Unicode code point from the TCHAR string in defined API encodeing + +/// Returns a character in UTF-16 encoding (>=0x10000 on surrogate pair, +/// 0xFFFFFFFF on decode error) +static DWORD tchar2uni( + /// Pointer to pointer to TCHAR string in configured encoding + const TCHAR** str) { + DWORD uc; + const TCHAR* p = *str; + +/// UTF-16 input +# if FF_LFN_UNICODE == 1 + WCHAR wc; + + /// Get a unit + uc = *p++; + /// Surrogate? + if (IsSurrogate(uc)) { + /// Get low surrogate + wc = *p++; + /// Wrong surrogate? + if (!IsSurrogateH(uc) || !IsSurrogateL(wc)) { + return 0xFFFFFFFF; + } + uc = uc << 16 | wc; + } + +/// UTF-8 input +# elif FF_LFN_UNICODE == 2 + BYTE b; + int nf; + + /// Get an encoding unit + uc = (BYTE)*p++; + /// Multiple byte code? + if (uc & 0x80) { + /// 2-byte sequence? + if ((uc & 0xE0) == 0xC0) { + uc &= 0x1F; + nf = 1; + /// 3-byte sequence? + } + else if ((uc & 0xF0) == 0xE0) { + uc &= 0x0F; + nf = 2; + /// 4-byte sequence? + } + else if ((uc & 0xF8) == 0xF0) { + uc &= 0x07; + nf = 3; + /// Wrong sequence + } + else { + return 0xFFFFFFFF; + } + /// Get trailing bytes + do { + b = (BYTE)*p++; + /// Wrong sequence? + if ((b & 0xC0) != 0x80) { + return 0xFFFFFFFF; + } + uc = uc << 6 | (b & 0x3F); + } while (--nf != 0); + /// Wrong code? + if (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) { + return 0xFFFFFFFF; + } + /// Make a surrogate pair if needed + if (uc >= 0x010000) { + uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); + } + } + +/// UTF-32 input +# elif FF_LFN_UNICODE == 3 + /// Get a unit + uc = (TCHAR)*p++; + /// Wrong code? + if (uc >= 0x110000 || IsSurrogate(uc)) { + return 0xFFFFFFFF; + } + /// Make a surrogate pair if needed + if (uc >= 0x010000) { + uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF); + } + +/// ANSI/OEM input +# else + BYTE b; + WCHAR wc; + + /// Get a byte + wc = (BYTE)*p++; + /// Is it a DBC 1st byte? + if (dbc_1st((BYTE)wc)) { + /// Get 2nd byte + b = (BYTE)*p++; + /// Invalid code? + if (!dbc_2nd(b)) { + return 0xFFFFFFFF; + } + /// Make a DBC + wc = (wc << 8) + b; + } + if (wc != 0) { + /// ANSI/OEM ==> Unicode + wc = ff_oem2uni(wc, CODEPAGE); + /// Invalid code? + if (wc == 0) { + return 0xFFFFFFFF; + } + } + uc = wc; + +# endif + /// Next read pointer + *str = p; + return uc; +} + +/// Store a Unicode char in defined API encoding + +/// Returns number of encoding units written (0:buffer overflow or wrong +/// encoding) +static UINT put_utf( + /// UTF-16 encoded character (Surrogate pair if >=0x10000) + DWORD chr, + /// Output buffer + TCHAR* buf, + /// Size of the buffer + UINT szb) { + /// UTF-16 output +# if FF_LFN_UNICODE == 1 + WCHAR hs, wc; + + hs = (WCHAR)(chr >> 16); + wc = (WCHAR)chr; + /// Single encoding unit? + if (hs == 0) { + /// Buffer overflow or wrong code? + if (szb < 1 || IsSurrogate(wc)) { + return 0; + } + *buf = wc; + return 1; + } + /// Buffer overflow or wrong surrogate? + if (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) { + return 0; + } + *buf++ = hs; + *buf++ = wc; + return 2; + +/// UTF-8 output +# elif FF_LFN_UNICODE == 2 + DWORD hc; + + /// Single byte code? + if (chr < 0x80) { + /// Buffer overflow? + if (szb < 1) { + return 0; + } + *buf = (TCHAR)chr; + return 1; + } + /// 2-byte sequence? + if (chr < 0x800) { + /// Buffer overflow? + if (szb < 2) { + return 0; + } + *buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 2; + } + /// 3-byte sequence? + if (chr < 0x10000) { + /// Buffer overflow or wrong code? + if (szb < 3 || IsSurrogate(chr)) { + return 0; + } + *buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 3; + } + /// 4-byte sequence + + /// Buffer overflow? + if (szb < 4) { + return 0; + } + /// Get high 10 bits + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; + /// Get low 10 bits + chr = (chr & 0xFFFF) - 0xDC00; + /// Wrong surrogate? + if (hc >= 0x100000 || chr >= 0x400) { + return 0; + } + chr = (hc | chr) + 0x10000; + *buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07)); + *buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F)); + *buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F)); + return 4; + +/// UTF-32 output +# elif FF_LFN_UNICODE == 3 + DWORD hc; + + /// Buffer overflow? + if (szb < 1) { + return 0; + } + /// Out of BMP? + if (chr >= 0x10000) { + /// Get high 10 bits + hc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6; + /// Get low 10 bits + chr = (chr & 0xFFFF) - 0xDC00; + /// Wrong surrogate? + if (hc >= 0x100000 || chr >= 0x400) { + return 0; + } + chr = (hc | chr) + 0x10000; + } + *buf++ = (TCHAR)chr; + return 1; + +/// ANSI/OEM output +# else + WCHAR wc; + + wc = ff_uni2oem(chr, CODEPAGE); + /// Is this a DBC? + if (wc >= 0x100) { + if (szb < 2) { + return 0; + } + /// Store DBC 1st byte + *buf++ = (char)(wc >> 8); + /// Store DBC 2nd byte + *buf++ = (TCHAR)wc; + return 2; + } + /// Invalid char or buffer overflow? + if (wc == 0 || szb < 1) { + return 0; + } + /// Store the character + *buf++ = (TCHAR)wc; + return 1; +# endif +} +#endif /* FF_USE_LFN */ + +#if FF_FS_REENTRANT +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ + +/// 1:Ok, 0:timeout +static int lock_volume( + /// Filesystem object to lock + FATFS* fs, + /// System lock required + int syslock) { + int rv; + +# if FF_FS_LOCK + /// Lock the volume + rv = ff_mutex_take(fs->ldrv); + /// System lock reqiered? + if (rv && syslock) { + /// Lock the system + rv = ff_mutex_take(FF_VOLUMES); + if (rv) { + /// System lock succeeded + SysLock = 2; + } + else { + /// Failed system lock + ff_mutex_give(fs->ldrv); + } + } +# else + /// Lock the volume (this is to prevent compiler warning) + rv = syslock ? ff_mutex_take(fs->ldrv) : ff_mutex_take(fs->ldrv); +# endif + return rv; +} + +static void unlock_volume( + /// Filesystem object + FATFS* fs, + /// Result code to be returned + FRESULT res) { + if (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE + && res != FR_TIMEOUT) { +# if FF_FS_LOCK + /// Is the system locked? + if (SysLock == 2) { + SysLock = 1; + ff_mutex_give(FF_VOLUMES); + } +# endif + /// Unlock the volume + ff_mutex_give(fs->ldrv); + } +} + +#endif + +#if FF_FS_LOCK +/*-----------------------------------------------------------------------*/ +/* File shareing control functions */ +/*-----------------------------------------------------------------------*/ + +/// Check if the file can be accessed +static FRESULT chk_share( + /// Directory object pointing the file to be checked + DIR* dp, + /// Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or + /// rename) + int acc) { + UINT i, be; + + /// Search open object table for the object + + be = 0; + for (i = 0; i < FF_FS_LOCK; i++) { + /// Existing entry + if (Files[i].fs) { + /// Check if the object matches with an open object + if (Files[i].fs == dp->obj.fs && Files[i].clu == dp->obj.sclust + && Files[i].ofs == dp->dptr) { + break; + } + /// Blank entry + } + else { + be = 1; + } + } + /// The object has not been opened + if (i == FF_FS_LOCK) { + /// Is there a blank entry for new object? + return (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK; + } + + /// The object was opened. Reject any open against writing file and all + /// write mode open + + return (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + +/// Check if an entry is available for a new object +static int enq_share(void) { + UINT i; + + /// Find a free entry + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) + ; + return (i == FF_FS_LOCK) ? 0 : 1; +} + +/// Increment object open counter and returns its index (0:Internal error) +static UINT inc_share( + /// Directory object pointing the file to register or increment + DIR* dp, + /// Desired access (0:Read, 1:Write, 2:Delete/Rename) + int acc) { + UINT i; + + /// Find the object + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs == dp->obj.fs && Files[i].clu == dp->obj.sclust + && Files[i].ofs == dp->dptr) { + break; + } + } + + /// Not opened. Register it as new. + if (i == FF_FS_LOCK) { + /// Find a free entry + for (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) + ; + /// No free entry to register (int err) + if (i == FF_FS_LOCK) { + return 0; + } + Files[i].fs = dp->obj.fs; + Files[i].clu = dp->obj.sclust; + Files[i].ofs = dp->dptr; + Files[i].ctr = 0; + } + + /// Access violation (int err) + if (acc >= 1 && Files[i].ctr) { + return 0; + } + + /// Set semaphore value + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; + + /// Index number origin from 1 + return i + 1; +} + +/// Decrement object open counter +static FRESULT dec_share( + /// Semaphore index (1..) + UINT i) { + UINT n; + FRESULT res; + + /// Index number origin from 0 + if (--i < FF_FS_LOCK) { + n = Files[i].ctr; + /// If write mode open, delete the object semaphore + if (n == 0x100) { + n = 0; + } + /// Decrement read mode open count + if (n > 0) { + n--; + } + Files[i].ctr = n; + /// Delete the object semaphore if open count becomes zero + if (n == 0) { + /// Free the entry << 1, there is a + /// potential error in this process >>> + Files[i].fs = 0; + } + res = FR_OK; + } + else { + /// Invalid index number + res = FR_INT_ERR; + } + return res; +} + +/// Clear all lock entries of the volume +static void clear_share(FATFS* fs) { + UINT i; + + for (i = 0; i < FF_FS_LOCK; i++) { + if (Files[i].fs == fs) { + Files[i].fs = 0; + } + } +} + +#endif /* FF_FS_LOCK */ + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window in the filesystem object */ +/*-----------------------------------------------------------------------*/ +#if !FF_FS_READONLY +/// Returns FR_OK or FR_DISK_ERR +static FRESULT sync_window( + /// Filesystem object + FATFS* fs) { + FRESULT res = FR_OK; + + /// Is the disk access window dirty? + if (fs->wflag) { + /// Write it back into the volume + if (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) { + /// Clear window dirty flag + fs->wflag = 0; + /// Is it in the 1st FAT? + if (fs->winsect - fs->fatbase < fs->fsize) { + /// Reflect it to 2nd FAT if needed + if (fs->n_fats == 2) { + disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1); + } + } + } + else { + res = FR_DISK_ERR; + } + } + return res; +} +#endif + +/// Returns FR_OK or FR_DISK_ERR +static FRESULT move_window( + /// Filesystem object + FATFS* fs, + /// Sector LBA to make appearance in the fs->win[] + LBA_t sect) { + FRESULT res = FR_OK; + + /// Window offset changed? + if (sect != fs->winsect) { +#if !FF_FS_READONLY + /// Flush the window + res = sync_window(fs); +#endif + /// Fill sector window with new data + if (res == FR_OK) { + if (disk_read(fs->pdrv, fs->win, sect, 1) != RES_OK) { + /// Invalidate window if read data is not valid + sect = (LBA_t)0 - 1; + res = FR_DISK_ERR; + } + fs->winsect = sect; + } + } + return res; +} + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Synchronize filesystem and data on the storage */ +/*-----------------------------------------------------------------------*/ + +/// Returns FR_OK or FR_DISK_ERR +static FRESULT sync_fs( + /// Filesystem object + FATFS* fs) { + FRESULT res; + + res = sync_window(fs); + if (res == FR_OK) { + /// FAT32: Update FSInfo sector if needed + if (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) { + /// Create FSInfo structure + + memset(fs->win, 0, sizeof fs->win); + /// Boot signature + st_word(fs->win + BS_55AA, 0xAA55); + /// Leading signature + st_dword(fs->win + FSI_LeadSig, 0x41615252); + /// Structure signature + st_dword(fs->win + FSI_StrucSig, 0x61417272); + /// Number of free clusters + st_dword(fs->win + FSI_Free_Count, fs->free_clst); + /// Last allocated culuster + st_dword(fs->win + FSI_Nxt_Free, fs->last_clst); + /// Write it into the FSInfo sector (Next to VBR) + fs->winsect = fs->volbase + 1; + disk_write(fs->pdrv, fs->win, fs->winsect, 1); + fs->fsi_flag = 0; + } + /// Make sure that no pending write process in the lower layer + + if (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) { + res = FR_DISK_ERR; + } + } + + return res; +} + +#endif + +/*-----------------------------------------------------------------------*/ +/* Get physical sector number from cluster number */ +/*-----------------------------------------------------------------------*/ + +/// !=0:Sector number, 0:Failed (invalid cluster#) +static LBA_t clst2sect( + /// Filesystem object + FATFS* fs, + /// Cluster# to be converted + DWORD clst) { + /// Cluster number is origin from 2 + clst -= 2; + /// Is it invalid cluster number? + if (clst >= fs->n_fatent - 2) { + return 0; + } + /// Start sector number of the cluster + return fs->database + (LBA_t)fs->csize * clst; +} + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of an FAT entry */ +/*-----------------------------------------------------------------------*/ + +/// 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status +static DWORD get_fat( + // Corresponding object + FFOBJID* obj, + // Cluster number to get the value + DWORD clst) { + UINT wc, bc; + DWORD val; + FATFS* fs = obj->fs; + + // Check if in valid range + if (clst < 2 || clst >= fs->n_fatent) { + // Internal error + val = 1; + } + else { + // Default value falls on disk error + val = 0xFFFFFFFF; + + switch (fs->fs_type) { + case FS_FAT12: + bc = (UINT)clst; + bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) { + break; + } + // Get 1st byte of the entry + wc = fs->win[bc++ % SS(fs)]; + if (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) { + break; + } + // Merge 2nd byte of the entry + wc |= fs->win[bc % SS(fs)] << 8; + // Adjust bit position + val = (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + break; + + case FS_FAT16: + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) + != FR_OK) { + break; + } + // Simple WORD array + val = ld_word(fs->win + clst * 2 % SS(fs)); + break; + + case FS_FAT32: + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) + != FR_OK) { + break; + } + // Simple DWORD array but mask out upper 4 bits + val = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF; + break; +#if FF_FS_EXFAT + case FS_EXFAT: + // Object except root dir must have valid data length + if ((obj->objsize != 0 && obj->sclust != 0) || obj->stat == 0) { + // Offset from start cluster + DWORD cofs = clst - obj->sclust; + // Number of clusters - 1 + DWORD clen = (DWORD)((LBA_t)((obj->objsize - 1) / SS(fs)) + / fs->csize); + + // Is it a contiguous chain? + if (obj->stat == 2 && cofs <= clen) { + // No data on the FAT, generate the value + val = (cofs == clen) ? 0x7FFFFFFF : clst + 1; + break; + } + // Is it in the 1st fragment? + if (obj->stat == 3 && cofs < obj->n_cont) { + // Generate the value + val = clst + 1; + break; + } + // Get value from FAT if FAT chain is valid + if (obj->stat != 2) { + // Is it on the growing edge? + if (obj->n_frag != 0) { + // Generate EOC + val = 0x7FFFFFFF; + } + else { + if (move_window(fs, + fs->fatbase + (clst / (SS(fs) / 4))) + != FR_OK) { + break; + } + val = ld_dword(fs->win + clst * 4 % SS(fs)) + & 0x7FFFFFFF; + } + break; + } + } + // Internal error + val = 1; + break; +#endif + default: + // Internal error + val = 1; + } + } + + return val; +} + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of an FAT entry */ +/*-----------------------------------------------------------------------*/ + +static FRESULT put_fat(FATFS* fs, + // FR_OK(0):succeeded, !=0:error + DWORD clst, + // Corresponding filesystem object + DWORD val + // FAT index number (cluster number) to be changed + ) +// New value to be set to the entry +{ + UINT bc; + BYTE* p; + FRESULT res = FR_INT_ERR; + + if (clst >= 2 && clst < fs->n_fatent) { + switch (fs->fs_type) { + // Check if in valid range + case FS_FAT12: + bc = (UINT)clst; + bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + // bc: byte offset of the entry + if (res != FR_OK) { + break; + } + p = fs->win + bc++ % SS(fs); + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + fs->wflag = 1; + // Update 1st byte + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) { + break; + } + p = fs->win + bc % SS(fs); + *p = (clst & 1) ? (BYTE)(val >> 4) + : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + fs->wflag = 1; + // Update 2nd byte + break; + + case FS_FAT16: + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) { + break; + } + st_word(fs->win + clst * 2 % SS(fs), (WORD)val); + fs->wflag = 1; + // Simple WORD array + break; + + case FS_FAT32: +# if FF_FS_EXFAT + case FS_EXFAT: +# endif + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) { + break; + } + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + val = (val & 0x0FFFFFFF) + | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000); + } + st_dword(fs->win + clst * 4 % SS(fs), val); + fs->wflag = 1; + break; + } + } + return res; +} + +#endif /* !FF_FS_READONLY */ + +#if FF_FS_EXFAT && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* exFAT: Accessing FAT and Allocation Bitmap */ +/*-----------------------------------------------------------------------*/ + +/*--------------------------------------*/ +/* Find a contiguous free cluster block */ +/*--------------------------------------*/ + +// 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error +static DWORD find_bitmap( + // Filesystem object + FATFS* fs, + // Cluster number to scan from + DWORD clst, + // Number of contiguous clusters to find (1..) + DWORD ncl) { + BYTE bm, bv; + UINT i; + DWORD val, scl, ctr; + + // The first bit in the bitmap corresponds to cluster #2 + clst -= 2; + if (clst >= fs->n_fatent - 2) { + clst = 0; + } + scl = val = clst; + ctr = 0; + for (;;) { + if (move_window(fs, fs->bitbase + val / 8 / SS(fs)) != FR_OK) { + return 0xFFFFFFFF; + } + i = val / 8 % SS(fs); + bm = 1 << (val % 8); + do { + do { + // Get bit value + bv = fs->win[i] & bm; + bm <<= 1; + // Next cluster (with wrap-around) + if (++val >= fs->n_fatent - 2) { + val = 0; + bm = 0; + i = SS(fs); + } + // Is it a free cluster? + if (bv == 0) { + // Check if run length is sufficient for required + if (++ctr == ncl) { + return scl + 2; + } + } + else { + // Encountered a cluster in-use, restart to scan + scl = val; + ctr = 0; + } + // All cluster scanned? + if (val == clst) { + return 0; + } + } while (bm != 0); + bm = 1; + } while (++i < SS(fs)); + } +} + +/*----------------------------------------*/ +/* Set/Clear a block of allocation bitmap */ +/*----------------------------------------*/ + +static FRESULT change_bitmap( + // Filesystem object + FATFS* fs, + // Cluster number to change from + DWORD clst, + // Number of clusters to be changed + DWORD ncl, + // bit value to be set (0 or 1) + int bv) { + BYTE bm; + UINT i; + LBA_t sect; + + // The first bit corresponds to cluster #2 + clst -= 2; + // Sector address + sect = fs->bitbase + clst / 8 / SS(fs); + // Byte offset in the sector + i = clst / 8 % SS(fs); + // Bit mask in the byte + bm = 1 << (clst % 8); + for (;;) { + if (move_window(fs, sect++) != FR_OK) { + return FR_DISK_ERR; + } + do { + do { + // Is the bit expected value? + if (bv == (int)((fs->win[i] & bm) != 0)) { + return FR_INT_ERR; + } + // Flip the bit + fs->win[i] ^= bm; + fs->wflag = 1; + // All bits processed? + if (--ncl == 0) { + return FR_OK; + } + // Next bit + } while (bm <<= 1); + bm = 1; + // Next byte + } while (++i < SS(fs)); + i = 0; + } +} + +/*---------------------------------------------*/ +/* Fill the first fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_first_frag( + // Pointer to the corresponding object + FFOBJID* obj) { + FRESULT res; + DWORD cl, n; + + // Has the object been changed 'fragmented' in this session? + if (obj->stat == 3) { + // Create cluster chain on the FAT + for (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) { + res = put_fat(obj->fs, cl, cl + 1); + if (res != FR_OK) { + return res; + } + } + // Change status 'FAT chain is valid' + obj->stat = 0; + } + return FR_OK; +} + +/*---------------------------------------------*/ +/* Fill the last fragment of the FAT chain */ +/*---------------------------------------------*/ + +static FRESULT fill_last_frag( + // Pointer to the corresponding object + FFOBJID* obj, + // Last cluster of the fragment + DWORD lcl, + // Value to set the last FAT entry + DWORD term) { + FRESULT res; + + // Create the chain of last fragment + while (obj->n_frag > 0) { + res = put_fat(obj->fs, lcl - obj->n_frag + 1, + (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term); + if (res != FR_OK) { + return res; + } + obj->n_frag--; + } + return FR_OK; +} + +#endif /* FF_FS_EXFAT && !FF_FS_READONLY */ + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ + +// FR_OK(0):succeeded, !=0:error +static FRESULT remove_chain( + // Corresponding object + FFOBJID* obj, + // Cluster to remove a chain from + DWORD clst, + // Previous cluster of clst (0 if entire chain) + DWORD pclst) { + FRESULT res = FR_OK; + DWORD nxt; + FATFS* fs = obj->fs; +# if FF_FS_EXFAT || FF_USE_TRIM + DWORD scl = clst, ecl = clst; +# endif +# if FF_USE_TRIM + LBA_t rt[2]; +# endif + + // Check if in valid range + if (clst < 2 || clst >= fs->n_fatent) { + return FR_INT_ERR; + } + + // Mark the previous cluster 'EOC' on the FAT if it exists + + if (pclst != 0 + && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) { + res = put_fat(fs, pclst, 0xFFFFFFFF); + if (res != FR_OK) { + return res; + } + } + + // Remove the chain + + do { + // Get cluster status + nxt = get_fat(obj, clst); + // Empty cluster? + if (nxt == 0) { + break; + } + // Internal error? + if (nxt == 1) { + return FR_INT_ERR; + } + // Disk error? + if (nxt == 0xFFFFFFFF) { + return FR_DISK_ERR; + } + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + // Mark the cluster 'free' on the FAT + res = put_fat(fs, clst, 0); + if (res != FR_OK) { + return res; + } + } + // Update FSINFO + if (fs->free_clst < fs->n_fatent - 2) { + fs->free_clst++; + fs->fsi_flag |= 1; + } +# if FF_FS_EXFAT || FF_USE_TRIM + // Is next cluster contiguous? + if (ecl + 1 == nxt) { + ecl = nxt; + // End of contiguous cluster block + } + else { +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Mark the cluster block 'free' on the bitmap + res = change_bitmap(fs, scl, ecl - scl + 1, 0); + if (res != FR_OK) { + return res; + } + } +# endif +# if FF_USE_TRIM + // Start of data area to be freed + rt[0] = clst2sect(fs, scl); + // End of data area to be freed + rt[1] = clst2sect(fs, ecl) + fs->csize - 1; + // Inform storage device that the data in the block may be erased + disk_ioctl(fs->pdrv, CTRL_TRIM, rt); +# endif + scl = ecl = nxt; + } +# endif + // Next cluster + clst = nxt; + // Repeat while not the last link + } while (clst < fs->n_fatent); + +# if FF_FS_EXFAT + // Some post processes for chain status + + if (fs->fs_type == FS_EXFAT) { + // Has the entire chain been removed? + if (pclst == 0) { + // Change the chain status 'initial' + obj->stat = 0; + } + else { + // Is it a fragmented chain from the beginning of this session? + if (obj->stat == 0) { + // Follow the chain to check if it gets contiguous + clst = obj->sclust; + while (clst != pclst) { + nxt = get_fat(obj, clst); + if (nxt < 2) { + return FR_INT_ERR; + } + if (nxt == 0xFFFFFFFF) { + return FR_DISK_ERR; + } + // Not contiguous? + if (nxt != clst + 1) { + break; + } + clst++; + } + // Has the chain got contiguous again? + if (clst == pclst) { + // Change the chain status 'contiguous' + obj->stat = 2; + } + } + else { + // Was the chain fragmented in this session and got contiguous + // again? + if (obj->stat == 3 && pclst >= obj->sclust + && pclst <= obj->sclust + obj->n_cont) { + // Change the chain status 'contiguous' + obj->stat = 2; + } + } + } + } +# endif + return FR_OK; +} + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch a chain or Create a new chain */ +/*-----------------------------------------------------------------------*/ + +// 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# +static DWORD create_chain( + // Corresponding object + FFOBJID* obj, + // Cluster# to stretch, 0:Create a new chain + DWORD clst) { + DWORD cs, ncl, scl; + FRESULT res; + FATFS* fs = obj->fs; + + // Create a new chain + if (clst == 0) { + // Suggested cluster to start to find + scl = fs->last_clst; + if (scl == 0 || scl >= fs->n_fatent) { + scl = 1; + } + } + // Stretch a chain + else { + // Check the cluster status + cs = get_fat(obj, clst); + // Test for insanity + if (cs < 2) { + return 1; + } + // Test for disk error + if (cs == 0xFFFFFFFF) { + return cs; + } + // It is already followed by next cluster + if (cs < fs->n_fatent) { + return cs; + } + // Cluster to start to find + scl = clst; + } + // No free cluster + if (fs->free_clst == 0) { + return 0; + } + +# if FF_FS_EXFAT + // On the exFAT volume + if (fs->fs_type == FS_EXFAT) { + // Find a free cluster + ncl = find_bitmap(fs, scl, 1); + // No free cluster or hard error? + if (ncl == 0 || ncl == 0xFFFFFFFF) { + return ncl; + } + // Mark the cluster 'in use' + res = change_bitmap(fs, ncl, 1, 1); + if (res == FR_INT_ERR) { + return 1; + } + if (res == FR_DISK_ERR) { + return 0xFFFFFFFF; + } + // Is it a new chain? + if (clst == 0) { + // Set status 'contiguous' + obj->stat = 2; + // It is a stretched chain + } + else { + // Is the chain got fragmented? + if (obj->stat == 2 && ncl != scl + 1) { + // Set size of the contiguous part + obj->n_cont = scl - obj->sclust; + // Change status 'just fragmented' + obj->stat = 3; + } + } + // Is the file non-contiguous? + if (obj->stat != 2) { + // Is the cluster next to previous one? + if (ncl == clst + 1) { + // Increment size of last framgent + obj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2; + // New fragment + } + else { + if (obj->n_frag == 0) { + obj->n_frag = 1; + } + // Fill last fragment on the FAT and link it to new one + res = fill_last_frag(obj, clst, ncl); + if (res == FR_OK) { + obj->n_frag = 1; + } + } + } + } + else +# endif + // On the FAT/FAT32 volume + { + ncl = 0; + // Stretching an existing chain? + if (scl == clst) { + // Test if next cluster is free + ncl = scl + 1; + if (ncl >= fs->n_fatent) { + ncl = 2; + } + // Get next cluster status + cs = get_fat(obj, ncl); + // Test for error + if (cs == 1 || cs == 0xFFFFFFFF) { + return cs; + } + // Not free? + if (cs != 0) { + // Start at suggested cluster if it is valid + cs = fs->last_clst; + if (cs >= 2 && cs < fs->n_fatent) { + scl = cs; + } + ncl = 0; + } + } + // The new cluster cannot be contiguous and find another fragment + if (ncl == 0) { + // Start cluster + ncl = scl; + for (;;) { + // Next cluster + ncl++; + // Check wrap-around + if (ncl >= fs->n_fatent) { + ncl = 2; + // No free cluster found? + if (ncl > scl) { + return 0; + } + } + // Get the cluster status + cs = get_fat(obj, ncl); + // Found a free cluster? + if (cs == 0) { + break; + } + // Test for error + if (cs == 1 || cs == 0xFFFFFFFF) { + return cs; + } + // No free cluster found? + if (ncl == scl) { + return 0; + } + } + } + // Mark the new cluster 'EOC' + res = put_fat(fs, ncl, 0xFFFFFFFF); + if (res == FR_OK && clst != 0) { + // Link it from the previous one if needed + res = put_fat(fs, clst, ncl); + } + } + + // Update FSINFO if function succeeded. + if (res == FR_OK) { + fs->last_clst = ncl; + if (fs->free_clst <= fs->n_fatent - 2) { + fs->free_clst--; + } + fs->fsi_flag |= 1; + } + else { + // Failed. Generate error status + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; + } + + // Return new cluster number or error status + return ncl; +} + +#endif /* !FF_FS_READONLY */ + +#if FF_USE_FASTSEEK +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +// <2:Error, >=2:Cluster number +static DWORD clmt_clust( + // Pointer to the file object + FIL* fp, + // File offset to be converted to cluster# + FSIZE_t ofs) { + DWORD cl, ncl; + DWORD* tbl; + FATFS* fs = fp->obj.fs; + + // Top of CLMT + tbl = fp->cltbl + 1; + // Cluster order from top of the file + cl = (DWORD)(ofs / SS(fs) / fs->csize); + for (;;) { + // Number of cluters in the fragment + ncl = *tbl++; + // End of table? (error) + if (ncl == 0) { + return 0; + } + // In this fragment? + if (cl < ncl) { + break; + } + // Next fragment + cl -= ncl; + tbl++; + } + // Return the cluster number + return cl + *tbl; +} + +#endif /* FF_USE_FASTSEEK */ + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Fill a cluster with zeros */ +/*-----------------------------------------------------------------------*/ + +#if !FF_FS_READONLY +// Returns FR_OK or FR_DISK_ERR +static FRESULT dir_clear( + // Filesystem object + FATFS* fs, + // Directory table to clear + DWORD clst) { + LBA_t sect; + UINT n, szb; + BYTE* ibuf; + + // Flush disk access window + if (sync_window(fs) != FR_OK) { + return FR_DISK_ERR; + } + // Top of the cluster + sect = clst2sect(fs, clst); + // Set window to top of the cluster + fs->winsect = sect; + // Clear window buffer + memset(fs->win, 0, sizeof fs->win); + // Quick table clear by using multi-secter write +# if FF_USE_LFN == 3 + // Allocate a temporary buffer + + for (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC + : fs->csize * SS(fs), + ibuf = 0; + szb > SS(fs) && (ibuf = ff_memalloc(szb)) == 0; szb /= 2) + ; + // Buffer allocated? + if (szb > SS(fs)) { + memset(ibuf, 0, szb); + // Bytes -> Sectors + szb /= SS(fs); + // Fill the cluster with 0 + for (n = 0; n < fs->csize + && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; + n += szb) + ; + ff_memfree(ibuf); + } + else +# endif + { + // Use window buffer (many single-sector writes may take a time) + ibuf = fs->win; + szb = 1; + // Fill the cluster with 0 + for (n = 0; n < fs->csize + && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; + n += szb) + ; + } + return (n == fs->csize) ? FR_OK : FR_DISK_ERR; +} +#endif /* !FF_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +// FR_OK(0):succeeded, !=0:error +static FRESULT dir_sdi( + // Pointer to directory object + DIR* dp, + // Offset of directory table + DWORD ofs) { + DWORD csz, clst; + FATFS* fs = dp->obj.fs; + + // Check range of offset and alignment + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX + : MAX_DIR) + || ofs % SZDIRE) { + return FR_INT_ERR; + } + // Set current offset + dp->dptr = ofs; + // Table start cluster (0:root) + clst = dp->obj.sclust; + // Replace cluster# 0 with root cluster# + if (clst == 0 && fs->fs_type >= FS_FAT32) { + clst = (DWORD)fs->dirbase; + // exFAT: Root dir has an FAT chain + if (FF_FS_EXFAT) { + dp->obj.stat = 0; + } + } + + // Static table (root-directory on the FAT volume) + if (clst == 0) { + // Is index out of range? + if (ofs / SZDIRE >= fs->n_rootdir) { + return FR_INT_ERR; + } + dp->sect = fs->dirbase; + + // Dynamic table (sub-directory or root-directory on the FAT32/exFAT + // volume) + } + else { + // Bytes per cluster + csz = (DWORD)fs->csize * SS(fs); + // Follow cluster chain + while (ofs >= csz) { + // Get next cluster + clst = get_fat(&dp->obj, clst); + // Disk error + if (clst == 0xFFFFFFFF) { + return FR_DISK_ERR; + } + // Reached to end of table or internal error + if (clst < 2 || clst >= fs->n_fatent) { + return FR_INT_ERR; + } + ofs -= csz; + } + dp->sect = clst2sect(fs, clst); + } + // Current cluster# + dp->clust = clst; + if (dp->sect == 0) { + return FR_INT_ERR; + } + // Sector# of the directory entry + dp->sect += ofs / SS(fs); + // Pointer to the entry in the win[] + dp->dir = fs->win + (ofs % SS(fs)); + + return FR_OK; +} + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +// FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch +static FRESULT dir_next( + // Pointer to the directory object + DIR* dp, + // 0: Do not stretch table, 1: Stretch table if needed + int stretch) { + DWORD ofs, clst; + FATFS* fs = dp->obj.fs; + + // Next entry + ofs = dp->dptr + SZDIRE; + // Disable it if the offset reached the max value + if (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX + : MAX_DIR)) { + dp->sect = 0; + } + // Report EOT if it has been disabled + if (dp->sect == 0) { + return FR_NO_FILE; + } + + // Sector changed? + if (ofs % SS(fs) == 0) { + // Next sector + dp->sect++; + + // Static table + if (dp->clust == 0) { + // Report EOT if it reached end of static table + if (ofs / SZDIRE >= fs->n_rootdir) { + dp->sect = 0; + return FR_NO_FILE; + } + } + // Dynamic table + else { + // Cluster changed? + if ((ofs / SS(fs) & (fs->csize - 1)) == 0) { + // Get next cluster + clst = get_fat(&dp->obj, dp->clust); + // Internal error + if (clst <= 1) { + return FR_INT_ERR; + } + // Disk error + if (clst == 0xFFFFFFFF) { + return FR_DISK_ERR; + } + // It reached end of dynamic table + if (clst >= fs->n_fatent) { +#if !FF_FS_READONLY + // If no stretch, report EOT + if (!stretch) { + dp->sect = 0; + return FR_NO_FILE; + } + // Allocate a cluster + clst = create_chain(&dp->obj, dp->clust); + // No free cluster + if (clst == 0) { + return FR_DENIED; + } + // Internal error + if (clst == 1) { + return FR_INT_ERR; + } + // Disk error + if (clst == 0xFFFFFFFF) { + return FR_DISK_ERR; + } + // Clean up the stretched table + if (dir_clear(fs, clst) != FR_OK) { + return FR_DISK_ERR; + } + // exFAT: The directory has been stretched + if (FF_FS_EXFAT) { + dp->obj.stat |= 4; + } +#else + // (this line is to suppress compiler warning) + if (!stretch) { + dp->sect = 0; + } + // Report EOT + dp->sect = 0; + return FR_NO_FILE; +#endif + } + // Initialize data for new cluster + dp->clust = clst; + dp->sect = clst2sect(fs, clst); + } + } + } + // Current entry + dp->dptr = ofs; + // Pointer to the entry in the win[] + dp->dir = fs->win + ofs % SS(fs); + + return FR_OK; +} + +#if !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve a block of directory entries */ +/*-----------------------------------------------------------------------*/ + +// FR_OK(0):succeeded, !=0:error +static FRESULT dir_alloc( + // Pointer to the directory object + DIR* dp, + // Number of contiguous entries to allocate + UINT n_ent) { + FRESULT res; + UINT n; + FATFS* fs = dp->obj.fs; + + res = dir_sdi(dp, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) { + break; + } +# if FF_FS_EXFAT + // Is the entry free? + if ((fs->fs_type == FS_EXFAT) + ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) + : (int)(dp->dir[DIR_Name] == DDEM + || dp->dir[DIR_Name] == 0)) { +# else + // Is the entry free? + if (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) { +# endif + // Is a block of contiguous free entries found? + if (++n == n_ent) { + break; + } + } + else { + // Not a free entry, restart to search + n = 0; + } + // Next entry with table stretch enabled + res = dir_next(dp, 1); + } while (res == FR_OK); + } + + // No directory entry to allocate + if (res == FR_NO_FILE) { + res = FR_DENIED; + } + return res; +} + +#endif /* !FF_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ +/* FAT: Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +// Returns the top cluster value of the SFN entry +static DWORD ld_clust( + // Pointer to the fs object + FATFS* fs, + // Pointer to the key entry + const BYTE* dir) { + DWORD cl; + + cl = ld_word(dir + DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) { + cl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16; + } + + return cl; +} + +#if !FF_FS_READONLY +static void st_clust( + // Pointer to the fs object + FATFS* fs, + // Pointer to the key entry + BYTE* dir, + // Value to be set + DWORD cl) { + st_word(dir + DIR_FstClusLO, (WORD)cl); + if (fs->fs_type == FS_FAT32) { + st_word(dir + DIR_FstClusHI, (WORD)(cl >> 16)); + } +} +#endif + +#if FF_USE_LFN +/*--------------------------------------------------------*/ +/* FAT-LFN: Compare a part of file name with an LFN entry */ +/*--------------------------------------------------------*/ + +// 1:matched, 0:not matched +static int cmp_lfn( + // Pointer to the LFN working buffer to be compared + const WCHAR* lfnbuf, + // Pointer to the directory entry containing the part of LFN + BYTE* dir) { + UINT i, s; + WCHAR wc, uc; + + // Check LDIR_FstClusLO + if (ld_word(dir + LDIR_FstClusLO) != 0) { + return 0; + } + + // Offset in the LFN buffer + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; + + // Process all characters in the entry + for (wc = 1, s = 0; s < 13; s++) { + // Pick an LFN character + uc = ld_word(dir + LfnOfs[s]); + if (wc != 0) { + // Compare it + if (i >= FF_MAX_LFN + 1 + || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) { + // Not matched + return 0; + } + wc = uc; + } + else { + // Check filler + if (uc != 0xFFFF) { + return 0; + } + } + } + + // Last segment matched but different length + if ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) { + return 0; + } + + // The part of LFN matched + return 1; +} + +# if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------*/ +/* FAT-LFN: Pick a part of file name from an LFN entry */ +/*-----------------------------------------------------*/ + +// 1:succeeded, 0:buffer overflow or invalid LFN entry +static int pick_lfn( + // Pointer to the LFN working buffer + WCHAR* lfnbuf, + // Pointer to the LFN entry + BYTE* dir) { + UINT i, s; + WCHAR wc, uc; + + // Check LDIR_FstClusLO is 0 + if (ld_word(dir + LDIR_FstClusLO) != 0) { + return 0; + } + + // Offset in the LFN buffer + i = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13; + + // Process all characters in the entry + for (wc = 1, s = 0; s < 13; s++) { + // Pick an LFN character + uc = ld_word(dir + LfnOfs[s]); + if (wc != 0) { + // Buffer overflow? + if (i >= FF_MAX_LFN + 1) { + return 0; + } + // Store it + lfnbuf[i++] = wc = uc; + } + else { + // Check filler + if (uc != 0xFFFF) { + return 0; + } + } + } + + // Put terminator if it is the last LFN part and not terminated + if (dir[LDIR_Ord] & LLEF && wc != 0) { + // Buffer overflow? + if (i >= FF_MAX_LFN + 1) { + return 0; + } + lfnbuf[i] = 0; + } + + // The part of LFN is valid + return 1; +} +# endif + +# if !FF_FS_READONLY +/*-----------------------------------------*/ +/* FAT-LFN: Create an entry of LFN entries */ +/*-----------------------------------------*/ + +static void put_lfn( + // Pointer to the LFN + const WCHAR* lfn, + // Pointer to the LFN entry to be created + BYTE* dir, + // LFN order (1-20) + BYTE ord, + // Checksum of the corresponding SFN + BYTE sum) { + UINT i, s; + WCHAR wc; + + // Set checksum + dir[LDIR_Chksum] = sum; + // Set attribute. LFN entry + dir[LDIR_Attr] = AM_LFN; + dir[LDIR_Type] = 0; + st_word(dir + LDIR_FstClusLO, 0); + + // Get offset in the LFN working buffer + i = (ord - 1) * 13; + s = wc = 0; + do { + // Get an effective character + if (wc != 0xFFFF) { + wc = lfn[i++]; + } + // Put it + st_word(dir + LfnOfs[s], wc); + // Padding characters for following items + if (wc == 0) { + wc = 0xFFFF; + } + } while (++s < 13); + // Last LFN part is the start of LFN sequence + if (wc == 0xFFFF || !lfn[i]) { + ord |= LLEF; + } + // Set the LFN order + dir[LDIR_Ord] = ord; +} + +# endif /* !FF_FS_READONLY */ +#endif /* FF_USE_LFN */ + +#if FF_USE_LFN && !FF_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Create a Numbered SFN */ +/*-----------------------------------------------------------------------*/ + +static void gen_numname( + // Pointer to the buffer to store numbered SFN + BYTE* dst, + // Pointer to SFN in directory form + const BYTE* src, + // Pointer to LFN + const WCHAR* lfn, + // Sequence number + UINT seq) { + BYTE ns[8], c; + UINT i, j; + WCHAR wc; + DWORD sreg; + + // Prepare the SFN to be modified + memcpy(dst, src, 11); + + // In case of many collisions, generate a hash number instead of sequential + // number + if (seq > 5) { + sreg = seq; + // Create a CRC as hash value + while (*lfn) { + wc = *lfn++; + for (i = 0; i < 16; i++) { + sreg = (sreg << 1) + (wc & 1); + wc >>= 1; + if (sreg & 0x10000) { + sreg ^= 0x11021; + } + } + } + seq = (UINT)sreg; + } + + // Make suffix (~ + hexadecimal) + + i = 7; + do { + c = (BYTE)((seq % 16) + '0'); + seq /= 16; + if (c > '9') { + c += 7; + } + ns[i--] = c; + } while (i && seq); + ns[i] = '~'; + + // Append the suffix to the SFN body + + // Find the offset to append + for (j = 0; j < i && dst[j] != ' '; j++) { + // To avoid DBC break up + if (dbc_1st(dst[j])) { + if (j == i - 1) { + break; + } + j++; + } + } + // Append the suffix + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif /* FF_USE_LFN && !FF_FS_READONLY */ + +#if FF_USE_LFN +/*-----------------------------------------------------------------------*/ +/* FAT-LFN: Calculate checksum of an SFN entry */ +/*-----------------------------------------------------------------------*/ + +static BYTE sum_sfn( + // Pointer to the SFN entry + const BYTE* dir) { + BYTE sum = 0; + UINT n = 11; + + do { + sum = (sum >> 1) + (sum << 7) + *dir++; + } while (--n); + return sum; +} + +#endif /* FF_USE_LFN */ + +#if FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* exFAT: Checksum */ +/*-----------------------------------------------------------------------*/ + +// Get checksum of the directoly entry block +static WORD xdir_sum( + // Directory entry block to be calculated + const BYTE* dir) { + UINT i, szblk; + WORD sum; + + // Number of bytes of the entry block + szblk = (dir[XDIR_NumSec] + 1) * SZDIRE; + for (i = sum = 0; i < szblk; i++) { + // Skip 2-byte sum field + if (i == XDIR_SetSum) { + i++; + } + else { + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i]; + } + } + return sum; +} + +// Get check sum (to be used as hash) of the file name +static WORD xname_sum( + // File name to be calculated + const WCHAR* name) { + WCHAR chr; + WORD sum = 0; + + while ((chr = *name++) != 0) { + // File name needs to be up-case converted + chr = (WCHAR)ff_wtoupper(chr); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF); + sum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8); + } + return sum; +} + +# if !FF_FS_READONLY && FF_USE_MKFS +// Returns 32-bit checksum +static DWORD xsum32( + // Byte to be calculated (byte-by-byte processing) + BYTE dat, + // Previous sum value + DWORD sum) { + sum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat; + return sum; +} +# endif + +/*------------------------------------*/ +/* exFAT: Get a directory entry block */ +/*------------------------------------*/ + +// FR_INT_ERR: invalid entry block +static FRESULT load_xdir( + // Reading directory object pointing top of the entry block to load + DIR* dp) { + FRESULT res; + UINT i, sz_ent; + // Pointer to the on-memory directory entry block 85+C0+C1s + BYTE* dirb = dp->obj.fs->dirbuf; + + // Load file directory entry + + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) { + return res; + } + // Invalid order + if (dp->dir[XDIR_Type] != ET_FILEDIR) { + return FR_INT_ERR; + } + memcpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE); + sz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE; + if (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) { + return FR_INT_ERR; + } + + // Load stream extension entry + + res = dir_next(dp, 0); + // It cannot be + if (res == FR_NO_FILE) { + res = FR_INT_ERR; + } + if (res != FR_OK) { + return res; + } + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) { + return res; + } + // Invalid order + if (dp->dir[XDIR_Type] != ET_STREAM) { + return FR_INT_ERR; + } + memcpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE); + if (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) { + return FR_INT_ERR; + } + + // Load file name entries + + // Name offset to load + i = 2 * SZDIRE; + do { + res = dir_next(dp, 0); + // It cannot be + if (res == FR_NO_FILE) { + res = FR_INT_ERR; + } + if (res != FR_OK) { + return res; + } + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) { + return res; + } + // Invalid order + if (dp->dir[XDIR_Type] != ET_FILENAME) { + return FR_INT_ERR; + } + if (i < MAXDIRB(FF_MAX_LFN)) { + memcpy(dirb + i, dp->dir, SZDIRE); + } + } while ((i += SZDIRE) < sz_ent); + + // Sanity check (do it for only accessible object) + + if (i <= MAXDIRB(FF_MAX_LFN)) { + if (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) { + return FR_INT_ERR; + } + } + return FR_OK; +} + +/*------------------------------------------------------------------*/ +/* exFAT: Initialize object allocation info with loaded entry block */ +/*------------------------------------------------------------------*/ + +static void init_alloc_info( + // Filesystem object + FATFS* fs, + // Object allocation information to be initialized + FFOBJID* obj) { + // Start cluster + obj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus); + // Size + obj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize); + // Allocation status + obj->stat = fs->dirbuf[XDIR_GenFlags] & 2; + // No last fragment info + obj->n_frag = 0; +} + +# if !FF_FS_READONLY || FF_FS_RPATH != 0 +/*------------------------------------------------*/ +/* exFAT: Load the object's directory entry block */ +/*------------------------------------------------*/ + +static FRESULT load_obj_xdir( + // Blank directory object to be used to access containing directory + DIR* dp, + // Object with its containing directory information + const FFOBJID* obj) { + FRESULT res; + + // Open object containing directory + + dp->obj.fs = obj->fs; + dp->obj.sclust = obj->c_scl; + dp->obj.stat = (BYTE)obj->c_size; + dp->obj.objsize = obj->c_size & 0xFFFFFF00; + dp->obj.n_frag = 0; + dp->blk_ofs = obj->c_ofs; + + // Goto object's entry block + res = dir_sdi(dp, dp->blk_ofs); + if (res == FR_OK) { + // Load the object's entry block + res = load_xdir(dp); + } + return res; +} +# endif + +# if !FF_FS_READONLY +//---------------------------------------- + +// exFAT: Store the directory entry block + +//---------------------------------------- + +static FRESULT store_xdir( + // Pointer to the directory object + DIR* dp) { + FRESULT res; + UINT nent; + // Pointer to the directory entry block 85+C0+C1s + BYTE* dirb = dp->obj.fs->dirbuf; + + // Create set sum + + st_word(dirb + XDIR_SetSum, xdir_sum(dirb)); + nent = dirb[XDIR_NumSec] + 1; + + // Store the directory entry block to the directory + + res = dir_sdi(dp, dp->blk_ofs); + while (res == FR_OK) { + res = move_window(dp->obj.fs, dp->sect); + if (res != FR_OK) { + break; + } + memcpy(dp->dir, dirb, SZDIRE); + dp->obj.fs->wflag = 1; + if (--nent == 0) { + break; + } + dirb += SZDIRE; + res = dir_next(dp, 0); + } + return (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR; +} + +//------------------------------------------- + +// exFAT: Create a new directory entry block + +//------------------------------------------- + +static void create_xdir( + // Pointer to the directory entry block buffer + BYTE* dirb, + // Pointer to the object name + const WCHAR* lfn) { + UINT i; + BYTE nc1, nlen; + WCHAR wc; + + // Create file-directory and stream-extension entry + + memset(dirb, 0, 2 * SZDIRE); + dirb[0 * SZDIRE + XDIR_Type] = ET_FILEDIR; + dirb[1 * SZDIRE + XDIR_Type] = ET_STREAM; + + // Create file-name entries + + // Top of file_name entries + i = SZDIRE * 2; + nlen = nc1 = 0; + wc = 1; + do { + dirb[i++] = ET_FILENAME; + dirb[i++] = 0; + // Fill name field + do { + // Get a character if exist + if (wc != 0 && (wc = lfn[nlen]) != 0) { + nlen++; + } + // Store it + st_word(dirb + i, wc); + i += 2; + } while (i % SZDIRE != 0); + nc1++; + // Fill next entry if any char follows + } while (lfn[nlen]); + + // Set name length + dirb[XDIR_NumName] = nlen; + // Set secondary count (C0 + C1s) + dirb[XDIR_NumSec] = 1 + nc1; + // Set name hash + st_word(dirb + XDIR_NameHash, xname_sum(lfn)); +} + +# endif /* !FF_FS_READONLY */ +#endif /* FF_FS_EXFAT */ + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ + +# define DIR_READ_FILE(dp) dir_read(dp, 0) +# define DIR_READ_LABEL(dp) dir_read(dp, 1) + +static FRESULT dir_read( + // Pointer to the directory object + DIR* dp, + // Filtered by 0:file/directory or 1:volume label + int vol) { + FRESULT res = FR_NO_FILE; + FATFS* fs = dp->obj.fs; + BYTE attr, b; +# if FF_USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +# endif + + while (dp->sect) { + res = move_window(fs, dp->sect); + if (res != FR_OK) { + break; + } + // Test for the entry type + b = dp->dir[DIR_Name]; + if (b == 0) { + // Reached to end of the directory + res = FR_NO_FILE; + break; + } +# if FF_FS_EXFAT + // On the exFAT volume + if (fs->fs_type == FS_EXFAT) { + if (FF_USE_LABEL && vol) { + // Volume label entry? + if (b == ET_VLABEL) { + break; + } + } + else { + // Start of the file entry block? + if (b == ET_FILEDIR) { + // Get location of the block + dp->blk_ofs = dp->dptr; + // Load the entry block + res = load_xdir(dp); + if (res == FR_OK) { + // Get attribute + dp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK; + } + break; + } + } + } + else +# endif + // On the FAT/FAT32 volume + { + // Get attribute + dp->obj.attr = attr = dp->dir[DIR_Attr] & AM_MASK; +# if FF_USE_LFN /* LFN configuration */ + if (b == DDEM || b == '.' + || (int)((attr & ~AM_ARC) == AM_VOL) + != vol) { /* An entry without valid data */ + ord = 0xFF; + } + else { + // An LFN entry is found + if (attr == AM_LFN) { + // Is it start of an LFN sequence? + if (b & LLEF) { + sum = dp->dir[LDIR_Chksum]; + b &= (BYTE)~LLEF; + ord = b; + dp->blk_ofs = dp->dptr; + } + // Check LFN validity and capture it + + ord = (b == ord && sum == dp->dir[LDIR_Chksum] + && pick_lfn(fs->lfnbuf, dp->dir)) + ? ord - 1 + : 0xFF; + // An SFN entry is found + } + else { + // Is there a valid LFN? + if (ord != 0 || sum != sum_sfn(dp->dir)) { + // It has no LFN. + dp->blk_ofs = 0xFFFFFFFF; + } + break; + } + } + // Non LFN configuration +# else + // Is it a valid entry? + if (b != DDEM && b != '.' && attr != AM_LFN + && (int)((attr & ~AM_ARC) == AM_VOL) == vol) { + break; + } +# endif + } + // Next entry + res = dir_next(dp, 0); + if (res != FR_OK) { + break; + } + } + + // Terminate the read operation on error or EOT + if (res != FR_OK) { + dp->sect = 0; + } + return res; +} + +#endif /* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */ + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +// FR_OK(0):succeeded, !=0:error +static FRESULT dir_find( + // Pointer to the directory object with the file name + DIR* dp) { + FRESULT res; + FATFS* fs = dp->obj.fs; + BYTE c; +#if FF_USE_LFN + BYTE a, ord, sum; +#endif + + // Rewind directory object + res = dir_sdi(dp, 0); + if (res != FR_OK) { + return res; + } +#if FF_FS_EXFAT + // On the exFAT volume + if (fs->fs_type == FS_EXFAT) { + BYTE nc; + UINT di, ni; + // Hash value of the name to find + WORD hash = xname_sum(fs->lfnbuf); + + // Read an item + while ((res = DIR_READ_FILE(dp)) == FR_OK) { +# if FF_MAX_LFN < 255 + // Skip comparison if inaccessible object name + if (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) { + continue; + } +# endif + // Skip comparison if hash mismatched + if (ld_word(fs->dirbuf + XDIR_NameHash) != hash) { + continue; + } + // Compare the name + for (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; + nc--, di += 2, ni++) { + if ((di % SZDIRE) == 0) { + di += 2; + } + if (ff_wtoupper(ld_word(fs->dirbuf + di)) + != ff_wtoupper(fs->lfnbuf[ni])) { + break; + } + } + // Name matched? + if (nc == 0 && !fs->lfnbuf[ni]) { + break; + } + } + return res; + } +#endif + // On the FAT/FAT32 volume + +#if FF_USE_LFN + // Reset LFN sequence + ord = sum = 0xFF; + dp->blk_ofs = 0xFFFFFFFF; +#endif + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) { + break; + } + c = dp->dir[DIR_Name]; + // Reached to end of table + if (c == 0) { + res = FR_NO_FILE; + break; + } + // LFN configuration +#if FF_USE_LFN + dp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK; + // An entry without valid data + if (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) { + // Reset LFN sequence + ord = 0xFF; + dp->blk_ofs = 0xFFFFFFFF; + } + else { + // An LFN entry is found + if (a == AM_LFN) { + if (!(dp->fn[NSFLAG] & NS_NOLFN)) { + // Is it start of LFN sequence? + if (c & LLEF) { + sum = dp->dir[LDIR_Chksum]; + // LFN start order + c &= (BYTE)~LLEF; + ord = c; + // Start offset of LFN + dp->blk_ofs = dp->dptr; + } + // Check validity of the LFN entry and compare it with given + // name + + ord = (c == ord && sum == dp->dir[LDIR_Chksum] + && cmp_lfn(fs->lfnbuf, dp->dir)) + ? ord - 1 + : 0xFF; + } + // An SFN entry is found + } + else { + // LFN matched? + if (ord == 0 && sum == sum_sfn(dp->dir)) { + break; + } + // SFN matched? + if (!(dp->fn[NSFLAG] & NS_LOSS) + && !memcmp(dp->dir, dp->fn, 11)) { + break; + } + // Reset LFN sequence + ord = 0xFF; + dp->blk_ofs = 0xFFFFFFFF; + } + } + // Non LFN configuration +#else + dp->obj.attr = dp->dir[DIR_Attr] & AM_MASK; + // Is it a valid entry? + if (!(dp->dir[DIR_Attr] & AM_VOL) && !memcmp(dp->dir, dp->fn, 11)) { + break; + } +#endif + // Next entry + res = dir_next(dp, 0); + } while (res == FR_OK); + + return res; +} + +#if !FF_FS_READONLY +//----------------------------------------------------------------------- + +// Register an object to the directory + +//----------------------------------------------------------------------- + +// FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, +// FR_DISK_ERR:disk error +static FRESULT dir_register( + // Target directory with object name to be created + DIR* dp) { + FRESULT res; + FATFS* fs = dp->obj.fs; + // LFN configuration +# if FF_USE_LFN + UINT n, len, n_ent; + BYTE sn[12], sum; + + // Check name validity + if (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) { + return FR_INVALID_NAME; + } + // Get lfn length + for (len = 0; fs->lfnbuf[len]; len++) + ; + +# if FF_FS_EXFAT + // On the exFAT volume + if (fs->fs_type == FS_EXFAT) { + // Number of entries to allocate (85+C0+C1s) + n_ent = (len + 14) / 15 + 2; + // Allocate directory entries + res = dir_alloc(dp, n_ent); + if (res != FR_OK) { + return res; + } + // Set the allocated entry block offset + dp->blk_ofs = dp->dptr - SZDIRE * (n_ent - 1); + + // Has the directory been stretched by new allocation? + if (dp->obj.stat & 4) { + dp->obj.stat &= ~4; + // Fill the first fragment on the FAT if needed + res = fill_first_frag(&dp->obj); + if (res != FR_OK) { + return res; + } + // Fill the last fragment on the FAT if needed + res = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF); + if (res != FR_OK) { + return res; + } + // Is it a sub-directory? + if (dp->obj.sclust != 0) { + DIR dj; + + // Load the object status + res = load_obj_xdir(&dj, &dp->obj); + if (res != FR_OK) { + return res; + } + // Increase the directory size by cluster size + dp->obj.objsize += (DWORD)fs->csize * SS(fs); + st_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize); + st_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize); + // Update the allocation status + fs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1; + // Store the object status + res = store_xdir(&dj); + if (res != FR_OK) { + return res; + } + } + } + + // Create on-memory directory block to be written later + create_xdir(fs->dirbuf, fs->lfnbuf); + return FR_OK; + } +# endif + // On the FAT/FAT32 volume + + memcpy(sn, dp->fn, 12); + // When LFN is out of 8.3 format, generate a numbered name + if (sn[NSFLAG] & NS_LOSS) { + // Find only SFN + dp->fn[NSFLAG] = NS_NOLFN; + for (n = 1; n < 100; n++) { + // Generate a numbered name + gen_numname(dp->fn, sn, fs->lfnbuf, n); + // Check if the name collides with existing SFN + res = dir_find(dp); + if (res != FR_OK) { + break; + } + } + // Abort if too many collisions + if (n == 100) { + return FR_DENIED; + } + // Abort if the result is other than 'not collided' + if (res != FR_NO_FILE) { + return res; + } + dp->fn[NSFLAG] = sn[NSFLAG]; + } + + // Create an SFN with/without LFNs. + + // Number of entries to allocate + n_ent = (sn[NSFLAG] & NS_LFN) ? (len + 12) / 13 + 1 : 1; + // Allocate entries + res = dir_alloc(dp, n_ent); + // Set LFN entry if needed + if (res == FR_OK && --n_ent) { + res = dir_sdi(dp, dp->dptr - n_ent * SZDIRE); + if (res == FR_OK) { + // Checksum value of the SFN tied to the LFN + sum = sum_sfn(dp->fn); + // Store LFN entries in bottom first + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) { + break; + } + put_lfn(fs->lfnbuf, dp->dir, (BYTE)n_ent, sum); + fs->wflag = 1; + // Next entry + res = dir_next(dp, 0); + } while (res == FR_OK && --n_ent); + } + } + +// Non LFN configuration +# else + // Allocate an entry for SFN + res = dir_alloc(dp, 1); + +# endif + + // Set SFN entry + + if (res == FR_OK) { + res = move_window(fs, dp->sect); + if (res == FR_OK) { + // Clean the entry + memset(dp->dir, 0, SZDIRE); + // Put SFN + memcpy(dp->dir + DIR_Name, dp->fn, 11); +# if FF_USE_LFN + // Put NT flag + dp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT); +# endif + fs->wflag = 1; + } + } + + return res; +} + +// !FF_FS_READONLY +#endif + +#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0 +//----------------------------------------------------------------------- + +// Remove an object from the directory + +//----------------------------------------------------------------------- + +// FR_OK:Succeeded, FR_DISK_ERR:A disk error +static FRESULT dir_remove( + // Directory object pointing the entry to be removed + DIR* dp) { + FRESULT res; + FATFS* fs = dp->obj.fs; + // LFN configuration +# if FF_USE_LFN + DWORD last = dp->dptr; + + // Goto top of the entry block if LFN is exist + res = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs); + if (res == FR_OK) { + do { + res = move_window(fs, dp->sect); + if (res != FR_OK) { + break; + } + // On the exFAT volume + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + // Clear the entry InUse flag. + dp->dir[XDIR_Type] &= 0x7F; + // On the FAT/FAT32 volume + } + else { + // Mark the entry 'deleted'. + dp->dir[DIR_Name] = DDEM; + } + fs->wflag = 1; + // If reached last entry then all entries of the object has been + // deleted. + if (dp->dptr >= last) { + break; + } + // Next entry + res = dir_next(dp, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) { + res = FR_INT_ERR; + } + } + // Non LFN configuration +# else + + res = move_window(fs, dp->sect); + if (res == FR_OK) { + // Mark the entry 'deleted'. + dp->dir[DIR_Name] = DDEM; + fs->wflag = 1; + } +# endif + + return res; +} + +// !FF_FS_READONLY && FF_FS_MINIMIZE == 0 +#endif + +#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +//----------------------------------------------------------------------- + +// Get file information from directory entry + +//----------------------------------------------------------------------- + +static void get_fileinfo( + // Pointer to the directory object + DIR* dp, + // Pointer to the file information to be filled + FILINFO* fno) { + UINT si, di; +# if FF_USE_LFN + BYTE lcf; + WCHAR wc, hs; + FATFS* fs = dp->obj.fs; + UINT nw; +# else + TCHAR c; +# endif + + // Invaidate file info + fno->fname[0] = 0; + // Exit if read pointer has reached end of directory + if (dp->sect == 0) { + return; + } + +// LFN configuration +# if FF_USE_LFN +# if FF_FS_EXFAT + // exFAT volume + if (fs->fs_type == FS_EXFAT) { + UINT nc = 0; + + // 1st C1 entry in the entry block + si = SZDIRE * 2; + di = 0; + hs = 0; + while (nc < fs->dirbuf[XDIR_NumName]) { + // Truncated directory block? + if (si >= MAXDIRB(FF_MAX_LFN)) { + di = 0; + break; + } + // Skip entry type field + if ((si % SZDIRE) == 0) { + si += 2; + } + // Get a character + wc = ld_word(fs->dirbuf + si); + si += 2; + nc++; + // Is it a surrogate? + if (hs == 0 && IsSurrogate(wc)) { + // Get low surrogate + hs = wc; + continue; + } + // Store it in API encoding + nw + = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di); + // Buffer overflow or wrong char? + if (nw == 0) { + di = 0; + break; + } + di += nw; + hs = 0; + } + // Broken surrogate pair? + if (hs != 0) { + di = 0; + } + // Inaccessible object name? + if (di == 0) { + fno->fname[di++] = '\?'; + } + // Terminate the name + fno->fname[di] = 0; + // exFAT does not support SFN + fno->altname[0] = 0; + + // Attribute + fno->fattrib = fs->dirbuf[XDIR_Attr] & AM_MASKX; + // Size + fno->fsize + = (fno->fattrib & AM_DIR) ? 0 : ld_qword(fs->dirbuf + XDIR_FileSize); + // Time + fno->ftime = ld_word(fs->dirbuf + XDIR_ModTime + 0); + // Date + fno->fdate = ld_word(fs->dirbuf + XDIR_ModTime + 2); + return; + } + else +# endif + // FAT/FAT32 volume + { + // Get LFN if available + if (dp->blk_ofs != 0xFFFFFFFF) { + si = di = 0; + hs = 0; + while (fs->lfnbuf[si] != 0) { + // Get an LFN character (UTF-16) + wc = fs->lfnbuf[si++]; + // Is it a surrogate? + if (hs == 0 && IsSurrogate(wc)) { + // Get low surrogate + hs = wc; + continue; + } + // Store it in API encoding + nw = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], + FF_LFN_BUF - di); + // Buffer overflow or wrong char? + if (nw == 0) { + di = 0; + break; + } + di += nw; + hs = 0; + } + // Broken surrogate pair? + if (hs != 0) { + di = 0; + } + // Terminate the LFN (null string means LFN is invalid) + fno->fname[di] = 0; + } + } + + si = di = 0; + // Get SFN from SFN entry + while (si < 11) { + // Get a char + wc = dp->dir[si++]; + // Skip padding spaces + if (wc == ' ') { + continue; + } + // Restore replaced DDEM character + if (wc == RDDEM) { + wc = DDEM; + } + // Insert a . if extension is exist + if (si == 9 && di < FF_SFN_BUF) { + fno->altname[di++] = '.'; + } + // Unicode output +# if FF_LFN_UNICODE >= 1 + // Make a DBC if needed + if (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) { + wc = wc << 8 | dp->dir[si++]; + } + // ANSI/OEM -> Unicode + wc = ff_oem2uni(wc, CODEPAGE); + // Wrong char in the current code page? + if (wc == 0) { + di = 0; + break; + } + // Store it in API encoding + nw = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di); + // Buffer overflow? + if (nw == 0) { + di = 0; + break; + } + di += nw; + // ANSI/OEM output +# else + // Store it without any conversion + fno->altname[di++] = (TCHAR)wc; +# endif + } + // Terminate the SFN (null string means SFN is invalid) + fno->altname[di] = 0; + + // If LFN is invalid, altname[] needs to be copied to fname[] + if (fno->fname[0] == 0) { + // If LFN and SFN both are invalid, this object is inaccessible + if (di == 0) { + fno->fname[di++] = '\?'; + } + else { + // Copy altname[] to fname[] with case information + for (si = di = 0, lcf = NS_BODY; fno->altname[si]; si++, di++) { + wc = (WCHAR)fno->altname[si]; + if (wc == '.') { + lcf = NS_EXT; + } + if (IsUpper(wc) && (dp->dir[DIR_NTres] & lcf)) { + wc += 0x20; + } + fno->fname[di] = (TCHAR)wc; + } + } + // Terminate the LFN + fno->fname[di] = 0; + // Altname is not needed if neither LFN nor case info is exist. + if (!dp->dir[DIR_NTres]) { + fno->altname[0] = 0; + } + } + +// Non-LFN configuration +# else + si = di = 0; + // Copy name body and extension + while (si < 11) { + c = (TCHAR)dp->dir[si++]; + // Skip padding spaces + if (c == ' ') { + continue; + } + // Restore replaced DDEM character + if (c == RDDEM) { + c = DDEM; + } + // Insert a . if extension is exist + if (si == 9) { + fno->fname[di++] = '.'; + } + fno->fname[di++] = c; + } + // Terminate the SFN + fno->fname[di] = 0; +# endif + + // Attribute + fno->fattrib = dp->dir[DIR_Attr] & AM_MASK; + // Size + fno->fsize = ld_dword(dp->dir + DIR_FileSize); + // Time + fno->ftime = ld_word(dp->dir + DIR_ModTime + 0); + // Date + fno->fdate = ld_word(dp->dir + DIR_ModTime + 2); +} + +// FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 +#endif + +#if FF_USE_FIND && FF_FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Pattern matching */ +/*-----------------------------------------------------------------------*/ + +// Maximum number of wildcard terms in the pattern to limit recursion +# define FIND_RECURS 4 + +// Get a character and advance ptr +static DWORD get_achar( + // Pointer to pointer to the ANSI/OEM or Unicode string + const TCHAR** ptr) { + DWORD chr; + +// Unicode input +# if FF_USE_LFN && FF_LFN_UNICODE >= 1 + chr = tchar2uni(ptr); + // Wrong UTF encoding is recognized as end of the string + if (chr == 0xFFFFFFFF) { + chr = 0; + } + chr = ff_wtoupper(chr); + +// ANSI/OEM input +# else + // Get a byte + chr = (BYTE) * (*ptr)++; + // To upper ASCII char + if (IsLower(chr)) { + chr -= 0x20; + } +# if FF_CODE_PAGE == 0 + // To upper SBCS extended char + if (ExCvt && chr >= 0x80) { + chr = ExCvt[chr - 0x80]; + } +# elif FF_CODE_PAGE < 900 + // To upper SBCS extended char + if (chr >= 0x80) { + chr = ExCvt[chr - 0x80]; + } +# endif +# if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900 + // Get DBC 2nd byte if needed + if (dbc_1st((BYTE)chr)) { + chr = dbc_2nd((BYTE) * *ptr) ? chr << 8 | (BYTE) * (*ptr)++ : 0; + } +# endif + +# endif + return chr; +} + +// 0:mismatched, 1:matched +static int pattern_match( + // Matching pattern + const TCHAR* pat, + // String to be tested + const TCHAR* nam, + // Number of pre-skip chars (number of ?s, b8:infinite (* specified)) + UINT skip, + // Recursion count + UINT recur) { + const TCHAR* pptr; + const TCHAR* nptr; + DWORD pchr, nchr; + UINT sk; + + // Pre-skip name chars + while ((skip & 0xFF) != 0) { + // Branch mismatched if less name chars + if (!get_achar(&nam)) { + return 0; + } + skip--; + } + // Matched? (short circuit) + if (*pat == 0 && skip) { + return 1; + } + + do { + // Top of pattern and name to match + pptr = pat; + nptr = nam; + for (;;) { + // Wildcard term? + if (*pptr == '\?' || *pptr == '*') { + // Too many wildcard terms? + if (recur == 0) { + return 0; + } + sk = 0; + // Analyze the wildcard term + do { + if (*pptr++ == '\?') { + sk++; + } + else { + sk |= 0x100; + } + } while (*pptr == '\?' || *pptr == '*'); + // Test new branch (recursive call) + if (pattern_match(pptr, nptr, sk, recur - 1)) { + return 1; + } + // Branch mismatched + nchr = *nptr; + break; + } + // Get a pattern char + pchr = get_achar(&pptr); + // Get a name char + nchr = get_achar(&nptr); + // Branch mismatched? + if (pchr != nchr) { + break; + } + // Branch matched? (matched at end of both strings) + if (pchr == 0) { + return 1; + } + } + // nam++ + get_achar(&nam); + // Retry until end of name if infinite search is specified + } while (skip && nchr); + + return 0; +} + +// FF_USE_FIND && FF_FS_MINIMIZE <= 1 +#endif + +//----------------------------------------------------------------------- + +// Pick a top segment and create the object name in directory form + +//----------------------------------------------------------------------- + +// FR_OK: successful, FR_INVALID_NAME: could not create +static FRESULT create_name( + // Pointer to the directory object + DIR* dp, + // Pointer to pointer to the segment in the path string + const TCHAR** path) { + // LFN configuration +#if FF_USE_LFN + BYTE b, cf; + WCHAR wc; + WCHAR* lfn; + const TCHAR* p; + DWORD uc; + UINT i, ni, si, di; + + // Create LFN into LFN working buffer + + p = *path; + lfn = dp->obj.fs->lfnbuf; + di = 0; + for (;;) { + // Get a character + uc = tchar2uni(&p); + // Invalid code or UTF decode error + if (uc == 0xFFFFFFFF) { + return FR_INVALID_NAME; + } + // Store high surrogate if needed + if (uc >= 0x10000) { + lfn[di++] = (WCHAR)(uc >> 16); + } + wc = (WCHAR)uc; + // Break if end of the path or a separator is found + if (wc < ' ' || IsSeparator(wc)) { + break; + } + // Reject illegal characters for LFN + if (wc < 0x80 && strchr("*:<>|\"\?\x7F", (int)wc)) { + return FR_INVALID_NAME; + } + // Reject too long name + if (di >= FF_MAX_LFN) { + return FR_INVALID_NAME; + } + // Store the Unicode character + lfn[di++] = wc; + } + // Stopped at end of the path? + if (wc < ' ') { + // Last segment + cf = NS_LAST; + // Stopped at a separator + } + else { + // Skip duplicated separators if exist + while (IsSeparator(*p)) { + p++; + } + // Next segment may follow + cf = 0; + // Ignore terminating separator + if (IsTerminator(*p)) { + cf = NS_LAST; + } + } + // Return pointer to the next segment + *path = p; + +# if FF_FS_RPATH != 0 + if ((di == 1 && lfn[di - 1] == '.') || + // Is this segment a dot name? + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { + lfn[di] = 0; + // Create dot name for SFN entry + for (i = 0; i < 11; i++) { + dp->fn[i] = (i < di) ? '.' : ' '; + } + // This is a dot entry + dp->fn[i] = cf | NS_DOT; + return FR_OK; + } +# endif + // Snip off trailing spaces and dots if exist + while (di) { + wc = lfn[di - 1]; + if (wc != ' ' && wc != '.') { + break; + } + di--; + } + // LFN is created into the working buffer + lfn[di] = 0; + // Reject null name + if (di == 0) { + return FR_INVALID_NAME; + } + + // Create SFN in directory form + + // Remove leading spaces + for (si = 0; lfn[si] == ' '; si++) + ; + // Is there any leading space or dot? + if (si > 0 || lfn[si] == '.') { + cf |= NS_LOSS | NS_LFN; + } + // Find last dot (di<=si: no extension) + while (di > 0 && lfn[di - 1] != '.') { + di--; + } + + memset(dp->fn, ' ', 11); + i = b = 0; + ni = 8; + for (;;) { + // Get an LFN character + wc = lfn[si++]; + // Break on end of the LFN + if (wc == 0) { + break; + } + // Remove embedded spaces and dots + if (wc == ' ' || (wc == '.' && si != di)) { + cf |= NS_LOSS | NS_LFN; + continue; + } + + // End of field? + if (i >= ni || si == di) { + // Name extension overflow? + if (ni == 11) { + cf |= NS_LOSS | NS_LFN; + break; + } + // Name body overflow? + if (si != di) { + cf |= NS_LOSS | NS_LFN; + } + // No name extension? + if (si > di) { + break; + } + // Enter name extension + si = di; + i = 8; + ni = 11; + b <<= 2; + continue; + } + + // Is this an extended character? + if (wc >= 0x80) { + // LFN entry needs to be created + cf |= NS_LFN; +# if FF_CODE_PAGE == 0 + // In SBCS cfg + if (ExCvt) { + // Unicode ==> ANSI/OEM code + wc = ff_uni2oem(wc, CODEPAGE); + // Convert extended character to upper (SBCS) + if (wc & 0x80) { + wc = ExCvt[wc & 0x7F]; + } + // In DBCS cfg + } + else { + // Unicode ==> Up-convert ==> ANSI/OEM code + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); + } + // In SBCS cfg +# elif FF_CODE_PAGE < 900 + // Unicode ==> ANSI/OEM code + wc = ff_uni2oem(wc, CODEPAGE); + // Convert extended character to upper (SBCS) + if (wc & 0x80) { + wc = ExCvt[wc & 0x7F]; + } + // In DBCS cfg +# else + // Unicode ==> Up-convert ==> ANSI/OEM code + wc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE); +# endif + } + + // Is this a DBC? + if (wc >= 0x100) { + // Field overflow? + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; + // Next field + i = ni; + continue; + } + // Put 1st byte + dp->fn[i++] = (BYTE)(wc >> 8); + // SBC + } + else { + // Replace illegal characters for SFN + if (wc == 0 || strchr("+,;=[]", (int)wc)) { + // Lossy conversion + wc = '_'; + cf |= NS_LOSS | NS_LFN; + } + else { + // ASCII upper case? + if (IsUpper(wc)) { + b |= 2; + } + // ASCII lower case? + if (IsLower(wc)) { + b |= 1; + wc -= 0x20; + } + } + } + dp->fn[i++] = (BYTE)wc; + } + + // If the first character collides with DDEM, replace it with RDDEM + if (dp->fn[0] == DDEM) { + dp->fn[0] = RDDEM; + } + + // Shift capital flags if no extension + if (ni == 8) { + b <<= 2; + } + // LFN entry needs to be created if composite capitals + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) { + cf |= NS_LFN; + } + // When LFN is in 8.3 format without extended character, NT flags are + // created + if (!(cf & NS_LFN)) { + // NT flag (Extension has small capital letters only) + if (b & 0x01) { + cf |= NS_EXT; + } + // NT flag (Body has small capital letters only) + if (b & 0x04) { + cf |= NS_BODY; + } + } + + // SFN is created into dp->fn[] + dp->fn[NSFLAG] = cf; + + return FR_OK; + +// FF_USE_LFN : Non-LFN configuration +#else + BYTE c, d; + BYTE* sfn; + UINT ni, si, i; + const char* p; + + // Create file name in directory form + + p = *path; + sfn = dp->fn; + memset(sfn, ' ', 11); + si = i = 0; + ni = 8; +# if FF_FS_RPATH != 0 + // Is this a dot entry? + if (p[si] == '.') { + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) { + break; + } + sfn[i++] = c; + } + if (!IsSeparator(c) && c > ' ') { + return FR_INVALID_NAME; + } + // Return pointer to the next segment + *path = p + si; + // Set last segment flag if end of the path + sfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; + return FR_OK; + } +# endif + for (;;) { + // Get a byte + c = (BYTE)p[si++]; + // Break if end of the path name + if (c <= ' ') { + break; + } + // Break if a separator is found + if (IsSeparator(c)) { + // Skip duplicated separator if exist + while (IsSeparator(p[si])) { + si++; + } + break; + } + // End of body or field overflow? + if (c == '.' || i >= ni) { + // Field overflow or invalid dot? + if (ni == 11 || c != '.') { + return FR_INVALID_NAME; + } + // Enter file extension field + i = 8; + ni = 11; + continue; + } +# if FF_CODE_PAGE == 0 + // Is SBC extended character? + if (ExCvt && c >= 0x80) { + // To upper SBC extended character + c = ExCvt[c & 0x7F]; + } +# elif FF_CODE_PAGE < 900 + // Is SBC extended character? + if (c >= 0x80) { + // To upper SBC extended character + c = ExCvt[c & 0x7F]; + } +# endif + // Check if it is a DBC 1st byte + if (dbc_1st(c)) { + // Get 2nd byte + d = (BYTE)p[si++]; + // Reject invalid DBC + if (!dbc_2nd(d) || i >= ni - 1) { + return FR_INVALID_NAME; + } + sfn[i++] = c; + sfn[i++] = d; + // SBC + } + else { + // Reject illegal chrs for SFN + if (strchr("*+,:;<=>[]|\"\?\x7F", (int)c)) { + return FR_INVALID_NAME; + } + // To upper + if (IsLower(c)) { + c -= 0x20; + } + sfn[i++] = c; + } + } + // Return pointer to the next segment + *path = &p[si]; + // Reject nul string + if (i == 0) { + return FR_INVALID_NAME; + } + + // If the first character collides with DDEM, replace it with RDDEM + if (sfn[0] == DDEM) { + sfn[0] = RDDEM; + } + // Set last segment flag if end of the path + sfn[NSFLAG] = (c <= ' ' || p[si] <= ' ') ? NS_LAST : 0; + + return FR_OK; + // FF_USE_LFN +#endif +} + +//----------------------------------------------------------------------- + +// Follow a file path + +//----------------------------------------------------------------------- + +// FR_OK(0): successful, !=0: error code +static FRESULT follow_path( + // Directory object to return last directory and found object + DIR* dp, + // Full-path string to find a file or directory + const TCHAR* path) { + FRESULT res; + BYTE ns; + FATFS* fs = dp->obj.fs; + +#if FF_FS_RPATH != 0 + // Without heading separator + if (!IsSeparator(*path) + && (FF_STR_VOLUME_ID != 2 || !IsTerminator(*path))) { + // Start at the current directory + dp->obj.sclust = fs->cdir; + } + else +#endif + // With heading separator + { + // Strip separators + while (IsSeparator(*path)) { + path++; + } + // Start from the root directory + dp->obj.sclust = 0; + } +#if FF_FS_EXFAT + // Invalidate last fragment counter of the object + dp->obj.n_frag = 0; +# if FF_FS_RPATH != 0 + // exFAT: Retrieve the sub-directory's status + if (fs->fs_type == FS_EXFAT && dp->obj.sclust) { + DIR dj; + + dp->obj.c_scl = fs->cdc_scl; + dp->obj.c_size = fs->cdc_size; + dp->obj.c_ofs = fs->cdc_ofs; + res = load_obj_xdir(&dj, &dp->obj); + if (res != FR_OK) { + return res; + } + dp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize); + dp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2; + } +# endif +#endif + + // Null path name is the origin directory itself + if ((UINT)*path < ' ') { + dp->fn[NSFLAG] = NS_NONAME; + res = dir_sdi(dp, 0); + + // Follow path + } + else { + for (;;) { + // Get a segment name of the path + res = create_name(dp, &path); + if (res != FR_OK) { + break; + } + // Find an object with the segment name + res = dir_find(dp); + ns = dp->fn[NSFLAG]; + // Failed to find the object + if (res != FR_OK) { + // Object is not found + if (res == FR_NO_FILE) { + // If dot entry is not exist, stay there + if (FF_FS_RPATH && (ns & NS_DOT)) { + // Continue to follow if not last segment + if (!(ns & NS_LAST)) { + continue; + } + dp->fn[NSFLAG] = NS_NONAME; + res = FR_OK; + // Could not find the object + } + else { + // Adjust error code if not last segment + if (!(ns & NS_LAST)) { + res = FR_NO_PATH; + } + } + } + break; + } + // Last segment matched. Function completed. + if (ns & NS_LAST) { + break; + } + // Get into the sub-directory + + // It is not a sub-directory and cannot follow + if (!(dp->obj.attr & AM_DIR)) { + res = FR_NO_PATH; + break; + } +#if FF_FS_EXFAT + // Save containing directory information for next dir + if (fs->fs_type == FS_EXFAT) { + dp->obj.c_scl = dp->obj.sclust; + dp->obj.c_size + = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + // Open next directory + init_alloc_info(fs, &dp->obj); + } + else +#endif + { + // Open next directory + dp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs)); + } + } + } + + return res; +} + +//----------------------------------------------------------------------- + +// Get logical drive number from path name + +//----------------------------------------------------------------------- + +// Returns logical drive number (-1:invalid drive number or null pointer) +static int get_ldnumber( + // Pointer to pointer to the path name + const TCHAR** path) { + const TCHAR* tp; + const TCHAR* tt; + TCHAR tc; + int i; + int vol = -1; + // Find string volume ID +#if FF_STR_VOLUME_ID + const char* sp; + char c; +#endif + + tt = tp = *path; + // Invalid path name? + if (!tp) { + return vol; + } + // Find a colon in the path + do { + tc = *tt++; + } while (!IsTerminator(tc) && tc != ':'); + + // DOS/Windows style volume ID? + if (tc == ':') { + i = FF_VOLUMES; + // Is there a numeric volume ID + colon? + if (IsDigit(*tp) && tp + 2 == tt) { + // Get the LD number + i = (int)*tp - '0'; + } + // Arbitrary string is enabled +#if FF_STR_VOLUME_ID == 1 + else { + i = 0; + do { + // This string volume ID and path name + sp = VolumeStr[i]; + tp = *path; + // Compare the volume ID with path name + do { + c = *sp++; + tc = *tp++; + if (IsLower(c)) { + c -= 0x20; + } + if (IsLower(tc)) { + tc -= 0x20; + } + } while (c && (TCHAR)c == tc); + // Repeat for each id until pattern match + } while ((c || tp != tt) && ++i < FF_VOLUMES); + } +#endif + // If a volume ID is found, get the drive number and strip it + if (i < FF_VOLUMES) { + // Drive number + vol = i; + // Snip the drive prefix off + *path = tt; + } + return vol; + } + // Unix style volume ID is enabled +#if FF_STR_VOLUME_ID == 2 + // Is there a volume ID? + if (*tp == '/') { + // Skip duplicated separator + while (*(tp + 1) == '/') { + tp++; + } + i = 0; + do { + // Path name and this string volume ID + tt = tp; + sp = VolumeStr[i]; + // Compare the volume ID with path name + do { + c = *sp++; + tc = *(++tt); + if (IsLower(c)) { + c -= 0x20; + } + if (IsLower(tc)) { + tc -= 0x20; + } + } while (c && (TCHAR)c == tc); + // Repeat for each ID until pattern match + } while ((c || (tc != '/' && !IsTerminator(tc))) && ++i < FF_VOLUMES); + // If a volume ID is found, get the drive number and strip it + if (i < FF_VOLUMES) { + // Drive number + vol = i; + // Snip the drive prefix off + *path = tt; + } + return vol; + } +#endif + // No drive prefix is found + +#if FF_FS_RPATH != 0 + // Default drive is current drive + vol = CurrVol; +#else + // Default drive is 0 + vol = 0; +#endif + // Return the default drive + return vol; +} + +//----------------------------------------------------------------------- + +// GPT support functions + +//----------------------------------------------------------------------- + +#if FF_LBA64 + +// Calculate CRC32 in byte-by-byte + +// Returns next CRC value +static DWORD crc32( + // Current CRC value + DWORD crc, + // A byte to be processed + BYTE d) { + BYTE b; + + for (b = 1; b; b <<= 1) { + crc ^= (d & b) ? 1 : 0; + crc = (crc & 1) ? crc >> 1 ^ 0xEDB88320 : crc >> 1; + } + return crc; +} + +// Check validity of GPT header + +// 0:Invalid, 1:Valid +static int test_gpt_header( + // Pointer to the GPT header + const BYTE* gpth) { + UINT i; + DWORD bcc, hlen; + + // Check signature and version (1.0) + if (memcmp(gpth + GPTH_Sign, + "EFI PART" + "\0\0\1", + 12)) { + return 0; + } + // Check header size + hlen = ld_dword(gpth + GPTH_Size); + if (hlen < 92 || hlen > FF_MIN_SS) { + return 0; + } + // Check header BCC + for (i = 0, bcc = 0xFFFFFFFF; i < hlen; i++) { + bcc = crc32(bcc, i - GPTH_Bcc < 4 ? 0 : gpth[i]); + } + if (~bcc != ld_dword(gpth + GPTH_Bcc)) { + return 0; + } + // Table entry size (must be SZ_GPTE bytes) + if (ld_dword(gpth + GPTH_PteSize) != SZ_GPTE) { + return 0; + } + // Table size (must be 128 entries or less) + if (ld_dword(gpth + GPTH_PtNum) > 128) { + return 0; + } + + return 1; +} + +# if !FF_FS_READONLY && FF_USE_MKFS + +// Generate random value + +static DWORD make_rand( + // Seed value + DWORD seed, + // Output buffer + BYTE* buff, + // Data length + UINT n) { + UINT r; + + if (seed == 0) { + seed = 1; + } + do { + // Shift 8 bits the 32-bit LFSR + for (r = 0; r < 8; r++) { + seed = seed & 1 ? seed >> 1 ^ 0xA3000000 : seed >> 1; + } + *buff++ = (BYTE)seed; + } while (--n); + return seed; +} + +# endif +#endif + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT VBR */ +/*-----------------------------------------------------------------------*/ + +// Check what the sector is + +// 0:FAT/FAT32 VBR, 1:exFAT VBR, 2:Not FAT and valid BS, 3:Not FAT and invalid +// BS, 4:Disk error +static UINT check_fs( + // Filesystem object + FATFS* fs, + // Sector to load and check if it is an FAT-VBR or not + LBA_t sect) { + WORD w, sign; + BYTE b; + + // Invaidate window + fs->wflag = 0; + fs->winsect = (LBA_t)0 - 1; + // Load the boot sector + if (move_window(fs, sect) != FR_OK) { + return 4; + } + sign = ld_word(fs->win + BS_55AA); +#if FF_FS_EXFAT + // It is an exFAT VBR + if (sign == 0xAA55 + && !memcmp(fs->win + BS_JmpBoot, + "\xEB\x76\x90" + "EXFAT ", + 11)) { + return 1; + } +#endif + b = fs->win[BS_JmpBoot]; + // Valid JumpBoot code? (short jump, near jump or near call) + if (b == 0xEB || b == 0xE9 || b == 0xE8) { + if (sign == 0xAA55 + && !memcmp(fs->win + BS_FilSysType32, "FAT32 ", 8)) { + // It is an FAT32 VBR + return 0; + } + // FAT volumes formatted with early MS-DOS lack BS_55AA and + // BS_FilSysType, so FAT VBR needs to be identified without them. + + w = ld_word(fs->win + BPB_BytsPerSec); + b = fs->win[BPB_SecPerClus]; + // Properness of sector size (512-4096 and 2^n) + if ((w & (w - 1)) == 0 && w >= FF_MIN_SS + && w <= FF_MAX_SS + // Properness of cluster size (2^n) + && b != 0 + && (b & (b - 1)) == 0 + // Properness of reserved sectors (MNBZ) + && ld_word(fs->win + BPB_RsvdSecCnt) != 0 + // Properness of FATs (1 or 2) + && (UINT)fs->win[BPB_NumFATs] - 1 <= 1 + // Properness of root dir entries (MNBZ) + && ld_word(fs->win + BPB_RootEntCnt) != 0 + // Properness of volume sectors (>=128) + && (ld_word(fs->win + BPB_TotSec16) >= 128 + || ld_dword(fs->win + BPB_TotSec32) >= 0x10000) + // Properness of FAT size (MNBZ) + && ld_word(fs->win + BPB_FATSz16) != 0) { + // It can be presumed an FAT VBR + return 0; + } + } + // Not an FAT VBR (valid or invalid BS) + return sign == 0xAA55 ? 2 : 3; +} + +// Find an FAT volume + +// (It supports only generic partitioning rules, MBR, GPT and SFD) + +// Returns BS status found in the hosting drive +static UINT find_volume( + // Filesystem object + FATFS* fs, + // Partition to fined = 0:find as SFD and partitions, >0:forced partition + // number + UINT part) { + UINT fmt, i; + DWORD mbr_pt[4]; + + // Load sector 0 and check if it is an FAT VBR as SFD format + fmt = check_fs(fs, 0); + // Returns if it is an FAT VBR as auto scan, not a BS or disk error + if (fmt != 2 && (fmt >= 3 || part == 0)) { + return fmt; + } + + // Sector 0 is not an FAT VBR or forced partition number wants a partition + +#if FF_LBA64 + // GPT protective MBR? + if (fs->win[MBR_Table + PTE_System] == 0xEE) { + DWORD n_ent, v_ent, ofs; + QWORD pt_lba; + + // Load GPT header sector (next to MBR) + if (move_window(fs, 1) != FR_OK) { + return 4; + } + // Check if GPT header is valid + if (!test_gpt_header(fs->win)) { + return 3; + } + // Number of entries + n_ent = ld_dword(fs->win + GPTH_PtNum); + // Table location + pt_lba = ld_qword(fs->win + GPTH_PtOfs); + // Find FAT partition + for (v_ent = i = 0; i < n_ent; i++) { + // PT sector + if (move_window(fs, pt_lba + i * SZ_GPTE / SS(fs)) != FR_OK) { + return 4; + } + // Offset in the sector + ofs = i * SZ_GPTE % SS(fs); + // MS basic data partition? + if (!memcmp(fs->win + ofs + GPTE_PtGuid, GUID_MS_Basic, 16)) { + v_ent++; + // Load VBR and check status + fmt = check_fs(fs, ld_qword(fs->win + ofs + GPTE_FstLba)); + // Auto search (valid FAT volume found first) + if (part == 0 && fmt <= 1) { + return fmt; + } + // Forced partition order (regardless of it is valid or not) + if (part != 0 && v_ent == part) { + return fmt; + } + } + } + // Not found + return 3; + } +#endif + // MBR has 4 partitions max + if (FF_MULTI_PARTITION && part > 4) { + return 3; + } + // Load partition offset in the MBR + for (i = 0; i < 4; i++) { + mbr_pt[i] = ld_dword(fs->win + MBR_Table + i * SZ_PTE + PTE_StLba); + } + // Table index to find first + i = part ? part - 1 : 0; + // Find an FAT volume + do { + // Check if the partition is FAT + fmt = mbr_pt[i] ? check_fs(fs, mbr_pt[i]) : 3; + } while (part == 0 && fmt >= 2 && ++i < 4); + return fmt; +} + +//----------------------------------------------------------------------- + +// Determine logical drive number and mount the volume if needed + +//----------------------------------------------------------------------- + +// FR_OK(0): successful, !=0: an error occurred +static FRESULT mount_volume( + // Pointer to pointer to the path name (drive number) + const TCHAR** path, + // Pointer to pointer to the found filesystem object + FATFS** rfs, + // Desiered access mode to check write protection + BYTE mode) { + int vol; + FATFS* fs; + DSTATUS stat; + LBA_t bsect; + DWORD tsect, sysect, fasize, nclst, szbfat; + WORD nrsv; + UINT fmt; + + // Get logical drive number + + *rfs = 0; + vol = get_ldnumber(path); + if (vol < 0) { + return FR_INVALID_DRIVE; + } + + // Check if the filesystem object is valid or not + + // Get pointer to the filesystem object + fs = FatFs[vol]; + // Is the filesystem object available? + if (!fs) { + return FR_NOT_ENABLED; + } +#if FF_FS_REENTRANT + // Lock the volume, and system if needed + if (!lock_volume(fs, 1)) { + return FR_TIMEOUT; + } +#endif + // Return pointer to the filesystem object + *rfs = fs; + + // Desired access mode, write access or not + mode &= (BYTE)~FA_READ; + // If the volume has been mounted + if (fs->fs_type != 0) { + stat = disk_status(fs->pdrv); + // and the physical drive is kept initialized + if (!(stat & STA_NOINIT)) { + // Check write protection if needed + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { + return FR_WRITE_PROTECTED; + } + // The filesystem object is already valid + return FR_OK; + } + } + + // The filesystem object is not valid. + + // Following code attempts to mount the volume. (find an FAT volume, analyze + // the BPB and initialize the filesystem object) + + // Invalidate the filesystem object + fs->fs_type = 0; + // Initialize the volume hosting physical drive + stat = disk_initialize(fs->pdrv); + // Check if the initialization succeeded + if (stat & STA_NOINIT) { + // Failed to initialize due to no medium or hard error + return FR_NOT_READY; + } + // Check disk write protection if needed + if (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { + return FR_WRITE_PROTECTED; + } + // Get sector size (multiple sector size cfg only) +#if FF_MAX_SS != FF_MIN_SS + if (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) { + return FR_DISK_ERR; + } + if (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) { + return FR_DISK_ERR; + } +#endif + + // Find an FAT volume on the hosting drive + + fmt = find_volume(fs, LD2PT(vol)); + // An error occurred in the disk I/O layer + if (fmt == 4) { + return FR_DISK_ERR; + } + // No FAT volume is found + if (fmt >= 2) { + return FR_NO_FILESYSTEM; + } + // Volume offset in the hosting physical drive + bsect = fs->winsect; + + // An FAT volume is found (bsect). Following code initializes the filesystem + // object + +#if FF_FS_EXFAT + if (fmt == 1) { + QWORD maxlba; + DWORD so, cv, bcl, i; + + // Check zero filler + for (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) + ; + if (i < BPB_ZeroedEx + 53) { + return FR_NO_FILESYSTEM; + } + + // Check exFAT version (must be version 1.0) + if (ld_word(fs->win + BPB_FSVerEx) != 0x100) { + return FR_NO_FILESYSTEM; + } + + // (BPB_BytsPerSecEx must be equal to the physical sector size) + if (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) { + return FR_NO_FILESYSTEM; + } + + // Last LBA of the volume + 1 + maxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect; + // (It cannot be accessed in 32-bit LBA) + if (!FF_LBA64 && maxlba >= 0x100000000) { + return FR_NO_FILESYSTEM; + } + + // Number of sectors per FAT + fs->fsize = ld_dword(fs->win + BPB_FatSzEx); + + // Number of FATs + fs->n_fats = fs->win[BPB_NumFATsEx]; + // (Supports only 1 FAT) + if (fs->n_fats != 1) { + return FR_NO_FILESYSTEM; + } + + // Cluster size + fs->csize = 1 << fs->win[BPB_SecPerClusEx]; + // (Must be 1..32768 sectors) + if (fs->csize == 0) { + return FR_NO_FILESYSTEM; + } + + // Number of clusters + nclst = ld_dword(fs->win + BPB_NumClusEx); + // (Too many clusters) + if (nclst > MAX_EXFAT) { + return FR_NO_FILESYSTEM; + } + fs->n_fatent = nclst + 2; + + // Boundaries and Limits + + fs->volbase = bsect; + fs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx); + fs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx); + // (Volume size must not be smaller than the size required) + if (maxlba < (QWORD)fs->database + nclst * fs->csize) { + return FR_NO_FILESYSTEM; + } + fs->dirbase = ld_dword(fs->win + BPB_RootClusEx); + + // Get bitmap location and check if it is contiguous (implementation + // assumption) + + so = i = 0; + // Find the bitmap entry in the root directory (in only first cluster) + for (;;) { + if (i == 0) { + // Not found? + if (so >= fs->csize) { + return FR_NO_FILESYSTEM; + } + if (move_window(fs, clst2sect(fs, (DWORD)fs->dirbase) + so) + != FR_OK) { + return FR_DISK_ERR; + } + so++; + } + // Is it a bitmap entry? + if (fs->win[i] == ET_BITMAP) { + break; + } + // Next entry + i = (i + SZDIRE) % SS(fs); + } + // Bitmap cluster + bcl = ld_dword(fs->win + i + 20); + // (Wrong cluster#) + if (bcl < 2 || bcl >= fs->n_fatent) { + return FR_NO_FILESYSTEM; + } + // Bitmap sector + fs->bitbase = fs->database + fs->csize * (bcl - 2); + // Check if bitmap is contiguous + for (;;) { + if (move_window(fs, fs->fatbase + bcl / (SS(fs) / 4)) != FR_OK) { + return FR_DISK_ERR; + } + cv = ld_dword(fs->win + bcl % (SS(fs) / 4) * 4); + // Last link? + if (cv == 0xFFFFFFFF) { + break; + } + // Fragmented bitmap? + if (cv != ++bcl) { + return FR_NO_FILESYSTEM; + } + } + +# if !FF_FS_READONLY + // Initialize cluster allocation information + fs->last_clst = fs->free_clst = 0xFFFFFFFF; +# endif + // FAT sub-type + fmt = FS_EXFAT; + } + else + // FF_FS_EXFAT +#endif + { + // (BPB_BytsPerSec must be equal to the physical sector size) + if (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) { + return FR_NO_FILESYSTEM; + } + + // Number of sectors per FAT + fasize = ld_word(fs->win + BPB_FATSz16); + if (fasize == 0) { + fasize = ld_dword(fs->win + BPB_FATSz32); + } + fs->fsize = fasize; + + // Number of FATs + fs->n_fats = fs->win[BPB_NumFATs]; + // (Must be 1 or 2) + if (fs->n_fats != 1 && fs->n_fats != 2) { + return FR_NO_FILESYSTEM; + } + // Number of sectors for FAT area + fasize *= fs->n_fats; + + // Cluster size + fs->csize = fs->win[BPB_SecPerClus]; + // (Must be power of 2) + if (fs->csize == 0 || (fs->csize & (fs->csize - 1))) { + return FR_NO_FILESYSTEM; + } + + // Number of root directory entries + fs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt); + // (Must be sector aligned) + if (fs->n_rootdir % (SS(fs) / SZDIRE)) { + return FR_NO_FILESYSTEM; + } + + // Number of sectors on the volume + tsect = ld_word(fs->win + BPB_TotSec16); + if (tsect == 0) { + tsect = ld_dword(fs->win + BPB_TotSec32); + } + + // Number of reserved sectors + nrsv = ld_word(fs->win + BPB_RsvdSecCnt); + // (Must not be 0) + if (nrsv == 0) { + return FR_NO_FILESYSTEM; + } + + // Determine the FAT sub type + + // RSV + FAT + DIR + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE); + // (Invalid volume size) + if (tsect < sysect) { + return FR_NO_FILESYSTEM; + } + // Number of clusters + nclst = (tsect - sysect) / fs->csize; + // (Invalid volume size) + if (nclst == 0) { + return FR_NO_FILESYSTEM; + } + fmt = 0; + if (nclst <= MAX_FAT32) { + fmt = FS_FAT32; + } + if (nclst <= MAX_FAT16) { + fmt = FS_FAT16; + } + if (nclst <= MAX_FAT12) { + fmt = FS_FAT12; + } + if (fmt == 0) { + return FR_NO_FILESYSTEM; + } + + // Boundaries and Limits + + // Number of FAT entries + fs->n_fatent = nclst + 2; + // Volume start sector + fs->volbase = bsect; + // FAT start sector + fs->fatbase = bsect + nrsv; + // Data start sector + fs->database = bsect + sysect; + if (fmt == FS_FAT32) { + // (Must be FAT32 revision 0.0) + if (ld_word(fs->win + BPB_FSVer32) != 0) { + return FR_NO_FILESYSTEM; + } + // (BPB_RootEntCnt must be 0) + if (fs->n_rootdir != 0) { + return FR_NO_FILESYSTEM; + } + // Root directory start cluster + fs->dirbase = ld_dword(fs->win + BPB_RootClus32); + // (Needed FAT size) + szbfat = fs->n_fatent * 4; + } + else { + // (BPB_RootEntCnt must not be 0) + if (fs->n_rootdir == 0) { + return FR_NO_FILESYSTEM; + } + // Root directory start sector + fs->dirbase = fs->fatbase + fasize; + // (Needed FAT size) + szbfat = (fmt == FS_FAT16) + ? fs->n_fatent * 2 + : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + // (BPB_FATSz must not be less than the size needed) + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) { + return FR_NO_FILESYSTEM; + } + +#if !FF_FS_READONLY + // Get FSInfo if available + + // Initialize cluster allocation information + fs->last_clst = fs->free_clst = 0xFFFFFFFF; + fs->fsi_flag = 0x80; +# if (FF_FS_NOFSINFO & 3) != 3 + // Allow to update FSInfo only if BPB_FSInfo32 == 1 + if (fmt == FS_FAT32 && ld_word(fs->win + BPB_FSInfo32) == 1 + && move_window(fs, bsect + 1) == FR_OK) { + fs->fsi_flag = 0; + // Load FSInfo data if available + if (ld_word(fs->win + BS_55AA) == 0xAA55 + && ld_dword(fs->win + FSI_LeadSig) == 0x41615252 + && ld_dword(fs->win + FSI_StrucSig) == 0x61417272) { +# if (FF_FS_NOFSINFO & 1) == 0 + fs->free_clst = ld_dword(fs->win + FSI_Free_Count); +# endif +# if (FF_FS_NOFSINFO & 2) == 0 + fs->last_clst = ld_dword(fs->win + FSI_Nxt_Free); +# endif + } + } + // (FF_FS_NOFSINFO & 3) != 3 +# endif +// !FF_FS_READONLY +#endif + } + + // FAT sub-type (the filesystem object gets valid) + fs->fs_type = (BYTE)fmt; + // Volume mount ID + fs->id = ++Fsid; +#if FF_USE_LFN == 1 + // Static LFN working buffer + fs->lfnbuf = LfnBuf; +# if FF_FS_EXFAT + // Static directory block scratchpad buuffer + fs->dirbuf = DirBuf; +# endif +#endif +#if FF_FS_RPATH != 0 + // Initialize current directory + fs->cdir = 0; +#endif +// Clear file lock semaphores +#if FF_FS_LOCK + clear_share(fs); +#endif + return FR_OK; +} + +//----------------------------------------------------------------------- + +// Check if the file/directory object is valid or not + +//----------------------------------------------------------------------- + +// Returns FR_OK or FR_INVALID_OBJECT +static FRESULT validate( + // Pointer to the FFOBJID, the 1st member in the FIL/DIR structure, to check + // validity + FFOBJID* obj, + // Pointer to pointer to the owner filesystem object to return + FATFS** rfs) { + FRESULT res = FR_INVALID_OBJECT; + + // Test if the object is valid + if (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) { +#if FF_FS_REENTRANT + // Take a grant to access the volume + if (lock_volume(obj->fs, 0)) { + // Test if the hosting phsical drive is kept initialized + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { + res = FR_OK; + } + else { + // Invalidated volume, abort to access + unlock_volume(obj->fs, FR_OK); + } + // Could not take + } + else { + res = FR_TIMEOUT; + } +#else + // Test if the hosting phsical drive is kept initialized + if (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { + res = FR_OK; + } +#endif + } + // Return corresponding filesystem object if it is valid + *rfs = (res == FR_OK) ? obj->fs : 0; + return res; +} + +//------------------------------------------------------------------------- + +// Public Functions (FatFs API) + +// ----------------------------------------------------------------------------*/ + +//----------------------------------------------------------------------- + +// Mount/Unmount a Logical Drive + +//----------------------------------------------------------------------- + +FRESULT f_mount( + // + FATFS* fs, const TCHAR* path, BYTE opt) { + FATFS* cfs; + int vol; + FRESULT res; + const TCHAR* rp = path; + + // Get volume ID (logical drive number) + + vol = get_ldnumber(&rp); + if (vol < 0) { + return FR_INVALID_DRIVE; + } + // Pointer to the filesystem object of the volume + cfs = FatFs[vol]; + + // Unregister current filesystem object if regsitered + if (cfs) { + FatFs[vol] = 0; +#if FF_FS_LOCK + clear_share(cfs); +#endif +// Discard mutex of the current volume +#if FF_FS_REENTRANT + ff_mutex_delete(vol); +#endif + // Invalidate the filesystem object to be unregistered + cfs->fs_type = 0; + } + + // Register new filesystem object + if (fs) { + // Volume hosting physical drive + fs->pdrv = LD2PD(vol); + // Create a volume mutex +#if FF_FS_REENTRANT + // Owner volume ID + fs->ldrv = (BYTE)vol; + if (!ff_mutex_create(vol)) { + return FR_INT_ERR; + } +# if FF_FS_LOCK + // Create a system mutex if needed + if (SysLock == 0) { + if (!ff_mutex_create(FF_VOLUMES)) { + ff_mutex_delete(vol); + return FR_INT_ERR; + } + // System mutex is ready + SysLock = 1; + } +# endif +#endif + // Invalidate the new filesystem object + fs->fs_type = 0; + // Register new fs object + FatFs[vol] = fs; + } + + // Do not mount now, it will be mounted in subsequent file functions + if (opt == 0) { + return FR_OK; + } + + // Force mounted the volume + res = mount_volume(&path, &fs, 0); + LEAVE_FF(fs, res); +} + +FRESULT f_open(FIL* fp, const TCHAR* path, BYTE mode) { + FRESULT res; + DIR dj; + FATFS* fs; +#if !FF_FS_READONLY + DWORD cl, bcs, clst, tm; + LBA_t sc; + FSIZE_t ofs; +#endif + DEF_NAMBUF + + if (!fp) { + return FR_INVALID_OBJECT; + } + + // Get logical drive number + + mode &= FF_FS_READONLY + ? FA_READ + : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW + | FA_OPEN_ALWAYS | FA_OPEN_APPEND; + res = mount_volume(&path, &fs, mode); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the file path + res = follow_path(&dj, path); + // Read/Write configuration +#if !FF_FS_READONLY + if (res == FR_OK) { + // Origin directory itself? + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; + } +# if FF_FS_LOCK + else { + // Check if the file can be used + res = chk_share(&dj, (mode & ~FA_READ) ? 1 : 0); + } +# endif + } + // Create or Open a file + + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + // No file, create new + if (res != FR_OK) { + // There is no file to open, create a new entry + if (res == FR_NO_FILE) { +# if FF_FS_LOCK + res = enq_share() ? dir_register(&dj) + : FR_TOO_MANY_OPEN_FILES; +# else + res = dir_register(&dj); +# endif + } + // File is created + mode |= FA_CREATE_ALWAYS; + } + // Any object with the same name is already existing + else { + // Cannot overwrite it (R/O or DIR) + if (dj.obj.attr & (AM_RDO | AM_DIR)) { + res = FR_DENIED; + } + else { + // Cannot create as new file + if (mode & FA_CREATE_NEW) { + res = FR_EXIST; + } + } + } + // Truncate the file if overwrite mode + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Get current allocation info + + fp->obj.fs = fs; + init_alloc_info(fs, &fp->obj); + // Set directory entry block initial state + + // Clear 85 entry except for NumSec + memset(fs->dirbuf + 2, 0, 30); + // Clear C0 entry except for NumName and NameHash + memset(fs->dirbuf + 38, 0, 26); + fs->dirbuf[XDIR_Attr] = AM_ARC; + st_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME()); + fs->dirbuf[XDIR_GenFlags] = 1; + res = store_xdir(&dj); + // Remove the cluster chain if exist + if (res == FR_OK && fp->obj.sclust != 0) { + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + // Reuse the cluster hole + fs->last_clst = fp->obj.sclust - 1; + } + } + else +# endif + { + // Set directory entry initial state + + // Set created time + tm = GET_FATTIME(); + st_dword(dj.dir + DIR_CrtTime, tm); + st_dword(dj.dir + DIR_ModTime, tm); + // Get current cluster chain + cl = ld_clust(fs, dj.dir); + // Reset attribute + dj.dir[DIR_Attr] = AM_ARC; + // Reset file allocation info + st_clust(fs, dj.dir, 0); + st_dword(dj.dir + DIR_FileSize, 0); + fs->wflag = 1; + // Remove the cluster chain if exist + if (cl != 0) { + sc = fs->winsect; + res = remove_chain(&dj.obj, cl, 0); + if (res == FR_OK) { + res = move_window(fs, sc); + // Reuse the cluster hole + fs->last_clst = cl - 1; + } + } + } + } + } + // Open an existing file + else { + // Is the object exsiting? + if (res == FR_OK) { + // File open against a directory + if (dj.obj.attr & AM_DIR) { + res = FR_NO_FILE; + } + else { + // Write mode open against R/O file + if ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { + res = FR_DENIED; + } + } + } + } + if (res == FR_OK) { + // Set file change flag if created or overwritten + if (mode & FA_CREATE_ALWAYS) { + mode |= FA_MODIFIED; + } + // Pointer to the directory entry + fp->dir_sect = fs->winsect; + fp->dir_ptr = dj.dir; +# if FF_FS_LOCK + // Lock the file for this session + fp->obj.lockid = inc_share(&dj, (mode & ~FA_READ) ? 1 : 0); + if (fp->obj.lockid == 0) { + res = FR_INT_ERR; + } +# endif + } + // R/O configuration +#else + if (res == FR_OK) { + // Is it origin directory itself? + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; + } + else { + // Is it a directory? + if (dj.obj.attr & AM_DIR) { + res = FR_NO_FILE; + } + } + } +#endif + + if (res == FR_OK) { +#if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Get containing directory info + fp->obj.c_scl = dj.obj.sclust; + fp->obj.c_size + = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fp->obj.c_ofs = dj.blk_ofs; + init_alloc_info(fs, &fp->obj); + } + else +#endif + { + // Get object allocation info + fp->obj.sclust = ld_clust(fs, dj.dir); + fp->obj.objsize = ld_dword(dj.dir + DIR_FileSize); + } +#if FF_USE_FASTSEEK + // Disable fast seek mode + fp->cltbl = 0; +#endif + // Validate the file object + fp->obj.fs = fs; + fp->obj.id = fs->id; + // Set file access mode + fp->flag = mode; + // Clear error flag + fp->err = 0; + // Invalidate current data sector + fp->sect = 0; + // Set file pointer top of the file + fp->fptr = 0; +#if !FF_FS_READONLY +# if !FF_FS_TINY + // Clear sector buffer + memset(fp->buf, 0, sizeof fp->buf); +# endif + // Seek to end of file if FA_OPEN_APPEND is specified + if ((mode & FA_SEEKEND) && fp->obj.objsize > 0) { + // Offset to seek + fp->fptr = fp->obj.objsize; + // Cluster size in byte + bcs = (DWORD)fs->csize * SS(fs); + // Follow the cluster chain + clst = fp->obj.sclust; + for (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; + ofs -= bcs) { + clst = get_fat(&fp->obj, clst); + if (clst <= 1) { + res = FR_INT_ERR; + } + if (clst == 0xFFFFFFFF) { + res = FR_DISK_ERR; + } + } + fp->clust = clst; + // Fill sector buffer if not on the sector boundary + if (res == FR_OK && ofs % SS(fs)) { + sc = clst2sect(fs, clst); + if (sc == 0) { + res = FR_INT_ERR; + } + else { + fp->sect = sc + (DWORD)(ofs / SS(fs)); +# if !FF_FS_TINY + if (disk_read(fs->pdrv, fp->buf, fp->sect, 1) + != RES_OK) { + res = FR_DISK_ERR; + } +# endif + } + } +# if FF_FS_LOCK + // Decrement file open counter if seek failed + if (res != FR_OK) { + dec_share(fp->obj.lockid); + } +# endif + } +#endif + } + + FREE_NAMBUF(); + } + + // Invalidate file object on error + if (res != FR_OK) { + fp->obj.fs = 0; + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Read File + +//----------------------------------------------------------------------- + +FRESULT f_read(FIL* fp, void* buff, UINT btr, UINT* br) { + FRESULT res; + FATFS* fs; + DWORD clst; + LBA_t sect; + FSIZE_t remain; + UINT rcnt, cc, csect; + BYTE* rbuff = (BYTE*)buff; + + // Clear read byte counter + *br = 0; + // Check validity of the file object + res = validate(&fp->obj, &fs); + // Check validity + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) { + LEAVE_FF(fs, res); + } + // Check access mode + if (!(fp->flag & FA_READ)) { + LEAVE_FF(fs, FR_DENIED); + } + remain = fp->obj.objsize - fp->fptr; + // Truncate btr by remaining bytes + if (btr > remain) { + btr = (UINT)remain; + } + + // Repeat until btr bytes read + for (; btr > 0; btr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) { + // On the sector boundary? + if (fp->fptr % SS(fs) == 0) { + // Sector offset in the cluster + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); + // On the cluster boundary? + if (csect == 0) { + // On the top of the file? + if (fp->fptr == 0) { + // Follow cluster chain from the origin + clst = fp->obj.sclust; + // Middle or end of the file + } + else { +#if FF_USE_FASTSEEK + if (fp->cltbl) { + // Get cluster# from the CLMT + clst = clmt_clust(fp, fp->fptr); + } + else +#endif + { + // Follow cluster chain on the FAT + clst = get_fat(&fp->obj, fp->clust); + } + } + if (clst < 2) { + ABORT(fs, FR_INT_ERR); + } + if (clst == 0xFFFFFFFF) { + ABORT(fs, FR_DISK_ERR); + } + // Update current cluster + fp->clust = clst; + } + // Get current sector + sect = clst2sect(fs, fp->clust); + if (sect == 0) { + ABORT(fs, FR_INT_ERR); + } + sect += csect; + // When remaining bytes >= sector size, + cc = btr / SS(fs); + // Read maximum contiguous sectors directly + if (cc > 0) { + // Clip at cluster boundary + if (csect + cc > fs->csize) { + cc = fs->csize - csect; + } + if (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + // Replace one of the read sectors with cached data if it + // contains a dirty sector +#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2 +# if FF_FS_TINY + if (fs->wflag && fs->winsect - sect < cc) { + memcpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, + SS(fs)); + } +# else + if ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) { + memcpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, + SS(fs)); + } +# endif +#endif + // Number of bytes transferred + rcnt = SS(fs) * cc; + continue; + } +#if !FF_FS_TINY + // Load data sector if not in cache + if (fp->sect != sect) { +# if !FF_FS_READONLY + // Write-back dirty sector cache + if (fp->flag & FA_DIRTY) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif + // Fill sector cache + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + } +#endif + fp->sect = sect; + } + // Number of bytes remains in the sector + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); + // Clip it by btr if needed + if (rcnt > btr) { + rcnt = btr; + } +#if FF_FS_TINY + // Move sector window + if (move_window(fs, fp->sect) != FR_OK) { + ABORT(fs, FR_DISK_ERR); + } + // Extract partial sector + memcpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt); +#else + // Extract partial sector + memcpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt); +#endif + } + + LEAVE_FF(fs, FR_OK); +} + +#if !FF_FS_READONLY +//----------------------------------------------------------------------- + +// Write File + +//----------------------------------------------------------------------- + +FRESULT f_write(FIL* fp, const void* buff, UINT btw, UINT* bw) { + FRESULT res; + FATFS* fs; + DWORD clst; + LBA_t sect; + UINT wcnt, cc, csect; + const BYTE* wbuff = (const BYTE*)buff; + + // Clear write byte counter + *bw = 0; + // Check validity of the file object + res = validate(&fp->obj, &fs); + // Check validity + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) { + LEAVE_FF(fs, res); + } + // Check access mode + if (!(fp->flag & FA_WRITE)) { + LEAVE_FF(fs, FR_DENIED); + } + + // Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) + + if ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) + && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) { + btw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr); + } + + // Repeat until all data written + for (; btw > 0; btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, + fp->obj.objsize = (fp->fptr > fp->obj.objsize) + ? fp->fptr + : fp->obj.objsize) { + // On the sector boundary? + if (fp->fptr % SS(fs) == 0) { + // Sector offset in the cluster + csect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1); + // On the cluster boundary? + if (csect == 0) { + // On the top of the file? + if (fp->fptr == 0) { + // Follow from the origin + clst = fp->obj.sclust; + // If no cluster is allocated, + if (clst == 0) { + // create a new cluster chain + clst = create_chain(&fp->obj, 0); + } + // On the middle or end of the file + } + else { +# if FF_USE_FASTSEEK + if (fp->cltbl) { + // Get cluster# from the CLMT + clst = clmt_clust(fp, fp->fptr); + } + else +# endif + { + // Follow or stretch cluster chain on the FAT + clst = create_chain(&fp->obj, fp->clust); + } + } + // Could not allocate a new cluster (disk full) + if (clst == 0) { + break; + } + if (clst == 1) { + ABORT(fs, FR_INT_ERR); + } + if (clst == 0xFFFFFFFF) { + ABORT(fs, FR_DISK_ERR); + } + // Update current cluster + fp->clust = clst; + // Set start cluster if the first write + if (fp->obj.sclust == 0) { + fp->obj.sclust = clst; + } + } +# if FF_FS_TINY + // Write-back sector cache + if (fs->winsect == fp->sect && sync_window(fs) != FR_OK) { + ABORT(fs, FR_DISK_ERR); + } +# else + // Write-back sector cache + if (fp->flag & FA_DIRTY) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif + // Get current sector + sect = clst2sect(fs, fp->clust); + if (sect == 0) { + ABORT(fs, FR_INT_ERR); + } + sect += csect; + // When remaining bytes >= sector size, + cc = btw / SS(fs); + // Write maximum contiguous sectors directly + if (cc > 0) { + // Clip at cluster boundary + if (csect + cc > fs->csize) { + cc = fs->csize - csect; + } + if (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +# if FF_FS_MINIMIZE <= 2 +# if FF_FS_TINY + // Refill sector cache if it gets invalidated by the direct + // write + if (fs->winsect - sect < cc) { + memcpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), + SS(fs)); + fs->wflag = 0; + } +# else + // Refill sector cache if it gets invalidated by the direct + // write + if (fp->sect - sect < cc) { + memcpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), + SS(fs)); + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif +# endif + // Number of bytes transferred + wcnt = SS(fs) * cc; + continue; + } +# if FF_FS_TINY + // Avoid silly cache filling on the growing edge + if (fp->fptr >= fp->obj.objsize) { + if (sync_window(fs) != FR_OK) { + ABORT(fs, FR_DISK_ERR); + } + fs->winsect = sect; + } +# else + // Fill sector cache with file data + if (fp->sect != sect && fp->fptr < fp->obj.objsize + && disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +# endif + fp->sect = sect; + } + // Number of bytes remains in the sector + wcnt = SS(fs) - (UINT)fp->fptr % SS(fs); + // Clip it by btw if needed + if (wcnt > btw) { + wcnt = btw; + } +# if FF_FS_TINY + // Move sector window + if (move_window(fs, fp->sect) != FR_OK) { + ABORT(fs, FR_DISK_ERR); + } + // Fit data to the sector + memcpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt); + fs->wflag = 1; +# else + // Fit data to the sector + memcpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt); + fp->flag |= FA_DIRTY; +# endif + } + + // Set file change flag + fp->flag |= FA_MODIFIED; + + LEAVE_FF(fs, FR_OK); +} + +//----------------------------------------------------------------------- + +// Synchronize the File + +//----------------------------------------------------------------------- + +FRESULT f_sync(FIL* fp) { + FRESULT res; + FATFS* fs; + DWORD tm; + BYTE* dir; + + // Check validity of the file object + res = validate(&fp->obj, &fs); + if (res == FR_OK) { + // Is there any change to the file? + if (fp->flag & FA_MODIFIED) { +# if !FF_FS_TINY + // Write-back cached data if needed + if (fp->flag & FA_DIRTY) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + LEAVE_FF(fs, FR_DISK_ERR); + } + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif + // Update the directory entry + + // Modified time + tm = GET_FATTIME(); +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Fill first fragment on the FAT if needed + res = fill_first_frag(&fp->obj); + if (res == FR_OK) { + // Fill last fragment on the FAT if needed + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); + } + if (res == FR_OK) { + DIR dj; + DEF_NAMBUF + + INIT_NAMBUF(fs); + // Load directory entry block + res = load_obj_xdir(&dj, &fp->obj); + if (res == FR_OK) { + // Set archive attribute to indicate that the file has + // been changed + fs->dirbuf[XDIR_Attr] |= AM_ARC; + // Update file allocation information + fs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1; + // Update start cluster + st_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust); + // Update file size + st_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize); + // (FatFs does not support Valid File Size feature) + st_qword(fs->dirbuf + XDIR_ValidFileSize, + fp->obj.objsize); + // Update modified time + st_dword(fs->dirbuf + XDIR_ModTime, tm); + fs->dirbuf[XDIR_ModTime10] = 0; + st_dword(fs->dirbuf + XDIR_AccTime, 0); + // Restore it to the directory + res = store_xdir(&dj); + if (res == FR_OK) { + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + FREE_NAMBUF(); + } + } + else +# endif + { + res = move_window(fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + // Set archive attribute to indicate that the file has been + // changed + dir[DIR_Attr] |= AM_ARC; + // Update file allocation information + st_clust(fp->obj.fs, dir, fp->obj.sclust); + // Update file size + st_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize); + // Update modified time + st_dword(dir + DIR_ModTime, tm); + st_word(dir + DIR_LstAccDate, 0); + fs->wflag = 1; + // Restore it to the directory + res = sync_fs(fs); + fp->flag &= (BYTE)~FA_MODIFIED; + } + } + } + } + + LEAVE_FF(fs, res); +} + +// !FF_FS_READONLY +#endif + +//----------------------------------------------------------------------- + +// Close File + +//----------------------------------------------------------------------- + +FRESULT f_close(FIL* fp) { + FRESULT res; + FATFS* fs; + +#if !FF_FS_READONLY + // Flush cached data + res = f_sync(fp); + if (res == FR_OK) +#endif + { + // Lock volume + res = validate(&fp->obj, &fs); + if (res == FR_OK) { +#if FF_FS_LOCK + // Decrement file open counter + res = dec_share(fp->obj.lockid); + // Invalidate file object + if (res == FR_OK) { + fp->obj.fs = 0; + } +#else + // Invalidate file object + fp->obj.fs = 0; +#endif +#if FF_FS_REENTRANT + // Unlock volume + unlock_volume(fs, FR_OK); +#endif + } + } + return res; +} + +#if FF_FS_RPATH >= 1 +//----------------------------------------------------------------------- + +// Change Current Directory or Current Drive, Get Current Directory + +//----------------------------------------------------------------------- + +FRESULT f_chdrive(const TCHAR* path) { + int vol; + + // Get logical drive number + + vol = get_ldnumber(&path); + if (vol < 0) { + return FR_INVALID_DRIVE; + } + // Set it as current volume + CurrVol = (BYTE)vol; + + return FR_OK; +} + +FRESULT f_chdir(const TCHAR* path) { +# if FF_STR_VOLUME_ID == 2 + UINT i; +# endif + FRESULT res; + DIR dj; + FATFS* fs; + DEF_NAMBUF + + // Get logical drive + + res = mount_volume(&path, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the path + res = follow_path(&dj, path); + // Follow completed + if (res == FR_OK) { + // Is it the start directory itself? + if (dj.fn[NSFLAG] & NS_NONAME) { + fs->cdir = dj.obj.sclust; +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + fs->cdc_scl = dj.obj.c_scl; + fs->cdc_size = dj.obj.c_size; + fs->cdc_ofs = dj.obj.c_ofs; + } +# endif + } + else { + // It is a sub-directory + if (dj.obj.attr & AM_DIR) { +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Sub-directory cluster + fs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus); + // Save containing directory information + fs->cdc_scl = dj.obj.sclust; + fs->cdc_size + = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat; + fs->cdc_ofs = dj.blk_ofs; + } + else +# endif + { + // Sub-directory cluster + fs->cdir = ld_clust(fs, dj.dir); + } + } + else { + // Reached but a file + res = FR_NO_PATH; + } + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) { + res = FR_NO_PATH; + } + // Also current drive is changed if in Unix style volume ID +# if FF_STR_VOLUME_ID == 2 + if (res == FR_OK) { + // Set current drive + for (i = FF_VOLUMES - 1; i && fs != FatFs[i]; i--) + ; + CurrVol = (BYTE)i; + } +# endif + } + + LEAVE_FF(fs, res); +} + +# if FF_FS_RPATH >= 2 +FRESULT f_getcwd(TCHAR* buff, UINT len) { + FRESULT res; + DIR dj; + FATFS* fs; + UINT i, n; + DWORD ccl; + TCHAR* tp = buff; +# if FF_VOLUMES >= 2 + UINT vl; +# if FF_STR_VOLUME_ID + const char* vp; +# endif +# endif + FILINFO fno; + DEF_NAMBUF + + // Get logical drive + + // Set null string to get current volume + buff[0] = 0; + // Get current volume + res = mount_volume((const TCHAR**)&buff, &fs, 0); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + + // Follow parent directories and create the path + + // Bottom of buffer (directory stack base) + i = len; + // (Cannot do getcwd on exFAT and returns root path) + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + // Start to follow upper directory from current directory + dj.obj.sclust = fs->cdir; + // Repeat while current directory is a sub-directory + while ((ccl = dj.obj.sclust) != 0) { + // Get parent directory + res = dir_sdi(&dj, 1 * SZDIRE); + if (res != FR_OK) { + break; + } + res = move_window(fs, dj.sect); + if (res != FR_OK) { + break; + } + // Goto parent directory + dj.obj.sclust = ld_clust(fs, dj.dir); + res = dir_sdi(&dj, 0); + if (res != FR_OK) { + break; + } + // Find the entry links to the child directory + do { + res = DIR_READ_FILE(&dj); + if (res != FR_OK) { + break; + } + // Found the entry + if (ccl == ld_clust(fs, dj.dir)) { + break; + } + res = dir_next(&dj, 0); + } while (res == FR_OK); + // It cannot be 'not found'. + if (res == FR_NO_FILE) { + res = FR_INT_ERR; + } + if (res != FR_OK) { + break; + } + // Get the directory name and push it to the buffer + get_fileinfo(&dj, &fno); + // Name length + for (n = 0; fno.fname[n]; n++) + ; + // Insufficient space to store the path name? + if (i < n + 1) { + res = FR_NOT_ENOUGH_CORE; + break; + } + // Stack the name + while (n) { + buff[--i] = fno.fname[--n]; + } + buff[--i] = '/'; + } + } + if (res == FR_OK) { + // Is it the root-directory? + if (i == len) { + buff[--i] = '/'; + } + // Put drive prefix +# if FF_VOLUMES >= 2 + vl = 0; + // String volume ID +# if FF_STR_VOLUME_ID >= 1 + for (n = 0, vp = (const char*)VolumeStr[CurrVol]; vp[n]; n++) + ; + if (i >= n + 2) { + if (FF_STR_VOLUME_ID == 2) { + *tp++ = (TCHAR)'/'; + } + for (vl = 0; vl < n; *tp++ = (TCHAR)vp[vl], vl++) + ; + if (FF_STR_VOLUME_ID == 1) { + *tp++ = (TCHAR)':'; + } + vl++; + } + // Numeric volume ID +# else + if (i >= 3) { + *tp++ = (TCHAR)'0' + CurrVol; + *tp++ = (TCHAR)':'; + vl = 2; + } +# endif + if (vl == 0) { + res = FR_NOT_ENOUGH_CORE; + } +# endif + // Add current directory path + + if (res == FR_OK) { + // Copy stacked path string + do { + *tp++ = buff[i++]; + } while (i < len); + } + } + FREE_NAMBUF(); + } + + *tp = 0; + LEAVE_FF(fs, res); +} + +// FF_FS_RPATH >= 2 +# endif +// FF_FS_RPATH >= 1 +#endif + +#if FF_FS_MINIMIZE <= 2 +//----------------------------------------------------------------------- + +// Seek File Read/Write Pointer + +//----------------------------------------------------------------------- + +FRESULT f_lseek(FIL* fp, FSIZE_t ofs) { + FRESULT res; + FATFS* fs; + DWORD clst, bcs; + LBA_t nsect; + FSIZE_t ifptr; +# if FF_USE_FASTSEEK + DWORD cl, pcl, ncl, tcl, tlen, ulen; + DWORD* tbl; + LBA_t dsc; +# endif + + // Check validity of the file object + res = validate(&fp->obj, &fs); + if (res == FR_OK) { + res = (FRESULT)fp->err; + } +# if FF_FS_EXFAT && !FF_FS_READONLY + if (res == FR_OK && fs->fs_type == FS_EXFAT) { + // Fill last fragment on the FAT if needed + res = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF); + } +# endif + if (res != FR_OK) { + LEAVE_FF(fs, res); + } + +# if FF_USE_FASTSEEK + // Fast seek + if (fp->cltbl) { + // Create CLMT + if (ofs == CREATE_LINKMAP) { + tbl = fp->cltbl; + // Given table size and required table size + tlen = *tbl++; + ulen = 2; + // Origin of the chain + cl = fp->obj.sclust; + if (cl != 0) { + do { + // Get a fragment + + // Top, length and used items + tcl = cl; + ncl = 0; + ulen += 2; + do { + pcl = cl; + ncl++; + cl = get_fat(&fp->obj, cl); + if (cl <= 1) { + ABORT(fs, FR_INT_ERR); + } + if (cl == 0xFFFFFFFF) { + ABORT(fs, FR_DISK_ERR); + } + } while (cl == pcl + 1); + // Store the length and top of the fragment + if (ulen <= tlen) { + *tbl++ = ncl; + *tbl++ = tcl; + } + // Repeat until end of chain + } while (cl < fs->n_fatent); + } + // Number of items used + *fp->cltbl = ulen; + if (ulen <= tlen) { + // Terminate table + *tbl = 0; + } + else { + // Given table size is smaller than required + res = FR_NOT_ENOUGH_CORE; + } + // Fast seek + } + else { + // Clip offset at the file size + if (ofs > fp->obj.objsize) { + ofs = fp->obj.objsize; + } + // Set file pointer + fp->fptr = ofs; + if (ofs > 0) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clst2sect(fs, fp->clust); + if (dsc == 0) { + ABORT(fs, FR_INT_ERR); + } + dsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1); + // Refill sector cache if needed + if (fp->fptr % SS(fs) && dsc != fp->sect) { +# if !FF_FS_TINY +# if !FF_FS_READONLY + // Write-back dirty sector cache + if (fp->flag & FA_DIRTY) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) + != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif + // Load current sector + if (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +# endif + fp->sect = dsc; + } + } + } + } + else +# endif + + // Normal Seek + + { +# if FF_FS_EXFAT + // Clip at 4 GiB - 1 if at FATxx + if (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) { + ofs = 0xFFFFFFFF; + } +# endif + // In read-only mode, clip offset with the file size + if (ofs > fp->obj.objsize + && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) { + ofs = fp->obj.objsize; + } + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs > 0) { + // Cluster size (byte) + bcs = (DWORD)fs->csize * SS(fs); + if (ifptr > 0 && + // When seek to same or following cluster, + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { + // start from the current cluster + fp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1); + ofs -= fp->fptr; + clst = fp->clust; + // When seek to back cluster, + } + else { + // start from the first cluster + clst = fp->obj.sclust; +# if !FF_FS_READONLY + // If no cluster chain, create a new chain + if (clst == 0) { + clst = create_chain(&fp->obj, 0); + if (clst == 1) { + ABORT(fs, FR_INT_ERR); + } + if (clst == 0xFFFFFFFF) { + ABORT(fs, FR_DISK_ERR); + } + fp->obj.sclust = clst; + } +# endif + fp->clust = clst; + } + if (clst != 0) { + // Cluster following loop + while (ofs > bcs) { + ofs -= bcs; + fp->fptr += bcs; +# if !FF_FS_READONLY + // Check if in write mode or not + if (fp->flag & FA_WRITE) { + // No FAT chain object needs correct objsize to generate + // FAT value + if (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) { + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + // Follow chain with forceed stretch + clst = create_chain(&fp->obj, clst); + // Clip file size in case of disk full + if (clst == 0) { + ofs = 0; + break; + } + } + else +# endif + { + // Follow cluster chain if not in write mode + clst = get_fat(&fp->obj, clst); + } + if (clst == 0xFFFFFFFF) { + ABORT(fs, FR_DISK_ERR); + } + if (clst <= 1 || clst >= fs->n_fatent) { + ABORT(fs, FR_INT_ERR); + } + fp->clust = clst; + } + fp->fptr += ofs; + if (ofs % SS(fs)) { + // Current sector + nsect = clst2sect(fs, clst); + if (nsect == 0) { + ABORT(fs, FR_INT_ERR); + } + nsect += (DWORD)(ofs / SS(fs)); + } + } + } + // Set file change flag if the file size is extended + if (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) { + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; + } + // Fill sector cache if needed + if (fp->fptr % SS(fs) && nsect != fp->sect) { +# if !FF_FS_TINY +# if !FF_FS_READONLY + // Write-back dirty sector cache + if (fp->flag & FA_DIRTY) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif + // Fill sector cache + if (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } +# endif + fp->sect = nsect; + } + } + + LEAVE_FF(fs, res); +} + +# if FF_FS_MINIMIZE <= 1 +//----------------------------------------------------------------------- + +// Create a Directory Object + +//----------------------------------------------------------------------- + +FRESULT f_opendir(DIR* dp, const TCHAR* path) { + FRESULT res; + FATFS* fs; + DEF_NAMBUF + + if (!dp) { + return FR_INVALID_OBJECT; + } + + // Get logical drive + + res = mount_volume(&path, &fs, 0); + if (res == FR_OK) { + dp->obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the path to the directory + res = follow_path(dp, path); + // Follow completed + if (res == FR_OK) { + // It is not the origin directory itself + if (!(dp->fn[NSFLAG] & NS_NONAME)) { + // This object is a sub-directory + if (dp->obj.attr & AM_DIR) { +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Get containing directory inforamation + dp->obj.c_scl = dp->obj.sclust; + dp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) + | dp->obj.stat; + dp->obj.c_ofs = dp->blk_ofs; + // Get object allocation info + init_alloc_info(fs, &dp->obj); + } + else +# endif + { + // Get object allocation info + dp->obj.sclust = ld_clust(fs, dp->dir); + } + // This object is a file + } + else { + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dp->obj.id = fs->id; + // Rewind directory + res = dir_sdi(dp, 0); +# if FF_FS_LOCK + if (res == FR_OK) { + if (dp->obj.sclust != 0) { + // Lock the sub directory + dp->obj.lockid = inc_share(dp, 0); + if (!dp->obj.lockid) { + res = FR_TOO_MANY_OPEN_FILES; + } + } + else { + // Root directory need not to be locked + dp->obj.lockid = 0; + } + } +# endif + } + } + FREE_NAMBUF(); + if (res == FR_NO_FILE) { + res = FR_NO_PATH; + } + } + // Invalidate the directory object if function failed + if (res != FR_OK) { + dp->obj.fs = 0; + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Close Directory + +//----------------------------------------------------------------------- + +FRESULT f_closedir(DIR* dp) { + FRESULT res; + FATFS* fs; + + // Check validity of the file object + res = validate(&dp->obj, &fs); + if (res == FR_OK) { +# if FF_FS_LOCK + // Decrement sub-directory open counter + if (dp->obj.lockid) { + res = dec_share(dp->obj.lockid); + } + // Invalidate directory object + if (res == FR_OK) { + dp->obj.fs = 0; + } +# else + // Invalidate directory object + dp->obj.fs = 0; +# endif +# if FF_FS_REENTRANT + // Unlock volume + unlock_volume(fs, FR_OK); +# endif + } + return res; +} + +//----------------------------------------------------------------------- + +// Read Directory Entries in Sequence + +//----------------------------------------------------------------------- + +FRESULT f_readdir(DIR* dp, FILINFO* fno) { + FRESULT res; + FATFS* fs; + DEF_NAMBUF + + // Check validity of the directory object + res = validate(&dp->obj, &fs); + if (res == FR_OK) { + if (!fno) { + // Rewind the directory object + res = dir_sdi(dp, 0); + } + else { + INIT_NAMBUF(fs); + // Read an item + res = DIR_READ_FILE(dp); + // Ignore end of directory + if (res == FR_NO_FILE) { + res = FR_OK; + } + // A valid entry is found + if (res == FR_OK) { + // Get the object information + get_fileinfo(dp, fno); + // Increment index for next + res = dir_next(dp, 0); + // Ignore end of directory now + if (res == FR_NO_FILE) { + res = FR_OK; + } + } + FREE_NAMBUF(); + } + } + LEAVE_FF(fs, res); +} + +# if FF_USE_FIND + +// Find Next File +FRESULT f_findnext(DIR* dp, FILINFO* fno) { + FRESULT res; + + for (;;) { + // Get a directory item + res = f_readdir(dp, fno); + // Terminate if any error or end of directory + if (res != FR_OK || !fno || !fno->fname[0]) { + break; + } + // Test for the file name + if (pattern_match(dp->pat, fno->fname, 0, FIND_RECURS)) { + break; + } +# if FF_USE_LFN && FF_USE_FIND == 2 + // Test for alternative name if exist + if (pattern_match(dp->pat, fno->altname, 0, FIND_RECURS)) { + break; + } +# endif + } + return res; +} + +// Find First File +FRESULT +f_findfirst(DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern) { + FRESULT res; + + // Save pointer to pattern string + dp->pat = pattern; + // Open the target directory + res = f_opendir(dp, path); + if (res == FR_OK) { + // Find the first item + res = f_findnext(dp, fno); + } + return res; +} + +// FF_USE_FIND +# endif + +# if FF_FS_MINIMIZE == 0 +//----------------------------------------------------------------------- + +// Get File Status + +//----------------------------------------------------------------------- + +FRESULT f_stat(const TCHAR* path, FILINFO* fno) { + FRESULT res; + DIR dj; + DEF_NAMBUF + + // Get logical drive + + res = mount_volume(&path, &dj.obj.fs, 0); + if (res == FR_OK) { + INIT_NAMBUF(dj.obj.fs); + // Follow the file path + res = follow_path(&dj, path); + // Follow completed + if (res == FR_OK) { + // It is origin directory + if (dj.fn[NSFLAG] & NS_NONAME) { + res = FR_INVALID_NAME; + // Found an object + } + else { + if (fno) { + get_fileinfo(&dj, fno); + } + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(dj.obj.fs, res); +} + +# if !FF_FS_READONLY +//----------------------------------------------------------------------- + +// Get Number of Free Clusters + +//----------------------------------------------------------------------- + +FRESULT f_getfree(const TCHAR* path, DWORD* nclst, FATFS** fatfs) { + FRESULT res; + FATFS* fs; + DWORD nfree, clst, stat; + LBA_t sect; + UINT i; + FFOBJID obj; + + // Get logical drive + + res = mount_volume(&path, &fs, 0); + if (res == FR_OK) { + // Return ptr to the fs object + *fatfs = fs; + // If free_clst is valid, return it without full FAT scan + + if (fs->free_clst <= fs->n_fatent - 2) { + *nclst = fs->free_clst; + } + else { + // Scan FAT to obtain number of free clusters + + nfree = 0; + // FAT12: Scan bit field FAT entries + if (fs->fs_type == FS_FAT12) { + clst = 2; + obj.fs = fs; + do { + stat = get_fat(&obj, clst); + if (stat == 0xFFFFFFFF) { + res = FR_DISK_ERR; + break; + } + if (stat == 1) { + res = FR_INT_ERR; + break; + } + if (stat == 0) { + nfree++; + } + } while (++clst < fs->n_fatent); + } + else { +# if FF_FS_EXFAT + // exFAT: Scan allocation bitmap + if (fs->fs_type == FS_EXFAT) { + BYTE bm; + UINT b; + + // Number of clusters + clst = fs->n_fatent - 2; + // Bitmap sector + sect = fs->bitbase; + // Offset in the sector + i = 0; + // Counts numbuer of bits with zero in the bitmap + do { + // New sector? + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) { + break; + } + } + for (b = 8, bm = ~fs->win[i]; b && clst; b--, clst--) { + nfree += bm & 1; + bm >>= 1; + } + i = (i + 1) % SS(fs); + } while (clst); + } + else +# endif + // FAT16/32: Scan WORD/DWORD FAT entries + { + // Number of entries + clst = fs->n_fatent; + // Top of the FAT + sect = fs->fatbase; + // Offset in the sector + i = 0; + // Counts numbuer of entries with zero in the FAT + do { + // New sector? + if (i == 0) { + res = move_window(fs, sect++); + if (res != FR_OK) { + break; + } + } + if (fs->fs_type == FS_FAT16) { + if (ld_word(fs->win + i) == 0) { + nfree++; + } + i += 2; + } + else { + if ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) { + nfree++; + } + i += 4; + } + i %= SS(fs); + } while (--clst); + } + } + // Update parameters if succeeded + if (res == FR_OK) { + // Return the free clusters + *nclst = nfree; + // Now free_clst is valid + fs->free_clst = nfree; + // FAT32: FSInfo is to be updated + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Truncate File + +//----------------------------------------------------------------------- + +FRESULT f_truncate(FIL* fp) { + FRESULT res; + FATFS* fs; + DWORD ncl; + + // Check validity of the file object + res = validate(&fp->obj, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) { + LEAVE_FF(fs, res); + } + // Check access mode + if (!(fp->flag & FA_WRITE)) { + LEAVE_FF(fs, FR_DENIED); + } + + // Process when fptr is not on the eof + if (fp->fptr < fp->obj.objsize) { + // When set file size to zero, remove entire cluster chain + if (fp->fptr == 0) { + res = remove_chain(&fp->obj, fp->obj.sclust, 0); + fp->obj.sclust = 0; + // When truncate a part of the file, remove remaining clusters + } + else { + ncl = get_fat(&fp->obj, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) { + res = FR_DISK_ERR; + } + if (ncl == 1) { + res = FR_INT_ERR; + } + if (res == FR_OK && ncl < fs->n_fatent) { + res = remove_chain(&fp->obj, ncl, fp->clust); + } + } + // Set file size to current read/write point + fp->obj.objsize = fp->fptr; + fp->flag |= FA_MODIFIED; +# if !FF_FS_TINY + if (res == FR_OK && (fp->flag & FA_DIRTY)) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + res = FR_DISK_ERR; + } + else { + fp->flag &= (BYTE)~FA_DIRTY; + } + } +# endif + if (res != FR_OK) { + ABORT(fs, res); + } + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Delete a File/Directory + +//----------------------------------------------------------------------- + +FRESULT f_unlink(const TCHAR* path) { + FRESULT res; + FATFS* fs; + DIR dj, sdj; + DWORD dclst = 0; +# if FF_FS_EXFAT + FFOBJID obj; +# endif + DEF_NAMBUF + + // Get logical drive + + res = mount_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the file path + res = follow_path(&dj, path); + if (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) { + // Cannot remove dot entry + res = FR_INVALID_NAME; + } +# if FF_FS_LOCK + // Check if it is an open object + if (res == FR_OK) { + res = chk_share(&dj, 2); + } +# endif + // The object is accessible + if (res == FR_OK) { + if (dj.fn[NSFLAG] & NS_NONAME) { + // Cannot remove the origin directory + res = FR_INVALID_NAME; + } + else { + if (dj.obj.attr & AM_RDO) { + // Cannot remove R/O object + res = FR_DENIED; + } + } + if (res == FR_OK) { +# if FF_FS_EXFAT + obj.fs = fs; + if (fs->fs_type == FS_EXFAT) { + init_alloc_info(fs, &obj); + dclst = obj.sclust; + } + else +# endif + { + dclst = ld_clust(fs, dj.dir); + } + // Is it a sub-directory? + if (dj.obj.attr & AM_DIR) { +# if FF_FS_RPATH != 0 + // Is it the current directory? + if (dclst == fs->cdir) { + res = FR_DENIED; + } + else +# endif + { + // Open the sub-directory + sdj.obj.fs = fs; + sdj.obj.sclust = dclst; +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + sdj.obj.objsize = obj.objsize; + sdj.obj.stat = obj.stat; + } +# endif + res = dir_sdi(&sdj, 0); + if (res == FR_OK) { + // Test if the directory is empty + res = DIR_READ_FILE(&sdj); + // Not empty? + if (res == FR_OK) { + res = FR_DENIED; + } + // Empty? + if (res == FR_NO_FILE) { + res = FR_OK; + } + } + } + } + } + if (res == FR_OK) { + // Remove the directory entry + res = dir_remove(&dj); + // Remove the cluster chain if exist + if (res == FR_OK && dclst != 0) { +# if FF_FS_EXFAT + res = remove_chain(&obj, dclst, 0); +# else + res = remove_chain(&dj.obj, dclst, 0); +# endif + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Create a Directory + +//----------------------------------------------------------------------- + +FRESULT f_mkdir(const TCHAR* path) { + FRESULT res; + FATFS* fs; + DIR dj; + FFOBJID sobj; + DWORD dcl, pcl, tm; + DEF_NAMBUF + + // Get logical drive + res = mount_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the file path + res = follow_path(&dj, path); + // Name collision? + if (res == FR_OK) { + res = FR_EXIST; + } + // Invalid name? + if (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) { + res = FR_INVALID_NAME; + } + // It is clear to create a new directory + if (res == FR_NO_FILE) { + // New object id to create a new chain + sobj.fs = fs; + // Allocate a cluster for the new directory + dcl = create_chain(&sobj, 0); + res = FR_OK; + // No space to allocate a new cluster? + if (dcl == 0) { + res = FR_DENIED; + } + // Any insanity? + if (dcl == 1) { + res = FR_INT_ERR; + } + // Disk error? + if (dcl == 0xFFFFFFFF) { + res = FR_DISK_ERR; + } + tm = GET_FATTIME(); + if (res == FR_OK) { + // Clean up the new table + res = dir_clear(fs, dcl); + if (res == FR_OK) { + // Create dot entries (FAT only) + if (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) { + // Create "." entry + memset(fs->win + DIR_Name, ' ', 11); + fs->win[DIR_Name] = '.'; + fs->win[DIR_Attr] = AM_DIR; + st_dword(fs->win + DIR_ModTime, tm); + st_clust(fs, fs->win, dcl); + // Create ".." entry + memcpy(fs->win + SZDIRE, fs->win, SZDIRE); + fs->win[SZDIRE + 1] = '.'; + pcl = dj.obj.sclust; + st_clust(fs, fs->win + SZDIRE, pcl); + fs->wflag = 1; + } + // Register the object to the parent directoy + res = dir_register(&dj); + } + } + if (res == FR_OK) { +# if FF_FS_EXFAT + // Initialize directory entry block + if (fs->fs_type == FS_EXFAT) { + // Created time + st_dword(fs->dirbuf + XDIR_ModTime, tm); + // Table start cluster + st_dword(fs->dirbuf + XDIR_FstClus, dcl); + // Directory size needs to be valid + st_dword(fs->dirbuf + XDIR_FileSize, + (DWORD)fs->csize * SS(fs)); + st_dword(fs->dirbuf + XDIR_ValidFileSize, + (DWORD)fs->csize * SS(fs)); + // Initialize the object flag + fs->dirbuf[XDIR_GenFlags] = 3; + // Attribute + fs->dirbuf[XDIR_Attr] = AM_DIR; + res = store_xdir(&dj); + } + else +# endif + { + // Created time + st_dword(dj.dir + DIR_ModTime, tm); + // Table start cluster + st_clust(fs, dj.dir, dcl); + // Attribute + dj.dir[DIR_Attr] = AM_DIR; + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + else { + // Could not register, remove the allocated cluster + remove_chain(&sobj, dcl, 0); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Rename a File/Directory + +//----------------------------------------------------------------------- + +FRESULT f_rename(const TCHAR* path_old, const TCHAR* path_new) { + FRESULT res; + FATFS* fs; + DIR djo, djn; + BYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir; + LBA_t sect; + DEF_NAMBUF + + // Snip the drive number of new name off + get_ldnumber(&path_new); + // Get logical drive of the old object + res = mount_volume(&path_old, &fs, FA_WRITE); + if (res == FR_OK) { + djo.obj.fs = fs; + INIT_NAMBUF(fs); + // Check old object + res = follow_path(&djo, path_old); + // Check validity of name + if (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) { + res = FR_INVALID_NAME; + } +# if FF_FS_LOCK + if (res == FR_OK) { + res = chk_share(&djo, 2); + } +# endif + // Object to be renamed is found + if (res == FR_OK) { +# if FF_FS_EXFAT + // At exFAT volume + if (fs->fs_type == FS_EXFAT) { + BYTE nf, nn; + WORD nh; + + // Save 85+C0 entry of old object + memcpy(buf, fs->dirbuf, SZDIRE * 2); + memcpy(&djn, &djo, sizeof djo); + // Make sure if new object name is not in use + res = follow_path(&djn, path_new); + // Is new name already in use by any other object? + if (res == FR_OK) { + res = (djn.obj.sclust == djo.obj.sclust + && djn.dptr == djo.dptr) + ? FR_NO_FILE + : FR_EXIST; + } + // It is a valid path and no name collision + if (res == FR_NO_FILE) { + // Register the new entry + res = dir_register(&djn); + if (res == FR_OK) { + nf = fs->dirbuf[XDIR_NumSec]; + nn = fs->dirbuf[XDIR_NumName]; + nh = ld_word(fs->dirbuf + XDIR_NameHash); + // Restore 85+C0 entry + memcpy(fs->dirbuf, buf, SZDIRE * 2); + fs->dirbuf[XDIR_NumSec] = nf; + fs->dirbuf[XDIR_NumName] = nn; + st_word(fs->dirbuf + XDIR_NameHash, nh); + // Set archive attribute if it is a file + if (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) { + fs->dirbuf[XDIR_Attr] |= AM_ARC; + } + // Start of critical section where an interruption can + // cause a cross-link + + res = store_xdir(&djn); + } + } + } + else +# endif + // At FAT/FAT32 volume + { + // Save directory entry of the object + memcpy(buf, djo.dir, SZDIRE); + // Duplicate the directory object + memcpy(&djn, &djo, sizeof(DIR)); + // Make sure if new object name is not in use + res = follow_path(&djn, path_new); + // Is new name already in use by any other object? + if (res == FR_OK) { + res = (djn.obj.sclust == djo.obj.sclust + && djn.dptr == djo.dptr) + ? FR_NO_FILE + : FR_EXIST; + } + // It is a valid path and no name collision + if (res == FR_NO_FILE) { + // Register the new entry + res = dir_register(&djn); + if (res == FR_OK) { + // Copy directory entry of the object except name + dir = djn.dir; + memcpy(dir + 13, buf + 13, SZDIRE - 13); + dir[DIR_Attr] = buf[DIR_Attr]; + // Set archive attribute if it is a file + if (!(dir[DIR_Attr] & AM_DIR)) { + dir[DIR_Attr] |= AM_ARC; + } + fs->wflag = 1; + // Update .. entry in the sub-directory if needed + if ((dir[DIR_Attr] & AM_DIR) + && djo.obj.sclust != djn.obj.sclust) { + sect = clst2sect(fs, ld_clust(fs, dir)); + if (sect == 0) { + res = FR_INT_ERR; + } + else { + // Start of critical section where an + // interruption can cause a cross-link + + res = move_window(fs, sect); + // Ptr to .. entry + dir = fs->win + SZDIRE * 1; + if (res == FR_OK && dir[1] == '.') { + st_clust(fs, dir, djn.obj.sclust); + fs->wflag = 1; + } + } + } + } + } + } + if (res == FR_OK) { + // Remove old entry + res = dir_remove(&djo); + if (res == FR_OK) { + res = sync_fs(fs); + } + } + // End of the critical section + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +// !FF_FS_READONLY +# endif +// FF_FS_MINIMIZE == 0 +# endif +// FF_FS_MINIMIZE <= 1 +# endif +// FF_FS_MINIMIZE <= 2 +#endif + +#if FF_USE_CHMOD && !FF_FS_READONLY +//----------------------------------------------------------------------- + +// Change Attribute + +//----------------------------------------------------------------------- + +FRESULT f_chmod(const TCHAR* path, BYTE attr, BYTE mask) { + FRESULT res; + FATFS* fs; + DIR dj; + DEF_NAMBUF + + // Get logical drive + res = mount_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the file path + res = follow_path(&dj, path); + // Check object validity + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) { + res = FR_INVALID_NAME; + } + if (res == FR_OK) { + // Valid attribute mask + mask &= AM_RDO | AM_HID | AM_SYS | AM_ARC; +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Apply attribute change + fs->dirbuf[XDIR_Attr] + = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask); + res = store_xdir(&dj); + } + else +# endif + { + // Apply attribute change + dj.dir[DIR_Attr] + = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask); + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +//----------------------------------------------------------------------- + +// Change Timestamp + +//----------------------------------------------------------------------- + +FRESULT f_utime(const TCHAR* path, const FILINFO* fno) { + FRESULT res; + FATFS* fs; + DIR dj; + DEF_NAMBUF + + // Get logical drive + res = mount_volume(&path, &fs, FA_WRITE); + if (res == FR_OK) { + dj.obj.fs = fs; + INIT_NAMBUF(fs); + // Follow the file path + res = follow_path(&dj, path); + // Check object validity + if (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) { + res = FR_INVALID_NAME; + } + if (res == FR_OK) { +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + st_dword(fs->dirbuf + XDIR_ModTime, + (DWORD)fno->fdate << 16 | fno->ftime); + res = store_xdir(&dj); + } + else +# endif + { + st_dword(dj.dir + DIR_ModTime, + (DWORD)fno->fdate << 16 | fno->ftime); + fs->wflag = 1; + } + if (res == FR_OK) { + res = sync_fs(fs); + } + } + FREE_NAMBUF(); + } + + LEAVE_FF(fs, res); +} + +// FF_USE_CHMOD && !FF_FS_READONLY +#endif + +#if FF_USE_LABEL +//----------------------------------------------------------------------- + +// Get Volume Label + +//----------------------------------------------------------------------- + +FRESULT f_getlabel(const TCHAR* path, TCHAR* label, DWORD* vsn) { + FRESULT res; + FATFS* fs; + DIR dj; + UINT si, di; + WCHAR wc; + + // Get logical drive + + res = mount_volume(&path, &fs, 0); + + // Get volume label + + if (res == FR_OK && label) { + // Open root directory + dj.obj.fs = fs; + dj.obj.sclust = 0; + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + // Find a volume label entry + res = DIR_READ_LABEL(&dj); + if (res == FR_OK) { +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + WCHAR hs; + UINT nw; + + // Extract volume label from 83 entry + for (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) { + wc = ld_word(dj.dir + XDIR_Label + si * 2); + // Is the code a surrogate? + if (hs == 0 && IsSurrogate(wc)) { + hs = wc; + continue; + } + // Store it in API encoding + nw = put_utf((DWORD)hs << 16 | wc, &label[di], 4); + // Encode error? + if (nw == 0) { + di = 0; + break; + } + di += nw; + hs = 0; + } + // Broken surrogate pair? + if (hs != 0) { + di = 0; + } + label[di] = 0; + } + else +# endif + { + // Extract volume label from AM_VOL entry + si = di = 0; + while (si < 11) { + wc = dj.dir[si++]; + // Unicode output +# if FF_USE_LFN && FF_LFN_UNICODE >= 1 + // Is it a DBC? + if (dbc_1st((BYTE)wc) && si < 11) { + wc = wc << 8 | dj.dir[si++]; + } + // Convert it into Unicode + wc = ff_oem2uni(wc, CODEPAGE); + // Invalid char in current code page? + if (wc == 0) { + di = 0; + break; + } + // Store it in Unicode + di += put_utf(wc, &label[di], 4); + // ANSI/OEM output +# else + label[di++] = (TCHAR)wc; +# endif + } + // Truncate trailing spaces + do { + label[di] = 0; + if (di == 0) { + break; + } + } while (label[--di] == ' '); + } + } + } + // No label entry and return nul string + if (res == FR_NO_FILE) { + label[0] = 0; + res = FR_OK; + } + } + + // Get volume serial number + + if (res == FR_OK && vsn) { + res = move_window(fs, fs->volbase); + if (res == FR_OK) { + switch (fs->fs_type) { + case FS_EXFAT: + di = BPB_VolIDEx; + break; + + case FS_FAT32: + di = BS_VolID32; + break; + + default: + di = BS_VolID; + } + *vsn = ld_dword(fs->win + di); + } + } + + LEAVE_FF(fs, res); +} + +# if !FF_FS_READONLY +//----------------------------------------------------------------------- + +// Set Volume Label + +//----------------------------------------------------------------------- + +FRESULT f_setlabel(const TCHAR* label) { + FRESULT res; + FATFS* fs; + DIR dj; + BYTE dirvn[22]; + UINT di; + WCHAR wc; + // [0..16] for FAT, [7..16] for exFAT + static const char badchr[18] = "+.,;=[]" + "/*:<>|\\\"\?\x7F"; + +# if FF_USE_LFN + DWORD dc; +# endif + + // Get logical drive + + res = mount_volume(&label, &fs, FA_WRITE); + if (res != FR_OK) { + LEAVE_FF(fs, res); + } + +# if FF_FS_EXFAT + // On the exFAT volume + if (fs->fs_type == FS_EXFAT) { + memset(dirvn, 0, 22); + di = 0; + // Create volume label + while ((UINT)*label >= ' ') { + // Get a Unicode character + dc = tchar2uni(&label); + if (dc >= 0x10000) { + // Wrong surrogate or buffer overflow + if (dc == 0xFFFFFFFF || di >= 10) { + dc = 0; + } + else { + st_word(dirvn + di * 2, (WCHAR)(dc >> 16)); + di++; + } + } + // Check validity of the volume label + if (dc == 0 || strchr(&badchr[7], (int)dc) || di >= 11) { + LEAVE_FF(fs, FR_INVALID_NAME); + } + st_word(dirvn + di * 2, (WCHAR)dc); + di++; + } + } + else +# endif + // On the FAT/FAT32 volume + { + memset(dirvn, ' ', 11); + di = 0; + // Create volume label + while ((UINT)*label >= ' ') { +# if FF_USE_LFN + dc = tchar2uni(&label); + wc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0; + // ANSI/OEM input +# else + wc = (BYTE)*label++; + if (dbc_1st((BYTE)wc)) { + wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0; + } + // To upper ASCII characters + if (IsLower(wc)) { + wc -= 0x20; + } +# if FF_CODE_PAGE == 0 + // To upper extended characters (SBCS cfg) + if (ExCvt && wc >= 0x80) { + wc = ExCvt[wc - 0x80]; + } +# elif FF_CODE_PAGE < 900 + // To upper extended characters (SBCS cfg) + if (wc >= 0x80) { + wc = ExCvt[wc - 0x80]; + } +# endif +# endif + // Reject invalid characters for volume label + if (wc == 0 || strchr(&badchr[0], (int)wc) + || di >= (UINT)((wc >= 0x100) ? 10 : 11)) { + LEAVE_FF(fs, FR_INVALID_NAME); + } + if (wc >= 0x100) { + dirvn[di++] = (BYTE)(wc >> 8); + } + dirvn[di++] = (BYTE)wc; + } + // Reject illegal name (heading DDEM) + if (dirvn[0] == DDEM) { + LEAVE_FF(fs, FR_INVALID_NAME); + } + // Snip trailing spaces + while (di && dirvn[di - 1] == ' ') { + di--; + } + } + + // Set volume label + + // Open root directory + dj.obj.fs = fs; + dj.obj.sclust = 0; + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + // Get volume label entry + res = DIR_READ_LABEL(&dj); + if (res == FR_OK) { + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + // Change the volume label + dj.dir[XDIR_NumLabel] = (BYTE)di; + memcpy(dj.dir + XDIR_Label, dirvn, 22); + } + else { + if (di != 0) { + // Change the volume label + memcpy(dj.dir, dirvn, 11); + } + else { + // Remove the volume label + dj.dir[DIR_Name] = DDEM; + } + } + fs->wflag = 1; + res = sync_fs(fs); + // No volume label entry or an error + } + else { + if (res == FR_NO_FILE) { + res = FR_OK; + // Create a volume label entry + if (di != 0) { + // Allocate an entry + res = dir_alloc(&dj, 1); + if (res == FR_OK) { + // Clean the entry + memset(dj.dir, 0, SZDIRE); + if (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) { + // Create volume label entry + dj.dir[XDIR_Type] = ET_VLABEL; + dj.dir[XDIR_NumLabel] = (BYTE)di; + memcpy(dj.dir + XDIR_Label, dirvn, 22); + } + else { + // Create volume label entry + dj.dir[DIR_Attr] = AM_VOL; + memcpy(dj.dir, dirvn, 11); + } + fs->wflag = 1; + res = sync_fs(fs); + } + } + } + } + } + + LEAVE_FF(fs, res); +} + +// !FF_FS_READONLY +# endif +// FF_USE_LABEL +#endif + +#if FF_USE_EXPAND && !FF_FS_READONLY +//----------------------------------------------------------------------- + +// Allocate a Contiguous Blocks to the File + +//----------------------------------------------------------------------- + +FRESULT f_expand(FIL* fp, FSIZE_t fsz, BYTE opt) { + FRESULT res; + FATFS* fs; + DWORD n, clst, stcl, scl, ncl, tcl, lclst; + + // Check validity of the file object + res = validate(&fp->obj, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) { + LEAVE_FF(fs, res); + } + if (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) { + LEAVE_FF(fs, FR_DENIED); + } +# if FF_FS_EXFAT + // Check if in size limit + if (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) { + LEAVE_FF(fs, FR_DENIED); + } +# endif + // Cluster size + n = (DWORD)fs->csize * SS(fs); + // Number of clusters required + tcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0); + stcl = fs->last_clst; + lclst = 0; + if (stcl < 2 || stcl >= fs->n_fatent) { + stcl = 2; + } + +# if FF_FS_EXFAT + if (fs->fs_type == FS_EXFAT) { + // Find a contiguous cluster block + scl = find_bitmap(fs, stcl, tcl); + // No contiguous cluster block was found + if (scl == 0) { + res = FR_DENIED; + } + if (scl == 0xFFFFFFFF) { + res = FR_DISK_ERR; + } + // A contiguous free area is found + if (res == FR_OK) { + // Allocate it now + if (opt) { + // Mark the cluster block 'in use' + res = change_bitmap(fs, scl, tcl, 1); + lclst = scl + tcl - 1; + // Set it as suggested point for next allocation + } + else { + lclst = scl - 1; + } + } + } + else +# endif + { + scl = clst = stcl; + ncl = 0; + // Find a contiguous cluster block + for (;;) { + n = get_fat(&fp->obj, clst); + if (++clst >= fs->n_fatent) { + clst = 2; + } + if (n == 1) { + res = FR_INT_ERR; + break; + } + if (n == 0xFFFFFFFF) { + res = FR_DISK_ERR; + break; + } + // Is it a free cluster? + if (n == 0) { + // Break if a contiguous cluster block is found + if (++ncl == tcl) { + break; + } + } + else { + // Not a free cluster + scl = clst; + ncl = 0; + } + // No contiguous cluster? + if (clst == stcl) { + res = FR_DENIED; + break; + } + } + // A contiguous free area is found + if (res == FR_OK) { + // Allocate it now + if (opt) { + // Create a cluster chain on the FAT + for (clst = scl, n = tcl; n; clst++, n--) { + res = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1); + if (res != FR_OK) { + break; + } + lclst = clst; + } + // Set it as suggested point for next allocation + } + else { + lclst = scl - 1; + } + } + } + + if (res == FR_OK) { + // Set suggested start cluster to start next + fs->last_clst = lclst; + // Is it allocated now? + if (opt) { + // Update object allocation information + fp->obj.sclust = scl; + fp->obj.objsize = fsz; + // Set status 'contiguous chain' + if (FF_FS_EXFAT) { + fp->obj.stat = 2; + } + fp->flag |= FA_MODIFIED; + // Update FSINFO + if (fs->free_clst <= fs->n_fatent - 2) { + fs->free_clst -= tcl; + fs->fsi_flag |= 1; + } + } + } + + LEAVE_FF(fs, res); +} + +// FF_USE_EXPAND && !FF_FS_READONLY +#endif + +#if FF_USE_FORWARD +//----------------------------------------------------------------------- + +// Forward Data to the Stream Directly + +//----------------------------------------------------------------------- + +FRESULT +f_forward(FIL* fp, UINT (*func)(const BYTE*, UINT), UINT btf, UINT* bf) { + FRESULT res; + FATFS* fs; + DWORD clst; + LBA_t sect; + FSIZE_t remain; + UINT rcnt, csect; + BYTE* dbuf; + + // Clear transfer byte counter + *bf = 0; + // Check validity of the file object + res = validate(&fp->obj, &fs); + if (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) { + LEAVE_FF(fs, res); + } + // Check access mode + if (!(fp->flag & FA_READ)) { + LEAVE_FF(fs, FR_DENIED); + } + + remain = fp->obj.objsize - fp->fptr; + // Truncate btf by remaining bytes + if (btf > remain) { + btf = (UINT)remain; + } + + // Repeat until all data transferred or stream goes busy + for (; btf > 0 && (*func)(0, 0); + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + // Sector offset in the cluster + csect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1)); + // On the sector boundary? + if (fp->fptr % SS(fs) == 0) { + // On the cluster boundary? + if (csect == 0) { + // On the top of the file? + clst = (fp->fptr == 0) ? fp->obj.sclust + : get_fat(&fp->obj, fp->clust); + if (clst <= 1) { + ABORT(fs, FR_INT_ERR); + } + if (clst == 0xFFFFFFFF) { + ABORT(fs, FR_DISK_ERR); + } + // Update current cluster + fp->clust = clst; + } + } + // Get current data sector + sect = clst2sect(fs, fp->clust); + if (sect == 0) { + ABORT(fs, FR_INT_ERR); + } + sect += csect; +# if FF_FS_TINY + // Move sector window to the file data + if (move_window(fs, sect) != FR_OK) { + ABORT(fs, FR_DISK_ERR); + } + dbuf = fs->win; +# else + // Fill sector cache with file data + if (fp->sect != sect) { +# if !FF_FS_READONLY + // Write-back dirty sector cache + if (fp->flag & FA_DIRTY) { + if (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + fp->flag &= (BYTE)~FA_DIRTY; + } +# endif + if (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) { + ABORT(fs, FR_DISK_ERR); + } + } + dbuf = fp->buf; +# endif + fp->sect = sect; + // Number of bytes remains in the sector + rcnt = SS(fs) - (UINT)fp->fptr % SS(fs); + // Clip it by btr if needed + if (rcnt > btf) { + rcnt = btf; + } + // Forward the file data + rcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt); + if (rcnt == 0) { + ABORT(fs, FR_INT_ERR); + } + } + + LEAVE_FF(fs, FR_OK); +} + +// FF_USE_FORWARD +#endif + +#if !FF_FS_READONLY && FF_USE_MKFS +//----------------------------------------------------------------------- + +// Create FAT/exFAT volume (with sub-functions) + +//----------------------------------------------------------------------- + +// Sectors per track for determination of drive CHS +static constexpr const uint32_t N_SEC_TRACK = 63; +// Alignment of partitions in GPT [byte] (>=128KB) +static constexpr const uint32_t GPT_ALIGN = 0x100000; +// Number of GPT table size (>=128, sector aligned) +static constexpr const uint32_t GPT_ITEMS = 128; + +// Create partitions on the physical drive in format of MBR or GPT + +static FRESULT create_partition( + // Physical drive number + BYTE drv, + // Partition list + const LBA_t plst[], + // System ID for each partition (for only MBR) + BYTE sys, + // Working buffer for a sector + BYTE* buf) { + UINT i, cy; + LBA_t sz_drv; + DWORD sz_drv32, nxt_alloc32, sz_part32; + BYTE* pte; + BYTE hd, n_hd, sc, n_sc; + + // Get physical drive size + + if (disk_ioctl(drv, GET_SECTOR_COUNT, &sz_drv) != RES_OK) { + return FR_DISK_ERR; + } + +# if FF_LBA64 + // Create partitions in GPT format + if (sz_drv >= FF_MIN_GPT) { + WORD ss; + UINT sz_ptbl, pi, si, ofs; + DWORD bcc, rnd, align; + QWORD nxt_alloc, sz_part, sz_pool, top_bpt; + static const BYTE gpt_mbr[16] + = { 0x00, 0x00, 0x02, 0x00, 0xEE, 0xFE, 0xFF, 0x00, + 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF }; + +# if FF_MAX_SS != FF_MIN_SS + // Get sector size + if (disk_ioctl(drv, GET_SECTOR_SIZE, &ss) != RES_OK) { + return FR_DISK_ERR; + } + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) { + return FR_DISK_ERR; + } +# else + ss = FF_MAX_SS; +# endif + // Random seed + rnd = (DWORD)sz_drv + GET_FATTIME(); + // Partition alignment for GPT [sector] + align = GPT_ALIGN / ss; + // Size of partition table [sector] + sz_ptbl = GPT_ITEMS * SZ_GPTE / ss; + // Backup partition table start sector + top_bpt = sz_drv - sz_ptbl - 1; + // First allocatable sector + nxt_alloc = 2 + sz_ptbl; + // Size of allocatable area + sz_pool = top_bpt - nxt_alloc; + bcc = 0xFFFFFFFF; + sz_part = 1; + // partition table index, size table index + pi = si = 0; + do { + // Clean the buffer if needed + if (pi * SZ_GPTE % ss == 0) { + memset(buf, 0, ss); + } + // Is the size table not termintated? + if (sz_part != 0) { + // Align partition start + nxt_alloc = (nxt_alloc + align - 1) & ((QWORD)0 - align); + // Get a partition size + sz_part = plst[si++]; + // Is the size in percentage? + if (sz_part <= 100) { + sz_part = sz_pool * sz_part / 100; + // Align partition end (only if in percentage) + sz_part = (sz_part + align - 1) & ((QWORD)0 - align); + } + // Clip the size at end of the pool + if (nxt_alloc + sz_part > top_bpt) { + sz_part = (nxt_alloc < top_bpt) ? top_bpt - nxt_alloc : 0; + } + } + // Add a partition? + if (sz_part != 0) { + ofs = pi * SZ_GPTE % ss; + // Set partition GUID (Microsoft Basic Data) + memcpy(buf + ofs + GPTE_PtGuid, GUID_MS_Basic, 16); + // Set unique partition GUID + rnd = make_rand(rnd, buf + ofs + GPTE_UpGuid, 16); + // Set partition start sector + st_qword(buf + ofs + GPTE_FstLba, nxt_alloc); + // Set partition end sector + st_qword(buf + ofs + GPTE_LstLba, nxt_alloc + sz_part - 1); + // Next allocatable sector + nxt_alloc += sz_part; + } + // Write the buffer if it is filled up + if ((pi + 1) * SZ_GPTE % ss == 0) { + // Calculate table check sum + for (i = 0; i < ss; bcc = crc32(bcc, buf[i++])) + ; + // Write to primary table + if (disk_write(drv, buf, 2 + pi * SZ_GPTE / ss, 1) != RES_OK) { + return FR_DISK_ERR; + } + // Write to secondary table + if (disk_write(drv, buf, top_bpt + pi * SZ_GPTE / ss, 1) + != RES_OK) { + return FR_DISK_ERR; + } + } + } while (++pi < GPT_ITEMS); + + // Create primary GPT header + + memset(buf, 0, ss); + // Signature, version (1.0) and size (92) + memcpy(buf + GPTH_Sign, + "EFI PART" + "\0\0\1\0" + "\x5C\0\0", + 16); + // Table check sum + st_dword(buf + GPTH_PtBcc, ~bcc); + // LBA of this header + st_qword(buf + GPTH_CurLba, 1); + // LBA of secondary header + st_qword(buf + GPTH_BakLba, sz_drv - 1); + // LBA of first allocatable sector + st_qword(buf + GPTH_FstLba, 2 + sz_ptbl); + // LBA of last allocatable sector + st_qword(buf + GPTH_LstLba, top_bpt - 1); + // Size of a table entry + st_dword(buf + GPTH_PteSize, SZ_GPTE); + // Number of table entries + st_dword(buf + GPTH_PtNum, GPT_ITEMS); + // LBA of this table + st_dword(buf + GPTH_PtOfs, 2); + // Disk GUID + rnd = make_rand(rnd, buf + GPTH_DskGuid, 16); + // Calculate header check sum + for (i = 0, bcc = 0xFFFFFFFF; i < 92; bcc = crc32(bcc, buf[i++])) + ; + // Header check sum + st_dword(buf + GPTH_Bcc, ~bcc); + if (disk_write(drv, buf, 1, 1) != RES_OK) { + return FR_DISK_ERR; + } + + // Create secondary GPT header + + // LBA of this header + st_qword(buf + GPTH_CurLba, sz_drv - 1); + // LBA of primary header + st_qword(buf + GPTH_BakLba, 1); + // LBA of this table + st_qword(buf + GPTH_PtOfs, top_bpt); + st_dword(buf + GPTH_Bcc, 0); + // Calculate header check sum + for (i = 0, bcc = 0xFFFFFFFF; i < 92; bcc = crc32(bcc, buf[i++])) + ; + // Header check sum + st_dword(buf + GPTH_Bcc, ~bcc); + if (disk_write(drv, buf, sz_drv - 1, 1) != RES_OK) { + return FR_DISK_ERR; + } + + // Create protective MBR + + memset(buf, 0, ss); + // Create a GPT partition + memcpy(buf + MBR_Table, gpt_mbr, 16); + st_word(buf + BS_55AA, 0xAA55); + if (disk_write(drv, buf, 0, 1) != RES_OK) { + return FR_DISK_ERR; + } + } + else +# endif + // Create partitions in MBR format + { + sz_drv32 = (DWORD)sz_drv; + // Determine drive CHS without any consideration of the drive geometry + n_sc = N_SEC_TRACK; + for (n_hd = 8; n_hd != 0 && sz_drv32 / n_hd / n_sc > 1024; n_hd *= 2) + ; + // Number of heads needs to be <256 + if (n_hd == 0) { + n_hd = 255; + } + + // Clear MBR + memset(buf, 0, FF_MAX_SS); + // Partition table in the MBR + pte = buf + MBR_Table; + for (i = 0, nxt_alloc32 = n_sc; + i < 4 && nxt_alloc32 != 0 && nxt_alloc32 < sz_drv32; + i++, nxt_alloc32 += sz_part32) { + // Get partition size + sz_part32 = (DWORD)plst[i]; + // Size in percentage? + if (sz_part32 <= 100) { + sz_part32 + = (sz_part32 == 100) ? sz_drv32 : sz_drv32 / 100 * sz_part32; + } + // Clip at drive size + if (nxt_alloc32 + sz_part32 > sz_drv32 + || nxt_alloc32 + sz_part32 < nxt_alloc32) { + sz_part32 = sz_drv32 - nxt_alloc32; + } + // End of table or no sector to allocate? + if (sz_part32 == 0) { + break; + } + + // Start LBA + st_dword(pte + PTE_StLba, nxt_alloc32); + // Number of sectors + st_dword(pte + PTE_SizLba, sz_part32); + // System type + pte[PTE_System] = sys; + + // Start cylinder + cy = (UINT)(nxt_alloc32 / n_sc / n_hd); + // Start head + hd = (BYTE)(nxt_alloc32 / n_sc % n_hd); + // Start sector + sc = (BYTE)(nxt_alloc32 % n_sc + 1); + pte[PTE_StHead] = hd; + pte[PTE_StSec] = (BYTE)((cy >> 2 & 0xC0) | sc); + pte[PTE_StCyl] = (BYTE)cy; + + // End cylinder + cy = (UINT)((nxt_alloc32 + sz_part32 - 1) / n_sc / n_hd); + // End head + hd = (BYTE)((nxt_alloc32 + sz_part32 - 1) / n_sc % n_hd); + // End sector + sc = (BYTE)((nxt_alloc32 + sz_part32 - 1) % n_sc + 1); + pte[PTE_EdHead] = hd; + pte[PTE_EdSec] = (BYTE)((cy >> 2 & 0xC0) | sc); + pte[PTE_EdCyl] = (BYTE)cy; + + // Next entry + pte += SZ_PTE; + } + + // MBR signature + st_word(buf + BS_55AA, 0xAA55); + // Write it to the MBR + if (disk_write(drv, buf, 0, 1) != RES_OK) { + return FR_DISK_ERR; + } + } + + return FR_OK; +} + +FRESULT f_mkfs(const TCHAR* path, const MKFS_PARM* opt, void* work, UINT len) { + // Cluster size boundary for FAT volume (4Ks unit) + static const WORD cst[] = { 1, 4, 16, 64, 256, 512, 0 }; + // Cluster size boundary for FAT32 volume (128Ks unit) + static const WORD cst32[] = { 1, 2, 4, 8, 16, 32, 0 }; + // Default parameter + static const MKFS_PARM defopt = { FM_ANY, 0, 0, 0, 0 }; + BYTE fsopt, fsty, sys, pdrv, ipart; + BYTE* buf; + BYTE* pte; + // Sector size + WORD ss; + DWORD sz_buf, sz_blk, n_clst, pau, nsect, n, vsn; + // Size of volume, Base LBA of volume, fat, data + LBA_t sz_vol, b_vol, b_fat, b_data; + LBA_t sect, lba[2]; + // Size of reserved, fat, dir, data, cluster + DWORD sz_rsv, sz_fat, sz_dir, sz_au; + // Index, Number of FATs and Number of roor dir entries + UINT n_fat, n_root, i; + int vol; + DSTATUS ds; + FRESULT res; + + // Check mounted drive and clear work area + + // Get target logical drive + vol = get_ldnumber(&path); + if (vol < 0) { + return FR_INVALID_DRIVE; + } + // Clear the fs object if mounted + if (FatFs[vol]) { + FatFs[vol]->fs_type = 0; + } + // Hosting physical drive + pdrv = LD2PD(vol); + // Hosting partition (0:create as new, 1..:existing partition) + ipart = LD2PT(vol); + + // Initialize the hosting physical drive + + ds = disk_initialize(pdrv); + if (ds & STA_NOINIT) { + return FR_NOT_READY; + } + if (ds & STA_PROTECT) { + return FR_WRITE_PROTECTED; + } + + // Get physical drive parameters (sz_drv, sz_blk and ss) + + // Use default parameter if it is not given + if (!opt) { + opt = &defopt; + } + sz_blk = opt->align; + // Block size from the paramter or lower layer + if (sz_blk == 0) { + disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk); + } + // Use default if the block size is invalid + if (sz_blk == 0 || sz_blk > 0x8000 || (sz_blk & (sz_blk - 1))) { + sz_blk = 1; + } +# if FF_MAX_SS != FF_MIN_SS + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) { + return FR_DISK_ERR; + } + if (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) { + return FR_DISK_ERR; + } +# else + ss = FF_MAX_SS; +# endif + + // Options for FAT sub-type and FAT parameters + + fsopt = opt->fmt & (FM_ANY | FM_SFD); + n_fat = (opt->n_fat >= 1 && opt->n_fat <= 2) ? opt->n_fat : 1; + n_root = (opt->n_root >= 1 && opt->n_root <= 32768 + && (opt->n_root % (ss / SZDIRE)) == 0) + ? opt->n_root + : 512; + sz_au + = (opt->au_size <= 0x1000000 && (opt->au_size & (opt->au_size - 1)) == 0) + ? opt->au_size + : 0; + // Byte --> Sector + sz_au /= ss; + + // Get working buffer + + // Size of working buffer [sector] + sz_buf = len / ss; + if (sz_buf == 0) { + return FR_NOT_ENOUGH_CORE; + } + // Working buffer + buf = (BYTE*)work; +# if FF_USE_LFN == 3 + // Use heap memory for working buffer + if (!buf) { + buf = ff_memalloc(sz_buf * ss); + } +# endif + if (!buf) { + return FR_NOT_ENOUGH_CORE; + } + + // Determine where the volume to be located (b_vol, sz_vol) + + b_vol = sz_vol = 0; + // Is the volume associated with any specific partition? + if (FF_MULTI_PARTITION && ipart != 0) { + // Get partition location from the existing partition table + + // Load MBR + if (disk_read(pdrv, buf, 0, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // Check if MBR is valid + if (ld_word(buf + BS_55AA) != 0xAA55) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } +# if FF_LBA64 + // GPT protective MBR? + if (buf[MBR_Table + PTE_System] == 0xEE) { + DWORD n_ent, ofs; + QWORD pt_lba; + + // Get the partition location from GPT + + // Load GPT header sector (next to MBR) + if (disk_read(pdrv, buf, 1, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // Check if GPT header is valid + if (!test_gpt_header(buf)) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // Number of entries + n_ent = ld_dword(buf + GPTH_PtNum); + // Table start sector + pt_lba = ld_qword(buf + GPTH_PtOfs); + ofs = i = 0; + // Find MS Basic partition with order of ipart + while (n_ent) { + // Get PT sector + if (ofs == 0 && disk_read(pdrv, buf, pt_lba++, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // MS basic data partition? + if (!memcmp(buf + ofs + GPTE_PtGuid, GUID_MS_Basic, 16) + && ++i == ipart) { + b_vol = ld_qword(buf + ofs + GPTE_FstLba); + sz_vol = ld_qword(buf + ofs + GPTE_LstLba) - b_vol + 1; + break; + } + // Next entry + n_ent--; + ofs = (ofs + SZ_GPTE) % ss; + } + // Partition not found + if (n_ent == 0) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // Partitioning is in GPT + fsopt |= 0x80; + } + else +# endif + // Get the partition location from MBR partition table + { + pte = buf + (MBR_Table + (ipart - 1) * SZ_PTE); + // No partition? + if (ipart > 4 || pte[PTE_System] == 0) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // Get volume start sector + b_vol = ld_dword(pte + PTE_StLba); + // Get volume size + sz_vol = ld_dword(pte + PTE_SizLba); + } + // The volume is associated with a physical drive + } + else { + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // To be partitioned? + if (!(fsopt & FM_SFD)) { + // Create a single-partition on the drive in this function + +# if FF_LBA64 + // Which partition type to create, MBR or GPT? + if (sz_vol >= FF_MIN_GPT) { + // Partitioning is in GPT + fsopt |= 0x80; + // Estimated partition offset and size + b_vol = GPT_ALIGN / ss; + sz_vol -= b_vol + GPT_ITEMS * SZ_GPTE / ss + 1; + } + else +# endif + // Partitioning is in MBR + { + if (sz_vol > N_SEC_TRACK) { + // Estimated partition offset and size + b_vol = N_SEC_TRACK; + sz_vol -= b_vol; + } + } + } + } + // Check if volume size is >=128s + if (sz_vol < 128) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + + // Now start to create an FAT volume at b_vol and sz_vol + + // Pre-determine the FAT type + do { + // exFAT possible? + if (FF_FS_EXFAT && (fsopt & FM_EXFAT)) { + // exFAT only, vol >= 64MS or sz_au > 128S ? + if ((fsopt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 + || sz_au > 128) { + fsty = FS_EXFAT; + break; + } + } +# if FF_LBA64 + // Too large volume for FAT/FAT32 + if (sz_vol >= 0x100000000) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } +# endif + // Invalid AU for FAT/FAT32? + if (sz_au > 128) { + sz_au = 128; + } + // FAT32 possible? + if (fsopt & FM_FAT32) { + // no-FAT? + if (!(fsopt & FM_FAT)) { + fsty = FS_FAT32; + break; + } + } + // no-FAT? + if (!(fsopt & FM_FAT)) { + LEAVE_MKFS(FR_INVALID_PARAMETER); + } + fsty = FS_FAT16; + } while (0); + + // VSN generated from current time and partitiion size + vsn = (DWORD)sz_vol + GET_FATTIME(); + +# if FF_FS_EXFAT + // Create an exFAT volume + if (fsty == FS_EXFAT) { + DWORD szb_bit, szb_case, sum, nbit, clu, clen[3]; + WCHAR ch, si; + UINT j, st; + + // Too small volume for exFAT? + if (sz_vol < 0x1000) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } +# if FF_USE_TRIM + // Inform storage device that the volume area may be erased + lba[0] = b_vol; + lba[1] = b_vol + sz_vol - 1; + disk_ioctl(pdrv, CTRL_TRIM, lba); +# endif + // Determine FAT location, data location and number of clusters + + // AU auto-selection + if (sz_au == 0) { + sz_au = 8; + // >= 512Ks + if (sz_vol >= 0x80000) { + sz_au = 64; + } + // >= 64Ms + if (sz_vol >= 0x4000000) { + sz_au = 256; + } + } + // FAT start at offset 32 + b_fat = b_vol + 32; + // Number of FAT sectors + sz_fat = (DWORD)((sz_vol / sz_au + 2) * 4 + ss - 1) / ss; + // Align data area to the erase block boundary + b_data = (b_fat + sz_fat + sz_blk - 1) & ~((LBA_t)sz_blk - 1); + // Too small volume? + if (b_data - b_vol >= sz_vol / 2) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // Number of clusters + n_clst = (DWORD)((sz_vol - (b_data - b_vol)) / sz_au); + // Too few clusters? + if (n_clst < 16) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // Too many clusters? + if (n_clst > MAX_EXFAT) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + + // Size of allocation bitmap + szb_bit = (n_clst + 7) / 8; + // Number of allocation bitmap clusters + clen[0] = (szb_bit + sz_au * ss - 1) / (sz_au * ss); + + // Create a compressed up-case table + + // Table start sector + sect = b_data + sz_au * clen[0]; + // Table checksum to be stored in the 82 entry + sum = 0; + st = 0; + si = 0; + i = 0; + j = 0; + szb_case = 0; + do { + switch (st) { + case 0: + // Get an up-case char + ch = (WCHAR)ff_wtoupper(si); + if (ch != si) { + // Store the up-case char if exist + si++; + break; + } + // Get run length of no-case block + for (j = 1; + (WCHAR)(si + j) + && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); + j++) + ; + if (j >= 128) { + // Compress the no-case block if run is >= 128 chars + ch = 0xFFFF; + st = 2; + break; + } + // Do not compress short run + st = 1; + // FALLTHROUGH + + case 1: + // Fill the short run + ch = si++; + if (--j == 0) { + st = 0; + } + break; + + default: + // Number of chars to skip + ch = (WCHAR)j; + si += (WCHAR)j; + st = 0; + } + // Put it into the write buffer + sum = xsum32(buf[i + 0] = (BYTE)ch, sum); + sum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum); + i += 2; + szb_case += 2; + // Write buffered data when buffer full or end of process + if (si == 0 || i == sz_buf * ss) { + n = (i + ss - 1) / ss; + if (disk_write(pdrv, buf, sect, n) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + sect += n; + i = 0; + } + } while (si); + // Number of up-case table clusters + clen[1] = (szb_case + sz_au * ss - 1) / (sz_au * ss); + // Number of root dir clusters + clen[2] = 1; + + // Initialize the allocation bitmap + + // Start of bitmap and number of bitmap sectors + sect = b_data; + nsect = (szb_bit + ss - 1) / ss; + // Number of clusters in-use by system (bitmap, up-case and root-dir) + nbit = clen[0] + clen[1] + clen[2]; + do { + // Initialize bitmap buffer + memset(buf, 0, sz_buf * ss); + // Mark used clusters + for (i = 0; nbit != 0 && i / 8 < sz_buf * ss; + buf[i / 8] |= 1 << (i % 8), i++, nbit--) + ; + // Write the buffered data + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + sect += n; + nsect -= n; + } while (nsect); + + // Initialize the FAT + + // Start of FAT and number of FAT sectors + sect = b_fat; + nsect = sz_fat; + j = nbit = clu = 0; + do { + // Clear work area and reset write offset + memset(buf, 0, sz_buf * ss); + i = 0; + // Initialize FAT [0] and FAT[1] + if (clu == 0) { + st_dword(buf + i, 0xFFFFFFF8); + i += 4; + clu++; + st_dword(buf + i, 0xFFFFFFFF); + i += 4; + clu++; + } + // Create chains of bitmap, up-case and root dir + do { + // Create a chain + while (nbit != 0 && i < sz_buf * ss) { + st_dword(buf + i, (nbit > 1) ? clu + 1 : 0xFFFFFFFF); + i += 4; + clu++; + nbit--; + } + // Get next chain length + if (nbit == 0 && j < 3) { + nbit = clen[j++]; + } + } while (nbit != 0 && i < sz_buf * ss); + // Write the buffered data + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + sect += n; + nsect -= n; + } while (nsect); + + // Initialize the root directory + + memset(buf, 0, sz_buf * ss); + // Volume label entry (no label) + buf[SZDIRE * 0 + 0] = ET_VLABEL; + // Bitmap entry + buf[SZDIRE * 1 + 0] = ET_BITMAP; + // cluster + st_dword(buf + SZDIRE * 1 + 20, 2); + // size + st_dword(buf + SZDIRE * 1 + 24, szb_bit); + // Up-case table entry + buf[SZDIRE * 2 + 0] = ET_UPCASE; + // sum + st_dword(buf + SZDIRE * 2 + 4, sum); + // cluster + st_dword(buf + SZDIRE * 2 + 20, 2 + clen[0]); + // size + st_dword(buf + SZDIRE * 2 + 24, szb_case); + // Start of the root directory and number of sectors + sect = b_data + sz_au * (clen[0] + clen[1]); + nsect = sz_au; + // Fill root directory sectors + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, n) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // Rest of entries are filled with zero + memset(buf, 0, ss); + sect += n; + nsect -= n; + } while (nsect); + + // Create two set of the exFAT VBR blocks + + sect = b_vol; + for (n = 0; n < 2; n++) { + // Main record (+0) + + memset(buf, 0, ss); + // Boot jump code (x86), OEM name + memcpy(buf + BS_JmpBoot, + "\xEB\x76\x90" + "EXFAT ", + 11); + // Volume offset in the physical drive [sector] + st_qword(buf + BPB_VolOfsEx, b_vol); + // Volume size [sector] + st_qword(buf + BPB_TotSecEx, sz_vol); + // FAT offset [sector] + st_dword(buf + BPB_FatOfsEx, (DWORD)(b_fat - b_vol)); + // FAT size [sector] + st_dword(buf + BPB_FatSzEx, sz_fat); + // Data offset [sector] + st_dword(buf + BPB_DataOfsEx, (DWORD)(b_data - b_vol)); + // Number of clusters + st_dword(buf + BPB_NumClusEx, n_clst); + // Root dir cluster # + st_dword(buf + BPB_RootClusEx, 2 + clen[0] + clen[1]); + // VSN + st_dword(buf + BPB_VolIDEx, vsn); + // Filesystem version (1.00) + st_word(buf + BPB_FSVerEx, 0x100); + // Log2 of sector size [byte] + for (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; + buf[BPB_BytsPerSecEx]++) + ; + // Log2 of cluster size [sector] + for (buf[BPB_SecPerClusEx] = 0, i = sz_au; i >>= 1; + buf[BPB_SecPerClusEx]++) + ; + // Number of FATs + buf[BPB_NumFATsEx] = 1; + // Drive number (for int13) + buf[BPB_DrvNumEx] = 0x80; + // Boot code (x86) + st_word(buf + BS_BootCodeEx, 0xFEEB); + // Signature (placed here regardless of sector size) + st_word(buf + BS_55AA, 0xAA55); + // VBR checksum + for (i = sum = 0; i < ss; i++) { + if (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 + && i != BPB_PercInUseEx) { + sum = xsum32(buf[i], sum); + } + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // Extended bootstrap record (+1..+8) + + memset(buf, 0, ss); + // Signature (placed at end of sector) + st_word(buf + ss - 2, 0xAA55); + for (j = 1; j < 9; j++) { + // VBR checksum + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) + ; + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + } + // OEM/Reserved record (+9..+10) + + memset(buf, 0, ss); + for (; j < 11; j++) { + // VBR checksum + for (i = 0; i < ss; sum = xsum32(buf[i++], sum)) + ; + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + } + // Sum record (+11) + + // Fill with checksum value + for (i = 0; i < ss; i += 4) { + st_dword(buf + i, sum); + } + if (disk_write(pdrv, buf, sect++, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + } + } + else + // FF_FS_EXFAT +# endif + // Create an FAT/FAT32 volume + { + do { + pau = sz_au; + // Pre-determine number of clusters and FAT sub-type + + // FAT32 volume + if (fsty == FS_FAT32) { + // AU auto-selection + if (pau == 0) { + // Volume size in unit of 128KS + n = (DWORD)sz_vol / 0x20000; + // Get from table + for (i = 0, pau = 1; cst32[i] && cst32[i] <= n; + i++, pau <<= 1) + ; + } + // Number of clusters + n_clst = (DWORD)sz_vol / pau; + // FAT size [sector] + sz_fat = (n_clst * 4 + 8 + ss - 1) / ss; + // Number of reserved sectors + sz_rsv = 32; + // No static directory + sz_dir = 0; + if (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // FAT volume + } + else { + // au auto-selection + if (pau == 0) { + // Volume size in unit of 4KS + n = (DWORD)sz_vol / 0x1000; + // Get from table + for (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) + ; + } + n_clst = (DWORD)sz_vol / pau; + if (n_clst > MAX_FAT12) { + // FAT size [byte] + n = n_clst * 2 + 4; + } + else { + fsty = FS_FAT12; + // FAT size [byte] + n = (n_clst * 3 + 1) / 2 + 3; + } + // FAT size [sector] + sz_fat = (n + ss - 1) / ss; + // Number of reserved sectors + sz_rsv = 1; + // Root dir size [sector] + sz_dir = (DWORD)n_root * SZDIRE / ss; + } + // FAT base + b_fat = b_vol + sz_rsv; + // Data base + b_data = b_fat + sz_fat * n_fat + sz_dir; + + // Align data area to erase block boundary (for flash memory media) + + // Sectors to next nearest from current data base + n = (DWORD)(((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data); + // FAT32: Move FAT + if (fsty == FS_FAT32) { + sz_rsv += n; + b_fat += n; + // FAT: Expand FAT + } + else { + // Adjust fractional error if needed + if (n % n_fat) { + n--; + sz_rsv++; + b_fat++; + } + sz_fat += n / n_fat; + } + + // Determine number of clusters and final check of validity of the + // FAT sub-type + + // Too small volume? + if (sz_vol < b_data + pau * 16 - b_vol) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + n_clst = ((DWORD)sz_vol - sz_rsv - sz_fat * n_fat - sz_dir) / pau; + if (fsty == FS_FAT32) { + // Too few clusters for FAT32? + if (n_clst <= MAX_FAT16) { + // Adjust cluster size and retry + if (sz_au == 0 && (sz_au = pau / 2) != 0) { + continue; + } + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + if (fsty == FS_FAT16) { + // Too many clusters for FAT16 + if (n_clst > MAX_FAT16) { + if (sz_au == 0 && (pau * 2) <= 64) { + // Adjust cluster size and retry + sz_au = pau * 2; + continue; + } + if ((fsopt & FM_FAT32)) { + // Switch type to FAT32 and retry + fsty = FS_FAT32; + continue; + } + // Adjust cluster size and retry + if (sz_au == 0 && (sz_au = pau * 2) <= 128) { + continue; + } + LEAVE_MKFS(FR_MKFS_ABORTED); + } + // Too few clusters for FAT16 + if (n_clst <= MAX_FAT12) { + // Adjust cluster size and retry + if (sz_au == 0 && (sz_au = pau * 2) <= 128) { + continue; + } + LEAVE_MKFS(FR_MKFS_ABORTED); + } + } + // Too many clusters for FAT12 + if (fsty == FS_FAT12 && n_clst > MAX_FAT12) { + LEAVE_MKFS(FR_MKFS_ABORTED); + } + + // Ok, it is the valid cluster configuration + + break; + } while (1); + +# if FF_USE_TRIM + // Inform storage device that the volume area may be erased + lba[0] = b_vol; + lba[1] = b_vol + sz_vol - 1; + disk_ioctl(pdrv, CTRL_TRIM, lba); +# endif + // Create FAT VBR + + memset(buf, 0, ss); + // Boot jump code (x86), OEM name + memcpy(buf + BS_JmpBoot, + "\xEB\xFE\x90" + "MSDOS5.0", + 11); + // Sector size [byte] + st_word(buf + BPB_BytsPerSec, ss); + // Cluster size [sector] + buf[BPB_SecPerClus] = (BYTE)pau; + // Size of reserved area + st_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv); + // Number of FATs + buf[BPB_NumFATs] = (BYTE)n_fat; + // Number of root directory entries + st_word(buf + BPB_RootEntCnt, (WORD)((fsty == FS_FAT32) ? 0 : n_root)); + if (sz_vol < 0x10000) { + // Volume size in 16-bit LBA + st_word(buf + BPB_TotSec16, (WORD)sz_vol); + } + else { + // Volume size in 32-bit LBA + st_dword(buf + BPB_TotSec32, (DWORD)sz_vol); + } + // Media descriptor byte + buf[BPB_Media] = 0xF8; + // Number of sectors per track (for int13) + st_word(buf + BPB_SecPerTrk, 63); + // Number of heads (for int13) + st_word(buf + BPB_NumHeads, 255); + // Volume offset in the physical drive [sector] + st_dword(buf + BPB_HiddSec, (DWORD)b_vol); + if (fsty == FS_FAT32) { + // VSN + st_dword(buf + BS_VolID32, vsn); + // FAT size [sector] + st_dword(buf + BPB_FATSz32, sz_fat); + // Root directory cluster # (2) + st_dword(buf + BPB_RootClus32, 2); + // Offset of FSINFO sector (VBR + 1) + st_word(buf + BPB_FSInfo32, 1); + // Offset of backup VBR (VBR + 6) + st_word(buf + BPB_BkBootSec32, 6); + // Drive number (for int13) + buf[BS_DrvNum32] = 0x80; + // Extended boot signature + buf[BS_BootSig32] = 0x29; + // Volume label, FAT signature + memcpy(buf + BS_VolLab32, + "NO NAME " + "FAT32 ", + 19); + } + else { + // VSN + st_dword(buf + BS_VolID, vsn); + // FAT size [sector] + st_word(buf + BPB_FATSz16, (WORD)sz_fat); + // Drive number (for int13) + buf[BS_DrvNum] = 0x80; + // Extended boot signature + buf[BS_BootSig] = 0x29; + // Volume label, FAT signature + memcpy(buf + BS_VolLab, + "NO NAME " + "FAT ", + 19); + } + // Signature (offset is fixed here regardless of sector size) + st_word(buf + BS_55AA, 0xAA55); + // Write it to the VBR sector + if (disk_write(pdrv, buf, b_vol, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + + // Create FSINFO record if needed + + if (fsty == FS_FAT32) { + // Write backup VBR (VBR + 6) + disk_write(pdrv, buf, b_vol + 6, 1); + memset(buf, 0, ss); + st_dword(buf + FSI_LeadSig, 0x41615252); + st_dword(buf + FSI_StrucSig, 0x61417272); + // Number of free clusters + st_dword(buf + FSI_Free_Count, n_clst - 1); + // Last allocated cluster# + st_dword(buf + FSI_Nxt_Free, 2); + st_word(buf + BS_55AA, 0xAA55); + // Write backup FSINFO (VBR + 7) + disk_write(pdrv, buf, b_vol + 7, 1); + // Write original FSINFO (VBR + 1) + disk_write(pdrv, buf, b_vol + 1, 1); + } + + // Initialize FAT area + + memset(buf, 0, sz_buf * ss); + // FAT start sector + sect = b_fat; + // Initialize FATs each + for (i = 0; i < n_fat; i++) { + if (fsty == FS_FAT32) { + // FAT[0] + st_dword(buf + 0, 0xFFFFFFF8); + // FAT[1] + st_dword(buf + 4, 0xFFFFFFFF); + // FAT[2] (root directory) + st_dword(buf + 8, 0x0FFFFFFF); + } + else { + // FAT[0] and FAT[1] + st_dword(buf + 0, (fsty == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8); + } + // Number of FAT sectors + nsect = sz_fat; + // Fill FAT sectors + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // Rest of FAT all are cleared + memset(buf, 0, ss); + sect += n; + nsect -= n; + } while (nsect); + } + + // Initialize root directory (fill with zero) + + // Number of root directory sectors + nsect = (fsty == FS_FAT32) ? pau : sz_dir; + do { + n = (nsect > sz_buf) ? sz_buf : nsect; + if (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + sect += n; + nsect -= n; + } while (nsect); + } + + // A FAT volume has been created here + + // Determine system ID in the MBR partition table + + if (FF_FS_EXFAT && fsty == FS_EXFAT) { + // exFAT + sys = 0x07; + } + else if (fsty == FS_FAT32) { + // FAT32X + sys = 0x0C; + } + else if (sz_vol >= 0x10000) { + // FAT12/16 (large) + sys = 0x06; + } + else if (fsty == FS_FAT16) { + // FAT16 + sys = 0x04; + } + else { + // FAT12 + sys = 0x01; + } + + // Update partition information + + // Volume is in the existing partition + if (FF_MULTI_PARTITION && ipart != 0) { + // Is the partition in MBR? + if (!FF_LBA64 || !(fsopt & 0x80)) { + // Update system ID in the partition table + + // Read the MBR + if (disk_read(pdrv, buf, 0, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + // Set system ID + buf[MBR_Table + (ipart - 1) * SZ_PTE + PTE_System] = sys; + // Write it back to the MBR + if (disk_write(pdrv, buf, 0, 1) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + } + // Volume as a new single partition + } + else { + // Create partition table if not in SFD format + if (!(fsopt & FM_SFD)) { + lba[0] = sz_vol; + lba[1] = 0; + res = create_partition(pdrv, lba, sys, buf); + if (res != FR_OK) { + LEAVE_MKFS(res); + } + } + } + + if (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) { + LEAVE_MKFS(FR_DISK_ERR); + } + + LEAVE_MKFS(FR_OK); +} + +# if FF_MULTI_PARTITION +//----------------------------------------------------------------------- + +// Create Partition Table on the Physical Drive + +//----------------------------------------------------------------------- + +FRESULT f_fdisk(BYTE pdrv, const LBA_t ptbl[], void* work) { + BYTE* buf = (BYTE*)work; + DSTATUS stat; + FRESULT res; + + // Initialize the physical drive + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) { + return FR_NOT_READY; + } + if (stat & STA_PROTECT) { + return FR_WRITE_PROTECTED; + } + +# if FF_USE_LFN == 3 + // Use heap memory for working buffer + if (!buf) { + buf = ff_memalloc(FF_MAX_SS); + } +# endif + if (!buf) { + return FR_NOT_ENOUGH_CORE; + } + + // Create partitions (system ID is temporary setting and determined by + // f_mkfs) + res = create_partition(pdrv, ptbl, 0x07, buf); + + LEAVE_MKFS(res); +} + +// FF_MULTI_PARTITION +# endif +// !FF_FS_READONLY && FF_USE_MKFS +#endif + +#if FF_USE_STRFUNC +# if FF_USE_LFN && FF_LFN_UNICODE \ + && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3) +# error Wrong FF_STRF_ENCODE setting +# endif +//----------------------------------------------------------------------- + +// Get a String from the File + +//----------------------------------------------------------------------- + +TCHAR* f_gets(TCHAR* buff, int len, FIL* fp) { + int nc = 0; + TCHAR* p = buff; + BYTE s[4]; + UINT rc; + DWORD dc; +# if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE <= 2 + WCHAR wc; +# endif +# if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE == 3 + UINT ct; +# endif + +// With code conversion (Unicode API) +# if FF_USE_LFN && FF_LFN_UNICODE + // Make a room for the character and terminator + + if (FF_LFN_UNICODE == 1) { + len -= (FF_STRF_ENCODE == 0) ? 1 : 2; + } + if (FF_LFN_UNICODE == 2) { + len -= (FF_STRF_ENCODE == 0) ? 3 : 4; + } + if (FF_LFN_UNICODE == 3) { + len -= 1; + } + while (nc < len) { + // Read a character in ANSI/OEM +# if FF_STRF_ENCODE == 0 + // Get a code unit + f_read(fp, s, 1, &rc); + // EOF? + if (rc != 1) { + break; + } + wc = s[0]; + // DBC 1st byte? + if (dbc_1st((BYTE)wc)) { + // Get 2nd byte + f_read(fp, s, 1, &rc); + // Wrong code? + if (rc != 1 || !dbc_2nd(s[0])) { + continue; + } + wc = wc << 8 | s[0]; + } + // Convert ANSI/OEM into Unicode + dc = ff_oem2uni(wc, CODEPAGE); + // Conversion error? + if (dc == 0) { + continue; + } + // Read a character in UTF-16LE/BE +# elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 + // Get a code unit + f_read(fp, s, 2, &rc); + // EOF? + if (rc != 2) { + break; + } + dc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + // Broken surrogate pair? + if (IsSurrogateL(dc)) { + continue; + } + // High surrogate? + if (IsSurrogateH(dc)) { + // Get low surrogate + f_read(fp, s, 2, &rc); + // EOF? + if (rc != 2) { + break; + } + wc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1]; + // Broken surrogate pair? + if (!IsSurrogateL(wc)) { + continue; + } + // Merge surrogate pair + dc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF); + } + // Read a character in UTF-8 +# else + // Get a code unit + f_read(fp, s, 1, &rc); + // EOF? + if (rc != 1) { + break; + } + dc = s[0]; + // Multi-byte sequence? + if (dc >= 0x80) { + ct = 0; + // 2-byte sequence? + if ((dc & 0xE0) == 0xC0) { + dc &= 0x1F; + ct = 1; + } + // 3-byte sequence? + if ((dc & 0xF0) == 0xE0) { + dc &= 0x0F; + ct = 2; + } + // 4-byte sequence? + if ((dc & 0xF8) == 0xF0) { + dc &= 0x07; + ct = 3; + } + if (ct == 0) { + continue; + } + // Get trailing bytes + f_read(fp, s, ct, &rc); + if (rc != ct) { + break; + } + rc = 0; + // Merge the byte sequence + do { + if ((s[rc] & 0xC0) != 0x80) { + break; + } + dc = dc << 6 | (s[rc] & 0x3F); + } while (++rc < ct); + // Wrong encoding? + if (rc != ct || dc < 0x80 || IsSurrogate(dc) || dc >= 0x110000) { + continue; + } + } +# endif + // A code point is avaialble in dc to be output + + // Strip \r off if needed + if (FF_USE_STRFUNC == 2 && dc == '\r') { + continue; + } + // Output it in UTF-16/32 encoding +# if FF_LFN_UNICODE == 1 || FF_LFN_UNICODE == 3 + // Out of BMP at UTF-16? + if (FF_LFN_UNICODE == 1 && dc >= 0x10000) { + // Make and output high surrogate + *p++ = (TCHAR)(0xD800 | ((dc >> 10) - 0x40)); + nc++; + // Make low surrogate + dc = 0xDC00 | (dc & 0x3FF); + } + *p++ = (TCHAR)dc; + nc++; + // End of line? + if (dc == '\n') { + break; + } + // Output it in UTF-8 encoding +# elif FF_LFN_UNICODE == 2 + // Single byte? + if (dc < 0x80) { + *p++ = (TCHAR)dc; + nc++; + // End of line? + if (dc == '\n') { + break; + } + // 2-byte sequence? + } + else if (dc < 0x800) { + *p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 2; + // 3-byte sequence? + } + else if (dc < 0x10000) { + *p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 3; + // 4-byte sequence + } + else { + *p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07)); + *p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F)); + *p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F)); + nc += 4; + } +# endif + } + +// Byte-by-byte read without any conversion (ANSI/OEM API) +# else + // Make a room for the terminator + len -= 1; + while (nc < len) { + // Get a byte + f_read(fp, s, 1, &rc); + // EOF? + if (rc != 1) { + break; + } + dc = s[0]; + if (FF_USE_STRFUNC == 2 && dc == '\r') { + continue; + } + *p++ = (TCHAR)dc; + nc++; + if (dc == '\n') { + break; + } + } +# endif + + // Terminate the string + *p = 0; + // When no data read due to EOF or error, return with error. + return nc ? buff : 0; +} + +# if !FF_FS_READONLY +# include +static constexpr const uint32_t SZ_PUTC_BUF = 64; +static constexpr const uint32_t SZ_NUM_BUF = 32; + +//----------------------------------------------------------------------- + +// Put a Character to the File (with sub-functions) + +//----------------------------------------------------------------------- + +// Output buffer and work area + +struct putbuff { + // Ptr to the writing file + FIL* fp; + // Write index of buf[] (-1:error), number of encoding units written + int idx, nchr; +# if FF_USE_LFN && FF_LFN_UNICODE == 1 + WCHAR hs; +# elif FF_USE_LFN && FF_LFN_UNICODE == 2 + BYTE bs[4]; + UINT wi, ct; +# endif + // Write buffer + BYTE buf[SZ_PUTC_BUF]; +}; + +// Buffered file write with code conversion + +static void putc_bfd(putbuff* pb, TCHAR c) { + UINT n; + int i, nc; +# if FF_USE_LFN && FF_LFN_UNICODE + WCHAR hs, wc; +# if FF_LFN_UNICODE == 2 + DWORD dc; + const TCHAR* tp; +# endif +# endif + + // LF -> CRLF conversion + if (FF_USE_STRFUNC == 2 && c == '\n') { + putc_bfd(pb, '\r'); + } + + // Write index of pb->buf[] + i = pb->idx; + // In write error? + if (i < 0) { + return; + } + // Write unit counter + nc = pb->nchr; + +# if FF_USE_LFN && FF_LFN_UNICODE +// UTF-16 input +# if FF_LFN_UNICODE == 1 + // Is this a high-surrogate? + if (IsSurrogateH(c)) { + // Save it for next + pb->hs = c; + return; + } + hs = pb->hs; + pb->hs = 0; + // Is there a leading high-surrogate? + if (hs != 0) { + // Discard high-surrogate if not a surrogate pair + if (!IsSurrogateL(c)) { + hs = 0; + } + } + else { + // Discard stray low-surrogate + if (IsSurrogateL(c)) { + return; + } + } + wc = c; + // UTF-8 input +# elif FF_LFN_UNICODE == 2 + for (;;) { + // Out of multi-byte sequence? + if (pb->ct == 0) { + // Save 1st byte + pb->bs[pb->wi = 0] = (BYTE)c; + // Single byte code? + if ((BYTE)c < 0x80) { + break; + } + // 2-byte sequence? + if (((BYTE)c & 0xE0) == 0xC0) { + pb->ct = 1; + } + // 3-byte sequence? + if (((BYTE)c & 0xF0) == 0xE0) { + pb->ct = 2; + } + // 4-byte sequence? + if (((BYTE)c & 0xF8) == 0xF0) { + pb->ct = 3; + } + // Wrong leading byte (discard it) + return; + // In the multi-byte sequence + } + else { + // Broken sequence? + if (((BYTE)c & 0xC0) != 0x80) { + // Discard the sequense + pb->ct = 0; + continue; + } + // Save the trailing byte + pb->bs[++pb->wi] = (BYTE)c; + // End of the sequence? + if (--pb->ct == 0) { + break; + } + return; + } + } + tp = (const TCHAR*)pb->bs; + // UTF-8 ==> UTF-16 + dc = tchar2uni(&tp); + // Wrong code? + if (dc == 0xFFFFFFFF) { + return; + } + hs = (WCHAR)(dc >> 16); + wc = (WCHAR)dc; + // UTF-32 input +# elif FF_LFN_UNICODE == 3 + // Discard invalid code + if (IsSurrogate(c) || c >= 0x110000) { + return; + } + // Out of BMP? + if (c >= 0x10000) { + // Make high surrogate + hs = (WCHAR)(0xD800 | ((c >> 10) - 0x40)); + // Make low surrogate + wc = 0xDC00 | (c & 0x3FF); + } + else { + hs = 0; + wc = (WCHAR)c; + } +# endif +// A code point in UTF-16 is available in hs and wc + +// Write a code point in UTF-16LE +# if FF_STRF_ENCODE == 1 + // Surrogate pair? + if (hs != 0) { + st_word(&pb->buf[i], hs); + i += 2; + nc++; + } + st_word(&pb->buf[i], wc); + i += 2; + // Write a code point in UTF-16BE +# elif FF_STRF_ENCODE == 2 + // Surrogate pair? + if (hs != 0) { + pb->buf[i++] = (BYTE)(hs >> 8); + pb->buf[i++] = (BYTE)hs; + nc++; + } + pb->buf[i++] = (BYTE)(wc >> 8); + pb->buf[i++] = (BYTE)wc; + // Write a code point in UTF-8 +# elif FF_STRF_ENCODE == 3 + // 4-byte sequence? + if (hs != 0) { + nc += 3; + hs = (hs & 0x3FF) + 0x40; + pb->buf[i++] = (BYTE)(0xF0 | hs >> 8); + pb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F)); + pb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F)); + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + else { + // Single byte? + if (wc < 0x80) { + pb->buf[i++] = (BYTE)wc; + } + else { + // 2-byte sequence? + if (wc < 0x800) { + nc += 1; + pb->buf[i++] = (BYTE)(0xC0 | wc >> 6); + // 3-byte sequence + } + else { + nc += 2; + pb->buf[i++] = (BYTE)(0xE0 | wc >> 12); + pb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F)); + } + pb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F)); + } + } + // Write a code point in ANSI/OEM +# else + if (hs != 0) { + return; + } + // UTF-16 ==> ANSI/OEM + wc = ff_uni2oem(wc, CODEPAGE); + if (wc == 0) { + return; + } + if (wc >= 0x100) { + pb->buf[i++] = (BYTE)(wc >> 8); + nc++; + } + pb->buf[i++] = (BYTE)wc; +# endif + +// ANSI/OEM input (without re-encoding) +# else + pb->buf[i++] = (BYTE)c; +# endif + + // Write buffered characters to the file + if (i >= (int)(sizeof pb->buf) - 4) { + f_write(pb->fp, pb->buf, (UINT)i, &n); + i = (n == (UINT)i) ? 0 : -1; + } + pb->idx = i; + pb->nchr = nc + 1; +} + +// Flush remaining characters in the buffer + +static int putc_flush(putbuff* pb) { + UINT nw; + + // Flush buffered characters to the file + if (pb->idx >= 0 && f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK + && (UINT)pb->idx == nw) { + return pb->nchr; + } + return -1; +} + +// Initialize write buffer + +static void putc_init(putbuff* pb, FIL* fp) { + memset(pb, 0, sizeof(putbuff)); + pb->fp = fp; +} + +int f_putc(TCHAR c, FIL* fp) { + putbuff pb; + + putc_init(&pb, fp); + // Put the character + putc_bfd(&pb, c); + return putc_flush(&pb); +} + +//----------------------------------------------------------------------- + +// Put a String to the File + +//----------------------------------------------------------------------- + +int f_puts(const TCHAR* str, FIL* fp) { + putbuff pb; + + putc_init(&pb, fp); + // Put the string + while (*str) { + putc_bfd(&pb, *str++); + } + return putc_flush(&pb); +} + +//----------------------------------------------------------------------- + +// Put a Formatted String to the File (with sub-functions) + +//----------------------------------------------------------------------- + +# if FF_PRINT_FLOAT && FF_INTDEF == 2 +# include + +// Calculate log10(n) in integer output +static int ilog10(double n) { + int rv = 0; + + // Decimate digit in right shift + while (n >= 10) { + if (n >= 100000) { + n /= 100000; + rv += 5; + } + else { + n /= 10; + rv++; + } + } + // Decimate digit in left shift + while (n < 1) { + if (n < 0.00001) { + n *= 100000; + rv -= 5; + } + else { + n *= 10; + rv--; + } + } + return rv; +} + +// Calculate 10^n in integer input +static double i10x(int n) { + double rv = 1; + + // Left shift + while (n > 0) { + if (n >= 5) { + rv *= 100000; + n -= 5; + } + else { + rv *= 10; + n--; + } + } + // Right shift + while (n < 0) { + if (n <= -5) { + rv /= 100000; + n += 5; + } + else { + rv /= 10; + n++; + } + } + return rv; +} + +static void ftoa( + // Buffer to output the floating point string + char* buf, + // Value to output + double val, + // Number of fractional digits + int prec, + // Notation + TCHAR fmt) { + int d; + int e = 0, m = 0; + char sign = 0; + double w; + const char* er = 0; + const char ds = FF_PRINT_FLOAT == 2 ? ',' : '.'; + + // Not a number? + if (isnan(val)) { + er = "NaN"; + } + else { + // Default precision? (6 fractional digits) + if (prec < 0) { + prec = 6; + } + // Negative? + if (val < 0) { + val = 0 - val; + sign = '-'; + } + else { + sign = '+'; + } + // Infinite? + if (isinf(val)) { + er = "INF"; + } + else { + // Decimal notation? + if (fmt == 'f') { + // Round (nearest) + val += i10x(0 - prec) / 2; + m = ilog10(val); + if (m < 0) { + m = 0; + } + // Buffer overflow? + if (m + prec + 3 >= SZ_NUM_BUF) { + er = "OV"; + } + // E notation + } + else { + // Not a true zero? + if (val != 0) { + // Round (nearest) + val += i10x(ilog10(val) - prec) / 2; + e = ilog10(val); + // Buffer overflow or E > +99? + if (e > 99 || prec + 7 >= SZ_NUM_BUF) { + er = "OV"; + } + else { + if (e < -99) { + e = -99; + } + // Normalize + val /= i10x(e); + } + } + } + } + // Not error condition + if (!er) { + // Add a - if negative value + if (sign == '-') { + *buf++ = sign; + } + // Put decimal number + do { + // Insert a decimal separator when get into fractional part + if (m == -1) { + *buf++ = ds; + } + // Snip the highest digit d + w = i10x(m); + d = (int)(val / w); + val -= d * w; + // Put the digit + *buf++ = (char)('0' + d); + // Output all digits specified by prec + } while (--m >= -prec); + // Put exponent if needed + if (fmt != 'f') { + *buf++ = (char)fmt; + if (e < 0) { + e = 0 - e; + *buf++ = '-'; + } + else { + *buf++ = '+'; + } + *buf++ = (char)('0' + e / 10); + *buf++ = (char)('0' + e % 10); + } + } + } + // Error condition + if (er) { + // Add sign if needed + if (sign) { + *buf++ = sign; + } + // Put error symbol + do { + *buf++ = *er++; + } while (*er); + } + // Term + *buf = 0; +} + +// FF_PRINT_FLOAT && FF_INTDEF == 2 +# endif + +int f_printf(FIL* fp, const TCHAR* fmt, ...) { + va_list arp; + putbuff pb; + UINT i, j, w, f, r; + int prec; +# if FF_PRINT_LLI && FF_INTDEF == 2 + QWORD v; +# else + DWORD v; +# endif + TCHAR* tp; + TCHAR tc, pad; + TCHAR nul = 0; + char d, str[SZ_NUM_BUF]; + + putc_init(&pb, fp); + + va_start(arp, fmt); + + for (;;) { + tc = *fmt++; + // End of format string + if (tc == 0) { + break; + } + // Not an escape character (pass-through) + if (tc != '%') { + putc_bfd(&pb, tc); + continue; + } + // Initialize parms + f = w = 0; + pad = ' '; + prec = -1; + tc = *fmt++; + // Flag: '0' padded + if (tc == '0') { + pad = '0'; + tc = *fmt++; + // Flag: Left aligned + } + else if (tc == '-') { + f = 2; + tc = *fmt++; + } + // Minimum width from an argument + if (tc == '*') { + w = va_arg(arp, int); + tc = *fmt++; + } + else { + // Minimum width + while (IsDigit(tc)) { + w = w * 10 + tc - '0'; + tc = *fmt++; + } + } + // Precision + if (tc == '.') { + tc = *fmt++; + // Precision from an argument + if (tc == '*') { + prec = va_arg(arp, int); + tc = *fmt++; + } + else { + prec = 0; + // Precision + while (IsDigit(tc)) { + prec = prec * 10 + tc - '0'; + tc = *fmt++; + } + } + } + // Size: long int + if (tc == 'l') { + f |= 4; + tc = *fmt++; +# if FF_PRINT_LLI && FF_INTDEF == 2 + // Size: long long int + if (tc == 'l') { + f |= 8; + tc = *fmt++; + } +# endif + } + // End of format string + if (tc == 0) { + break; + } + // Atgument type is... + switch (tc) { + // Unsigned binary + case 'b': + r = 2; + break; + + // Unsigned octal + case 'o': + r = 8; + break; + + // Signed decimal + case 'd': + // Unsigned decimal + case 'u': + r = 10; + break; + + // Unsigned hexadecimal (lower case) + case 'x': + // Unsigned hexadecimal (upper case) + case 'X': + r = 16; + break; + + // Character + case 'c': + putc_bfd(&pb, (TCHAR)va_arg(arp, int)); + continue; + + // String + case 's': + // Get a pointer argument + tp = va_arg(arp, TCHAR*); + // Null ptr generates a null string + if (!tp) { + tp = &nul; + } + // j = tcslen(tp) + for (j = 0; tp[j]; j++) + ; + // Limited length of string body + if (prec >= 0 && j > (UINT)prec) { + j = prec; + } + // Left pads + for (; !(f & 2) && j < w; j++) { + putc_bfd(&pb, pad); + } + // Body + while (*tp && prec--) { + putc_bfd(&pb, *tp++); + } + // Right pads + while (j++ < w) { + putc_bfd(&pb, ' '); + } + continue; +# if FF_PRINT_FLOAT && FF_INTDEF == 2 + // Floating point (decimal) + case 'f': + // Floating point (e) + case 'e': + // Floating point (E) + case 'E': + // Make a floating point string + ftoa(str, va_arg(arp, double), prec, tc); + // Left pads + for (j = strlen(str); !(f & 2) && j < w; j++) { + putc_bfd(&pb, pad); + } + // Body + for (i = 0; str[i]; putc_bfd(&pb, str[i++])) + ; + // Right pads + while (j++ < w) { + putc_bfd(&pb, ' '); + } + continue; +# endif + // Unknown type (pass-through) + default: + putc_bfd(&pb, tc); + continue; + } + + // Get an integer argument and put it in numeral + +# if FF_PRINT_LLI && FF_INTDEF == 2 + // long long argument? + if (f & 8) { + v = (QWORD)va_arg(arp, long long); + // long argument? + } + else if (f & 4) { + v = (tc == 'd') ? (QWORD)(long long)va_arg(arp, long) + : (QWORD)va_arg(arp, unsigned long); + // int/short/char argument + } + else { + v = (tc == 'd') ? (QWORD)(long long)va_arg(arp, int) + : (QWORD)va_arg(arp, unsigned int); + } + // Negative value? + if (tc == 'd' && (v & 0x8000000000000000)) { + v = 0 - v; + f |= 1; + } +# else + // long argument? + if (f & 4) { + v = (DWORD)va_arg(arp, long); + // int/short/char argument + } + else { + v = (tc == 'd') ? (DWORD)(long)va_arg(arp, int) + : (DWORD)va_arg(arp, unsigned int); + } + // Negative value? + if (tc == 'd' && (v & 0x80000000)) { + v = 0 - v; + f |= 1; + } +# endif + i = 0; + // Make an integer number string + do { + d = (char)(v % r); + v /= r; + if (d > 9) { + d += (tc == 'x') ? 0x27 : 0x07; + } + str[i++] = d + '0'; + } while (v && i < SZ_NUM_BUF); + // Sign + if (f & 1) { + str[i++] = '-'; + } + // Write it + + // Left pads + for (j = i; !(f & 2) && j < w; j++) { + putc_bfd(&pb, pad); + } + // Body + do { + putc_bfd(&pb, (TCHAR)str[--i]); + } while (i); + // Right pads + while (j++ < w) { + putc_bfd(&pb, ' '); + } + } + + va_end(arp); + + return putc_flush(&pb); +} + +// !FF_FS_READONLY +# endif +// FF_USE_STRFUNC +#endif + +#if FF_CODE_PAGE == 0 +//----------------------------------------------------------------------- + +// Set Active Codepage for the Path Name + +//----------------------------------------------------------------------- + +FRESULT f_setcp(WORD cp) { + static const WORD validcp[22] + = { 437, 720, 737, 771, 775, 850, 852, 855, 857, 860, 861, + 862, 863, 864, 865, 866, 869, 932, 936, 949, 950, 0 }; + static const BYTE* const tables[22] + = { Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct855, + Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, + Ct869, Dc932, Dc936, Dc949, Dc950, 0 }; + UINT i; + + // Find the code page + for (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) + ; + // Not found? + if (validcp[i] != cp) { + return FR_INVALID_PARAMETER; + } + + CodePage = cp; + // DBCS + if (cp >= 900) { + ExCvt = 0; + DbcTbl = tables[i]; + // SBCS + } + else { + ExCvt = tables[i]; + DbcTbl = 0; + } + return FR_OK; +} +#endif /* FF_CODE_PAGE == 0 */ diff --git a/src/fs/fatfs/ffsystem.cpp b/src/fs/fatfs/ffsystem.cpp new file mode 100644 index 000000000..1332ee65a --- /dev/null +++ b/src/fs/fatfs/ffsystem.cpp @@ -0,0 +1,190 @@ + +/** + * @file ffsystem.c + * @brief A Sample Code of User Provided OS Dependent Functions for FatFs + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#include "ff.h" + +/// Use dynamic memory allocation +#if FF_USE_LFN == 3 + +/// with POSIX API +# include + +void* ff_memalloc(UINT _msize) { + return kmalloc((size_t)_msize); +} + +void ff_memfree(void* _mblock) { + kfree(_mblock); +} + +#endif + +/// Mutal exclusion +#if FF_FS_REENTRANT + +// Definitions of Mutex +/// 0:Win32, 1:uITRON4.0, 2:uC/OS-II, 3:FreeRTOS, 4:CMSIS-RTOS +# define OS_TYPE 0 + +// Win32 +# if OS_TYPE == 0 +# include +// Table of mutex handle +static HANDLE Mutex[FF_VOLUMES + 1]; + +// uITRON +# elif OS_TYPE == 1 +# include "itron.h" +# include "kernel.h" +// Table of mutex ID +static mtxid Mutex[FF_VOLUMES + 1]; + +// uc/OS-II +# elif OS_TYPE == 2 +# include "includes.h" +// Table of mutex pinter +static OS_EVENT* Mutex[FF_VOLUMES + 1]; + +// FreeRTOS +# elif OS_TYPE == 3 +# include "FreeRTOS.h" +# include "semphr.h" +// Table of mutex handle +static SemaphoreHandle_t Mutex[FF_VOLUMES + 1]; + +// CMSIS-RTOS +# elif OS_TYPE == 4 +# include "cmsis_os.h" +// Table of mutex ID +static osMutexId Mutex[FF_VOLUMES + 1]; + +# endif + +int ff_mutex_create(int _vol) { + // Win32 +# if OS_TYPE == 0 + Mutex[_vol] = CreateMutex(NULL, FALSE, NULL); + return (int)(Mutex[_vol] != INVALID_HANDLE_VALUE); + + // uITRON +# elif OS_TYPE == 1 + T_CMTX cmtx = { TA_TPRI, 1 }; + + Mutex[_vol] = acre_mtx(&cmtx); + return (int)(Mutex[_vol] > 0); + + // uC/OS-II +# elif OS_TYPE == 2 + OS_ERR err; + + Mutex[_vol] = OSMutexCreate(0, &err); + return (int)(err == OS_NO_ERR); + + // FreeRTOS +# elif OS_TYPE == 3 + Mutex[_vol] = xSemaphoreCreateMutex(); + return (int)(Mutex[_vol] != NULL); + + // CMSIS-RTOS +# elif OS_TYPE == 4 + osMutexDef(cmsis_os_mutex); + + Mutex[_vol] = osMutexCreate(osMutex(cmsis_os_mutex)); + return (int)(Mutex[vol] != NULL); + +# endif +} + +void ff_mutex_delete(int _vol) { + // Win32 +# if OS_TYPE == 0 + CloseHandle(Mutex[_vol]); + + // uITRON +# elif OS_TYPE == 1 + del_mtx(Mutex[_vol]); + + // uC/OS-II +# elif OS_TYPE == 2 + OS_ERR err; + + OSMutexDel(Mutex[_vol], OS_DEL_ALWAYS, &err); + + // FreeRTOS +# elif OS_TYPE == 3 + vSemaphoreDelete(Mutex[_vol]); + + // CMSIS-RTOS +# elif OS_TYPE == 4 + osMutexDelete(Mutex[_vol]); + +# endif +} + +int ff_mutex_take(int _vol) { + // Win32 +# if OS_TYPE == 0 + return (int)(WaitForSingleObject(Mutex[_vol], FF_FS_TIMEOUT) + == WAIT_OBJECT_0); + + // uITRON +# elif OS_TYPE == 1 + return (int)(tloc_mtx(Mutex[_vol], FF_FS_TIMEOUT) == E_OK); + + // uC/OS-II +# elif OS_TYPE == 2 + OS_ERR err; + + OSMutexPend(Mutex[_vol], FF_FS_TIMEOUT, &err)); + return (int)(err == OS_NO_ERR); + + // FreeRTOS +# elif OS_TYPE == 3 + return (int)(xSemaphoreTake(Mutex[_vol], FF_FS_TIMEOUT) == pdTRUE); + + // CMSIS-RTOS +# elif OS_TYPE == 4 + return (int)(osMutexWait(Mutex[_vol], FF_FS_TIMEOUT) == osOK); + +# endif +} + +void ff_mutex_give(int _vol) { + // Win32 +# if OS_TYPE == 0 + ReleaseMutex(Mutex[_vol]); + + // uITRON +# elif OS_TYPE == 1 + unl_mtx(Mutex[_vol]); + + // uC/OS-II +# elif OS_TYPE == 2 + OSMutexPost(Mutex[_vol]); + + // FreeRTOS +# elif OS_TYPE == 3 + xSemaphoreGive(Mutex[_vol]); + + // CMSIS-RTOS +# elif OS_TYPE == 4 + osMutexRelease(Mutex[_vol]); + +# endif +} + +#endif /* FF_FS_REENTRANT */ diff --git a/src/fs/fatfs/ffunicode.cpp b/src/fs/fatfs/ffunicode.cpp new file mode 100644 index 000000000..f41d6548b --- /dev/null +++ b/src/fs/fatfs/ffunicode.cpp @@ -0,0 +1,27433 @@ + +/** + * @file ffunicode.c + * @brief Unicode Handling Functions for FatFs R0.13 and Later + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +/*------------------------------------------------------------------------*/ +/* This module will occupy a huge memory in the .rodata section when the */ +/* FatFs is configured for LFN with DBCS. If the system has a Unicode */ +/* library for the code conversion, this module should be modified to use */ +/* it to avoid silly memory consumption. */ +/*------------------------------------------------------------------------*/ +/* +/ Copyright (C) 2022, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: +/ +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +*/ + +#include "ff.h" + +// This module will be blanked if in non-LFN configuration +#if FF_USE_LFN != 0 + +# define MERGE2(_a, _b) _a##_b +# define CVTBL(_tbl, _cp) MERGE2(_tbl, _cp) + +/// Code Conversion Tables + +/// Japanese +# if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0 +/// Unicode --> Shift_JIS pairs +static const WCHAR uni2oem932[] + = { 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, 0x00B4, + 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, 0x0391, 0x839F, + 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, 0x0395, 0x83A3, 0x0396, + 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, 0x0399, 0x83A7, 0x039A, 0x83A8, + 0x039B, 0x83A9, 0x039C, 0x83AA, 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, + 0x83AD, 0x03A0, 0x83AE, 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, + 0x03A5, 0x83B2, 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, + 0x83B6, 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, + 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, 0x03B9, + 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, 0x03BD, 0x83CB, + 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, 0x03C1, 0x83CF, 0x03C3, + 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, 0x03C6, 0x83D3, 0x03C7, 0x83D4, + 0x03C8, 0x83D5, 0x03C9, 0x83D6, 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, + 0x8441, 0x0412, 0x8442, 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, + 0x0416, 0x8447, 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, + 0x844B, 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, 0x0423, + 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, 0x0427, 0x8458, + 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, 0x042B, 0x845C, 0x042C, + 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, 0x042F, 0x8460, 0x0430, 0x8470, + 0x0431, 0x8471, 0x0432, 0x8472, 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, + 0x8475, 0x0436, 0x8477, 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, + 0x043A, 0x847B, 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, + 0x8480, 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, + 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, 0x0447, + 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, 0x044B, 0x848D, + 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, 0x044F, 0x8491, 0x0451, + 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, 0x2018, 0x8165, 0x2019, 0x8166, + 0x201C, 0x8167, 0x201D, 0x8168, 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, + 0x8164, 0x2026, 0x8163, 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, + 0x203B, 0x81A6, 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, + 0x81F0, 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, 0x2168, + 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, 0x2172, 0xFA42, + 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, 0x2176, 0xFA46, 0x2177, + 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, 0x2190, 0x81A9, 0x2191, 0x81AA, + 0x2192, 0x81A8, 0x2193, 0x81AB, 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, + 0x81CD, 0x2202, 0x81DD, 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, + 0x220B, 0x81B9, 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, + 0x8187, 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, + 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, 0x222C, + 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, 0x223D, 0x81E4, + 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, 0x2266, 0x8185, 0x2267, + 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, 0x2282, 0x81BC, 0x2283, 0x81BD, + 0x2286, 0x81BA, 0x2287, 0x81BB, 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, + 0x81DC, 0x2460, 0x8740, 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, + 0x2464, 0x8744, 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, + 0x8748, 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, 0x2471, + 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, 0x2501, 0x84AA, + 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, 0x250F, 0x84AC, 0x2510, + 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, 0x2517, 0x84AF, 0x2518, 0x84A3, + 0x251B, 0x84AE, 0x251C, 0x84A5, 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, + 0x84B0, 0x2524, 0x84A7, 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, + 0x252C, 0x84A6, 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, + 0x84A8, 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, + 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, 0x25A1, + 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, 0x25BD, 0x81A4, + 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, 0x25CE, 0x819D, 0x25CF, + 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, 0x2606, 0x8199, 0x2640, 0x818A, + 0x2642, 0x8189, 0x266A, 0x81F4, 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, + 0x8140, 0x3001, 0x8141, 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, + 0x3006, 0x8159, 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, + 0x8173, 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, 0x3013, + 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, 0x301F, 0x8781, + 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, 0x3044, 0x82A2, 0x3045, + 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, 0x3048, 0x82A6, 0x3049, 0x82A7, + 0x304A, 0x82A8, 0x304B, 0x82A9, 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, + 0x82AC, 0x304F, 0x82AD, 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, + 0x3053, 0x82B1, 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, + 0x82B5, 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, + 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, 0x3060, + 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, 0x3064, 0x82C2, + 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, 0x3068, 0x82C6, 0x3069, + 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, 0x306C, 0x82CA, 0x306D, 0x82CB, + 0x306E, 0x82CC, 0x306F, 0x82CD, 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, + 0x82D0, 0x3073, 0x82D1, 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, + 0x3077, 0x82D5, 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, + 0x82D9, 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, 0x3084, + 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, 0x3088, 0x82E6, + 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, 0x308C, 0x82EA, 0x308D, + 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, 0x3090, 0x82EE, 0x3091, 0x82EF, + 0x3092, 0x82F0, 0x3093, 0x82F1, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, + 0x8154, 0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, + 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, + 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B, + 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F, 0x30B1, + 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353, 0x30B5, 0x8354, + 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357, 0x30B9, 0x8358, 0x30BA, + 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, + 0x30BF, 0x835E, 0x30C0, 0x835F, 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, + 0x8362, 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, + 0x30C8, 0x8367, 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, + 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F, + 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373, 0x30D5, + 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377, 0x30D9, 0x8378, + 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, + 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380, 0x30E1, 0x8381, 0x30E2, 0x8382, + 0x30E3, 0x8383, 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, + 0x8387, 0x30E8, 0x8388, 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, + 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, + 0x8390, 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394, + 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B, 0x30FD, + 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B, 0x3239, 0x878C, + 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787, 0x32A7, 0x8788, 0x32A8, + 0x8789, 0x3303, 0x8765, 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, + 0x3322, 0x8761, 0x3323, 0x876B, 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, + 0x876C, 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, + 0x334D, 0x8762, 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, + 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773, + 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775, 0x33C4, + 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A, 0x4E03, 0x8EB5, + 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, + 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E, 0x4E10, 0x98A0, 0x4E11, 0x894E, + 0x4E14, 0x8A8E, 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, + 0x8B75, 0x4E19, 0x95B8, 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, + 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, + 0x8BF8, 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5, + 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454, 0x4E45, + 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, + 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6, 0x4E58, 0x98A9, 0x4E59, + 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, + 0x4E71, 0x9790, 0x4E73, 0x93FB, 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, + 0x98AA, 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, + 0x4E8A, 0x98AD, 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, + 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A, + 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1, 0x4E9F, + 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4, 0x4EA4, 0x8CF0, + 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, + 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA, 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, + 0x4EB6, 0x98B7, 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, + 0x98BC, 0x4EC4, 0x98BA, 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, + 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, + 0x8E65, 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574, + 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0, 0x4EE1, + 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8, 0x4EED, 0x98BF, + 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287, 0x4EF6, 0x8C8F, 0x4EF7, + 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, + 0x4F03, 0xFA6C, 0x4F09, 0x98C2, 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, + 0x8AEA, 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, + 0x4F1C, 0x98E5, 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, + 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66, + 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241, 0x4F47, + 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A, 0x4F50, 0x8DB2, + 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, + 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3, 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, + 0x4F5D, 0x98C6, 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, + 0x98CF, 0x4F73, 0x89C0, 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, + 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, + 0x98CA, 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB, + 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3, 0x4F98, + 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, + 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699, 0x4FAE, 0x958E, 0x4FAF, + 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, + 0x4FC3, 0x91A3, 0x4FC4, 0x89E2, 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, + 0xFA73, 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, + 0x4FD7, 0x91AD, 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, + 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD, + 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F, 0x4FF5, + 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4, 0x4FFE, 0x98EA, + 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, + 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5, 0x5011, 0x98EC, 0x5012, 0x937C, + 0x5014, 0x98E1, 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, + 0xFA77, 0x501F, 0x8ED8, 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, + 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, + 0x98E8, 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860, + 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A, 0x5043, + 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3, 0x5049, 0x88CC, + 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1, 0x5056, 0x98F5, 0x505A, + 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, + 0x5072, 0x8EC3, 0x5074, 0x91A4, 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, + 0x98F7, 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, + 0x5091, 0x8C86, 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, + 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942, + 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58, 0x50C2, + 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941, 0x50CD, 0x93AD, + 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, + 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945, 0x50E3, 0x9948, 0x50E5, 0x9946, + 0x50E7, 0x916D, 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, + 0x994B, 0x50F9, 0x994A, 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, + 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, + 0x9951, 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952, + 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7, 0x5137, + 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956, 0x513F, 0x9958, + 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3, 0x5144, 0x8C5A, 0x5145, + 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, + 0x514A, 0xFA7E, 0x514B, 0x8D8E, 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, + 0x9365, 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, + 0x515C, 0x8A95, 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, + 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6, + 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA, 0x5176, + 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93, 0x5180, 0x9962, + 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, + 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4, 0x518F, 0x9967, 0x5190, 0xE3EC, + 0x5191, 0x9968, 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, + 0x996B, 0x5197, 0x8FE7, 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, + 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, + 0x9579, 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E, + 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972, 0x51B4, + 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2, 0x51BD, 0x9977, + 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978, 0x51C6, 0x8F79, 0x51C9, + 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, + 0x51DB, 0x997A, 0x51DC, 0xEAA3, 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, + 0x967D, 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, + 0x51EC, 0xFA83, 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, + 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F, + 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E, 0x5204, + 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0, 0x520A, 0x8AA7, + 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, + 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89, 0x5224, 0x94BB, 0x5225, 0x95CA, + 0x5227, 0x9987, 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, + 0x939E, 0x5233, 0x998A, 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, + 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, + 0x998D, 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F, + 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655, 0x525B, + 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC, 0x5265, 0x948D, + 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B, 0x5270, 0x8FE8, 0x5271, + 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, + 0x527D, 0x9997, 0x527F, 0x9996, 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, + 0x999C, 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, + 0x5294, 0x9999, 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, + 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377, + 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77, 0x52B1, + 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8, 0x52BC, 0x99A2, + 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, + 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7, 0x52CD, 0x99A5, 0x52D2, 0xE8D3, + 0x52D5, 0x93AE, 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, + 0xFA88, 0x52DD, 0x8F9F, 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, + 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, + 0x8AA9, 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE, + 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC, 0x5300, + 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF, 0x5306, 0x99B0, + 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3, 0x530F, 0x99B5, 0x5310, + 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, + 0x531A, 0x99B7, 0x531D, 0x9178, 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, + 0x99B8, 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, + 0x5333, 0x99BB, 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, + 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7, + 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF, 0x5349, + 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA, 0x5352, 0x91B2, + 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, + 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4, 0x5360, 0x90E8, 0x5366, 0x8C54, + 0x5369, 0x99C5, 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, + 0x8AEB, 0x5372, 0xFA8C, 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, + 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, + 0x99CA, 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0, + 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE, 0x53A6, + 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D, 0x53AE, 0x99CF, + 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5, 0x53B6, 0x99D1, 0x53BB, + 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, + 0x53CA, 0x8B79, 0x53CB, 0x9746, 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, + 0x8EFB, 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, + 0x53DB, 0x94BE, 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, + 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9, + 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2, 0x53ED, + 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4, 0x53F1, 0x8EB6, + 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, + 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC, 0x5403, 0x8B68, 0x5404, 0x8A65, + 0x5408, 0x8D87, 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, + 0x93AF, 0x540D, 0x96BC, 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, + 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, + 0x9669, 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF, + 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A, 0x5439, + 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD, 0x543E, 0x8CE1, + 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0, 0x5448, 0x92E6, 0x5449, + 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, + 0x5468, 0x8EFC, 0x546A, 0x8EF4, 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, + 0x96A1, 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, + 0x547C, 0x8CC4, 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, + 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9, + 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91, 0x54A2, + 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC, 0x54A9, 0xFA93, + 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, + 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44, 0x54BD, 0x88F4, 0x54BE, 0x9A43, + 0x54C0, 0x88A3, 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, + 0x99F5, 0x54C8, 0x99FB, 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, + 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, + 0x9689, 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D, + 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4, 0x5507, + 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49, 0x5516, 0x88A0, + 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5, 0x5533, 0x9A59, 0x5538, + 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, + 0x5545, 0x9A55, 0x5546, 0x8FA4, 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, + 0x8C5B, 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, + 0x5563, 0x9A51, 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, + 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68, + 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62, 0x5599, + 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85, 0x559E, 0x9A63, + 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, + 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA, 0x55AE, 0x9A64, 0x55B0, 0x8BF2, + 0x55B6, 0x8963, 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, + 0x9A70, 0x55DA, 0x9A6A, 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, + 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, + 0x9A74, 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73, + 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC, 0x562F, + 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B, 0x5636, 0x9A7C, + 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158, 0x564E, 0x9A78, 0x5650, + 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, + 0x566B, 0x9A80, 0x566C, 0x9A83, 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, + 0x94B6, 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, + 0x568F, 0x9A8A, 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, + 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90, + 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92, 0x56C8, + 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97, 0x56D7, 0x9A98, + 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, + 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99, 0x56F0, 0x8DA2, 0x56F2, 0x88CD, + 0x56F3, 0x907D, 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, + 0x9A9C, 0x5700, 0x9A9B, 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, + 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, + 0x8980, 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6, + 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD, 0x572D, + 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9, 0x573B, 0x9AAB, + 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF, 0x574A, 0x9656, 0x574E, + 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, + 0x5761, 0x9AB1, 0x5764, 0x8DA3, 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, + 0x9AAE, 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, + 0x5789, 0x9AB3, 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, + 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98, + 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA, 0x57C6, + 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684, 0x57CE, 0x8FE9, + 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, + 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575, 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, + 0x57F7, 0x8EB7, 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, + 0x9678, 0x5802, 0x93B0, 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, + 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, + 0x9AC6, 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981, + 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4, 0x583D, + 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2, 0x584B, 0x9AC8, + 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383, 0x5857, 0x9368, 0x5858, + 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, + 0x5869, 0x8996, 0x586B, 0x9355, 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, + 0x906F, 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, + 0x5893, 0x95E6, 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, + 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E, + 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2, 0x58BB, + 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7, 0x58C7, 0x9264, + 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, + 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC, 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, + 0x58DE, 0x9AD3, 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, + 0x8E6D, 0x58EC, 0x9070, 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, + 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, + 0x9AE2, 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7, + 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4, 0x5910, + 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7, 0x5919, 0x8F67, + 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9, 0x5922, 0x96B2, 0x5925, + 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, + 0x592C, 0x9AED, 0x592D, 0x9AEE, 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, + 0x9AEF, 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, + 0x5947, 0x8AEF, 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, + 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A, + 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6, 0x595B, + 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8, 0x5963, 0xFAA3, + 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, + 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1, 0x5973, 0x8F97, 0x5974, 0x937A, + 0x5978, 0x9B40, 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, + 0x94DC, 0x5984, 0x96CF, 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, + 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, + 0x9B45, 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369, + 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8, 0x59BE, + 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E, 0x59D0, 0x88B7, + 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF, 0x59D9, 0x9B4B, 0x59DA, + 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, + 0x59EA, 0x96C3, 0x59EB, 0x9550, 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, + 0x8E70, 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, + 0x5A18, 0x96BA, 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, + 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56, + 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B, 0x5A46, + 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58, 0x5A66, 0x9577, + 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, + 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B, 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, + 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, + 0x8C99, 0x5AD0, 0x9B6B, 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, + 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, + 0x9B66, 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69, + 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964, 0x5B32, + 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71, 0x5B43, 0x9B6F, + 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72, 0x5B54, 0x8D45, 0x5B55, + 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, + 0x5B5B, 0x9B75, 0x5B5C, 0x8E79, 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, + 0x8B47, 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, + 0x5B6B, 0x91B7, 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, + 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80, + 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0, 0x5B8B, + 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47, 0x5B95, 0x9386, + 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, + 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3, 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, + 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, + 0x8B7B, 0x5BB0, 0x8DC9, 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, + 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, + 0xFAA7, 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0, + 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578, 0x5BD0, + 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, + 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B, 0x5BDF, 0x8E40, 0x5BE1, + 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, + 0x5BE7, 0x944A, 0x5BE8, 0x9ECB, 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, + 0xFAAA, 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, + 0x5BF6, 0x9B8F, 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, + 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91, + 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1, 0x5C0A, + 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1, 0x5C0F, 0x8FAC, + 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, + 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97, 0x5C24, 0x96DE, 0x5C28, 0x9B98, + 0x5C2D, 0x8BC4, 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, + 0x8EDA, 0x5C3B, 0x904B, 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, + 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, + 0x9B9C, 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72, + 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB, 0x5C53, + 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A, 0x5C61, 0x8EC6, + 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2, 0x5C6E, 0x9BA3, 0x5C6F, + 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, + 0x5C90, 0x8AF2, 0x5C91, 0x9BA8, 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, + 0xFAAC, 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, + 0x5CB1, 0x91D0, 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, + 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1, + 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB, 0x5CE1, + 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9, 0x5CED, 0x9BB7, + 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, + 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5, 0x5D07, 0x9092, 0x5D0B, 0x9BBA, + 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, + 0x8A52, 0x5D17, 0x9BBC, 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, + 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, + 0x95F6, 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8, + 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD, 0x5D69, + 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, + 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE, 0x5D87, 0x9BCD, 0x5D8B, + 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, + 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3, 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, + 0xFAB5, 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, + 0x5DCC, 0x8ADE, 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, + 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42, + 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6, 0x5DE7, + 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7, 0x5DF1, 0x8CC8, + 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, + 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246, 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, + 0x5E03, 0x957A, 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, + 0x9BE4, 0x5E16, 0x929F, 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, + 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, + 0x91D1, 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7, + 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9, 0x5E44, + 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, + 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC, 0x5E5F, 0x9BEE, 0x5E61, + 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, + 0x5E73, 0x95BD, 0x5E74, 0x944E, 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, + 0x8D4B, 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, + 0x5E7D, 0x9748, 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, + 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98, + 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D, 0x5E9C, + 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0, 0x5EAB, 0x8CC9, + 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, + 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9, 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, + 0x5EC9, 0x97F5, 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, + 0x8A66, 0x5ED6, 0x9C40, 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, + 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, + 0x9C41, 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C, + 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984, 0x5EF7, + 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4, 0x5EFC, 0x9455, + 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9, 0x5F03, 0x9C50, 0x5F04, + 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, + 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE, 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, + 0x8B7C, 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, + 0x5F18, 0x8D4F, 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, + 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58, + 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3, 0x5F37, + 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265, 0x5F41, 0x9C5A, + 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, + 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396, 0x5F56, 0x9C60, 0x5F57, 0x9C61, + 0x5F59, 0x9C62, 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, + 0x8C60, 0x5F66, 0x9546, 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, + 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, + 0x8965, 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE, + 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68, 0x5F83, + 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, + 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3, 0x5F90, 0x8F99, 0x5F91, + 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, + 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E, 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, + 0x9C72, 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, + 0x5FB3, 0x93BF, 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, + 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5, + 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659, 0x5FD9, + 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB, 0x5FE0, 0x9289, + 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, + 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76, 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, + 0x600E, 0x9C83, 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, + 0x9C86, 0x6016, 0x957C, 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, + 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, + 0x9C88, 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6, + 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A, 0x6041, + 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91, 0x604A, 0x9C90, + 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0, 0x6052, 0x8D50, 0x6055, + 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, + 0x6060, 0x9C7E, 0x6062, 0x89F8, 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, + 0x9270, 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, + 0x606C, 0x9C97, 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, + 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F, + 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5, 0x608C, + 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7, 0x6096, 0x9CA1, + 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, + 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978, 0x60A7, 0x9CA4, 0x60A9, 0x9459, + 0x60AA, 0x88AB, 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, + 0x9CAE, 0x60B6, 0x96E3, 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, + 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, + 0x9CA9, 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9, + 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6, 0x60E3, + 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4, 0x60F1, 0x9CBB, + 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6, 0x60F6, 0x9CB3, 0x60F7, + 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, + 0x6101, 0x8F44, 0x6103, 0x9CB8, 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, + 0x96F9, 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, + 0x6115, 0x9CB1, 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, + 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5, + 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4, 0x613D, + 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8, 0x6144, 0x9CC9, + 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, + 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054, 0x6153, 0x9CD6, 0x6155, 0x95E7, + 0x6158, 0x9CCC, 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, + 0x9CD4, 0x6162, 0x969D, 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, + 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, + 0x88D4, 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7, + 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A, 0x6187, + 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7, 0x6191, 0x9CDF, + 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6, 0x6199, 0x9CD8, 0x619A, + 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, + 0x61AC, 0x9CDB, 0x61AE, 0x9CE1, 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, + 0x9CE9, 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, + 0x61C8, 0x9CE6, 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, + 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED, + 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5, 0x61F8, + 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3, 0x61FE, 0x9CF5, + 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, + 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9, 0x620E, 0x8F5E, 0x6210, 0x90AC, + 0x6211, 0x89E4, 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, + 0x88BD, 0x621A, 0x90CA, 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, + 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, + 0x9D43, 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46, + 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B, 0x6240, + 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB, 0x6249, 0x94E0, + 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48, 0x6253, 0x91C5, 0x6255, + 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, + 0x6263, 0x9D4A, 0x6268, 0x9D4D, 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, + 0x957D, 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, + 0x6280, 0x8B5A, 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, + 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53, + 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52, 0x6298, + 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0, 0x62A6, 0xFAC8, + 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, + 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F, 0x62BD, 0x928A, 0x62C2, 0x9D63, + 0x62C5, 0x9253, 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, + 0x9D66, 0x62CA, 0x9D62, 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, + 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, + 0x9D55, 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5, + 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67, 0x62EC, + 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D, 0x62F1, 0x9D69, + 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41, 0x62F7, 0x8D89, 0x62FE, + 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, + 0x6308, 0x9D6C, 0x6309, 0x88C2, 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, + 0x8B93, 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, + 0x632F, 0x9055, 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, + 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73, + 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B, 0x6367, + 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E, 0x636E, 0x9098, + 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, + 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C, 0x6388, 0x8EF6, 0x6389, 0x9D7B, + 0x638C, 0x8FB6, 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, + 0x9D74, 0x6398, 0x8C40, 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, + 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, + 0x8D54, 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77, + 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D, 0x63BB, + 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5, 0x63C4, 0x9D89, + 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560, 0x63D0, 0x92F1, 0x63D2, + 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, + 0x63E3, 0x9D85, 0x63E9, 0x9D82, 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, + 0xFAC9, 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, + 0x640F, 0x9D93, 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, + 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B, + 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF, 0x6442, + 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA, 0x6467, 0x9D94, + 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, + 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D, 0x6492, 0x8E54, 0x6493, 0x9D9A, + 0x6495, 0x9D99, 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, + 0x9350, 0x64A5, 0x9D9B, 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, + 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, + 0x9DA3, 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1, + 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0, 0x64D4, + 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, + 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43, 0x64E7, 0x9DA7, 0x64EC, + 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, + 0x64F6, 0x9DAF, 0x64FA, 0x9DB2, 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, + 0x9DB3, 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, + 0x6523, 0x9DB9, 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, + 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE, + 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55, 0x653E, + 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1, 0x654D, 0x9DC4, + 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, + 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5, 0x6559, 0x8BB3, 0x655D, 0x9DC7, + 0x655E, 0x9DC6, 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, + 0x8C68, 0x6570, 0x9094, 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, + 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, + 0x95B6, 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6, + 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF, 0x659B, + 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4, 0x65A4, 0x8BD2, + 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF, 0x65AC, 0x8E61, 0x65AD, + 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, + 0x65BC, 0x8997, 0x65BD, 0x8E7B, 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, + 0x9DD4, 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, + 0x65CF, 0x91B0, 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, + 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA, + 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181, 0x65EC, + 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0, 0x65FB, 0x9DDF, + 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, + 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD, 0x660C, 0x8FB9, 0x660E, 0x96BE, + 0x660F, 0x8DA8, 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, + 0x9DE4, 0x661E, 0xFAD3, 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, + 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, + 0xFAD2, 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1, + 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45, 0x6641, + 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6, 0x6649, 0x9DE7, + 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E, 0x6657, 0xFAD6, 0x6659, + 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, + 0x6664, 0x9DEB, 0x6665, 0xFAD5, 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, + 0x9DED, 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, + 0x6673, 0xFAD9, 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, + 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2, + 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267, 0x6697, + 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7, 0x66A0, 0xFADB, + 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, + 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41, 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, + 0x66BE, 0x9DFB, 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, + 0x93DC, 0x66C9, 0x9DFA, 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, + 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, + 0x9E47, 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58, + 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182, 0x66FA, + 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D, 0x66FE, 0x915C, + 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0, 0x6708, 0x8C8E, 0x6709, + 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, + 0x6714, 0x8DF1, 0x6715, 0x92BD, 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, + 0x965D, 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, + 0x6727, 0x9E4F, 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, + 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670, + 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7, 0x673D, + 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57, 0x6749, 0x9099, + 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, + 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A, 0x675C, 0x936D, 0x675E, 0x9E58, + 0x675F, 0x91A9, 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, + 0x9E5B, 0x6764, 0x9E5C, 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, + 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, + 0x9DDC, 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60, + 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8, 0x6789, + 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD, 0x6795, 0x968D, + 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA, 0x679D, 0x8E7D, 0x67A0, + 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, + 0x67AF, 0x8CCD, 0x67B3, 0x9E6B, 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, + 0x9E67, 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, + 0x67C1, 0x91C6, 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, + 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5, + 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70, 0x67DE, + 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76, 0x67E9, 0x9E6C, + 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, + 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2, 0x67FB, 0x8DB8, 0x67FE, 0x968F, + 0x67FF, 0x8A60, 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, + 0x8968, 0x6813, 0x90F0, 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, + 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, + 0x9E81, 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA, + 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85, 0x6842, + 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79, 0x6848, 0x88C4, + 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB, 0x6851, 0x8C4B, 0x6852, + 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, + 0x685D, 0x9691, 0x685F, 0x8E56, 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, + 0x9E8F, 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, + 0x6881, 0x97C0, 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, + 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B, + 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD, 0x68A6, + 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88, 0x68AF, 0x92F2, + 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, + 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92, 0x68BC, 0x938E, 0x68C4, 0x8AFC, + 0x68C6, 0x9EB0, 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, + 0x8AFB, 0x68CD, 0x9E9E, 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, + 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, + 0x938F, 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0, + 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8, 0x68FA, + 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4, 0x6905, 0x88D6, + 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D, 0x690D, 0x9041, 0x690E, + 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, + 0x691B, 0x8A91, 0x691C, 0x8C9F, 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, + 0x9EAE, 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, + 0x6930, 0x9EBD, 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, + 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6, + 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3, 0x695D, + 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE, 0x6962, 0x93E8, + 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, + 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480, 0x6974, 0x9EBA, 0x6975, 0x8BC9, + 0x6977, 0x9EB2, 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, + 0x8A79, 0x697E, 0x9EB7, 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, + 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, + 0xFAEB, 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0, + 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6, 0x69BB, + 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, + 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C, 0x69CC, 0x92C6, 0x69CD, + 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, + 0x69D9, 0x968A, 0x69DD, 0x9ECD, 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, + 0x9EDF, 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, + 0x69F9, 0x9EDD, 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, + 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC, + 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294, 0x6A19, + 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE, 0x6A21, 0x96CD, + 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, + 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED, 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, + 0x6A38, 0x9EF5, 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, + 0x9EEB, 0x6A46, 0xFAEF, 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, + 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, + 0x9EF1, 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0, + 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268, 0x6A84, + 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7, 0x6A97, 0x9F40, + 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB, 0x6AA3, 0x9EFC, 0x6AAA, + 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, + 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8, 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, + 0x9F49, 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, + 0x6ADF, 0x9F4A, 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, + 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F, + 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954, 0x6B1F, + 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3, 0x6B27, 0x89A2, + 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, + 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC, 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, + 0x6B49, 0x9F5D, 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, + 0x8ABD, 0x6B54, 0x9F60, 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, + 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, + 0x9590, 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE, + 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80, 0x6B7F, + 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68, 0x6B86, 0x9677, + 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63, 0x6B8D, 0x9F6A, 0x6B95, + 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, + 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70, 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, + 0x9F72, 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, + 0x6BBA, 0x8E45, 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, + 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA, + 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4, 0x6BD6, + 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A, 0x6BEB, 0x9F7C, + 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, + 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82, 0x6C14, 0x9F83, 0x6C17, 0x8B43, + 0x6C1B, 0x9F84, 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, + 0x9558, 0x6C38, 0x8969, 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, + 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, + 0x9F88, 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0, + 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89, 0x6C68, + 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF, 0x6C72, 0x8B82, + 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44, 0x6C7E, 0x9F90, 0x6C81, + 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, + 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C, 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, + 0x8C42, 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, + 0x6CA1, 0x9676, 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, + 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F, + 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E, 0x6CBF, + 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A, 0x6CC9, 0x90F2, + 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, + 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9, 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, + 0x6CE1, 0x9641, 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, + 0x928D, 0x6CEA, 0x9FA3, 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, + 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, + 0x9FAD, 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4, + 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E, 0x6D2B, + 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, + 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8, 0x6D3E, 0x9468, 0x6D41, + 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, + 0x6D5C, 0x956C, 0x6D63, 0x9FAF, 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, + 0x8D5F, 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, + 0x6D74, 0x9781, 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, + 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5, + 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC, 0x6D9B, + 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55, 0x6DB2, 0x8974, + 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, + 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD, 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, + 0x6DCF, 0xFB42, 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, + 0x9391, 0x6DD9, 0x9FC8, 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, + 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, + 0x9FC1, 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E, + 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9, 0x6DFA, + 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4, 0x6E07, 0x8A89, + 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB, 0x6E0B, 0x8F61, 0x6E13, + 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, + 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9, 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, + 0x9FD4, 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, + 0x6E29, 0x89B7, 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, + 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB, + 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9, 0x6E4D, + 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3, 0x6E5B, 0x9258, + 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, + 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1, 0x6E76, 0x9FD7, 0x6E7E, 0x9870, + 0x6E7F, 0x8EBC, 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, + 0x9FED, 0x6E90, 0x8CB9, 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, + 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, + 0x9FE2, 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5, + 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF, 0x6EC4, + 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, + 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB, 0x6ED5, 0x9FEC, 0x6EDD, + 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, + 0x6EF4, 0x9348, 0x6EF7, 0xE042, 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, + 0x9FDE, 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, + 0x6F0F, 0x9852, 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, + 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F, + 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151, 0x6F3E, + 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1, 0x6F54, 0x8C89, + 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, + 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B, 0x6F6E, 0x92AA, 0x6F6F, 0xE048, + 0x6F70, 0x92D7, 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, + 0xE04D, 0x6F80, 0xE047, 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, + 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, + 0x8AC0, 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059, + 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057, 0x6FC0, + 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A, 0x6FC6, 0xE058, + 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E, 0x6FDB, 0xE061, 0x6FDF, + 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, + 0x6FEC, 0xE05C, 0x6FEE, 0xE060, 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, + 0xE04A, 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, + 0x7001, 0xE066, 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, + 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D, + 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2, 0x701F, + 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50, 0x702C, 0x90A3, + 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, + 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073, 0x706B, 0x89CE, 0x706F, 0x9394, + 0x7070, 0x8A44, 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, + 0xFB51, 0x7089, 0x9846, 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, + 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, + 0xE07B, 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F, + 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D, 0x70CF, + 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C, 0x70F1, 0xE077, + 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54, 0x7109, 0xE081, 0x710F, + 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, + 0x7121, 0x96B3, 0x7126, 0x8FC5, 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, + 0xFB56, 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, + 0x7155, 0xE086, 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, + 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6, + 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8, 0x7184, + 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D, 0x7194, 0x976F, + 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, + 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094, 0x71BE, 0xE095, 0x71C1, 0xFB59, + 0x71C3, 0x9452, 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, + 0x97D3, 0x71D2, 0xE096, 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, + 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, + 0xE09C, 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D, + 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A, 0x71FF, + 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2, 0x721B, 0xE0A3, + 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6, 0x722D, 0xE0A5, 0x7230, + 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, + 0x723B, 0xE0A9, 0x723C, 0xE0AA, 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, + 0xE0AB, 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, + 0x724B, 0xE0AE, 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, + 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2, + 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5, 0x7274, + 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1, 0x7280, 0x8DD2, + 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, + 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7, 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, + 0x72AF, 0x94C6, 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, + 0xE0B9, 0x72BE, 0xFB5C, 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, + 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, + 0x8BE7, 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2, + 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7, 0x72F7, + 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854, 0x72FD, 0x9482, + 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6, 0x731B, 0x96D2, 0x731C, + 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, + 0x7329, 0xE0CD, 0x732A, 0x9296, 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, + 0xE0CC, 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, + 0x733F, 0x898E, 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, + 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4, + 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F, 0x7378, + 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA, 0x7387, 0x97A6, + 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, + 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE, 0x73BD, 0xFB60, 0x73C0, 0xE0DF, + 0x73C2, 0x89CF, 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, + 0x92BF, 0x73CE, 0xE0DD, 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, + 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, + 0x94C7, 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7, + 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D, 0x7407, + 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6, 0x7426, 0xFB67, + 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A, 0x7432, 0xE0E8, 0x7433, + 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, + 0x743F, 0xE0EB, 0x7441, 0xE0EE, 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, + 0x8CE8, 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, + 0x7460, 0x97DA, 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, + 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA, + 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C, 0x748B, + 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3, 0x74A7, 0xE0F8, + 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, + 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140, 0x74E2, 0x955A, 0x74E3, 0xE141, + 0x74E6, 0x8AA2, 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, + 0xE146, 0x74F1, 0xE147, 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, + 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, + 0xE14C, 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99, + 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072, 0x751C, + 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59, 0x7525, 0x8999, + 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1, 0x752C, 0xE154, 0x752F, + 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, + 0x7537, 0x926A, 0x7538, 0x99B2, 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, + 0xE155, 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, + 0x754B, 0x9DC0, 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, + 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A, + 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C, 0x7564, + 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F, 0x7569, 0xE15D, + 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, + 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166, 0x7576, 0xE163, 0x7577, 0x93EB, + 0x7578, 0xE162, 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, + 0xE165, 0x7589, 0xE168, 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, + 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, + 0xE16C, 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176, + 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174, 0x75B9, + 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE, 0x75C2, 0xE16F, + 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7, 0x75CA, 0xE178, 0x75CD, + 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, + 0x75D9, 0xE17A, 0x75DB, 0x92C9, 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, + 0xE17B, 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, + 0x75F4, 0x9273, 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, + 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187, + 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D, 0x7624, + 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F, 0x763B, 0xE191, + 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, + 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8, 0x7658, 0xE196, 0x765C, 0xE195, + 0x7661, 0xE197, 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, + 0xE19A, 0x766A, 0xE19B, 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, + 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, + 0xE1A2, 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70, + 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63, 0x7688, + 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48, 0x7693, 0xE1A9, + 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB, 0x769B, 0xFB73, 0x769C, + 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, + 0x76B4, 0xE1AD, 0x76B7, 0xEA89, 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, + 0xE1B0, 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, + 0x76C8, 0x896D, 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, + 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5, + 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5, 0x76E5, + 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA, 0x76F2, 0x96D3, + 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, + 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD, 0x7708, 0xE1BC, 0x7709, 0x94FB, + 0x770B, 0x8AC5, 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, + 0x905E, 0x7720, 0x96B0, 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, + 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, + 0x8AE1, 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8, + 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC, 0x7766, + 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF, 0x777E, 0xE1CE, + 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0, 0x7791, 0xE1D2, 0x779E, + 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, + 0x77B0, 0xE1D5, 0x77B3, 0x93B5, 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, + 0xE1DB, 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, + 0x77CD, 0xE1DD, 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, + 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A, + 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8, 0x77F3, + 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4, 0x7812, 0xE1E5, + 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, + 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D, 0x7832, 0x9643, 0x7834, 0x946A, + 0x783A, 0x9376, 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, + 0x8FC9, 0x7864, 0xFB7A, 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, + 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, + 0x8CE9, 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56, + 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA, 0x7897, + 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9, 0x78A9, 0x90D7, + 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1, 0x78BA, 0x8A6D, 0x78BC, + 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, + 0x78CA, 0xE1FB, 0x78CB, 0xE1F6, 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, + 0xE1F7, 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, + 0x78EF, 0x88E9, 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, + 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247, + 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248, 0x7930, + 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0, 0x7940, 0xE24A, + 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, + 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F, 0x7956, 0x9163, 0x7957, 0xE24C, + 0x795A, 0xE24E, 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, + 0xE24B, 0x7962, 0x9449, 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, + 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, + 0x8BD6, 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0, + 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83, 0x799D, + 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257, 0x79AE, 0xE258, + 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A, 0x79BA, 0xE25B, 0x79BD, + 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, + 0x79C9, 0xE25C, 0x79CB, 0x8F48, 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, + 0xE25D, 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, + 0x79E4, 0x9489, 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, + 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262, + 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB, 0x7A17, + 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274, 0x7A1C, 0x97C5, + 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, + 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A, 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, + 0x7A3E, 0xE26B, 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, + 0xE26D, 0x7A46, 0x9673, 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, + 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, + 0xE271, 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274, + 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3, 0x7A7D, + 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE, 0x7A84, 0x8DF3, + 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B, 0x7A95, 0xE279, 0x7A96, + 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, + 0x7AAA, 0x8C45, 0x7AAE, 0x8B87, 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, + 0xE280, 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, + 0x7AC5, 0xE281, 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, + 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2, + 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C, 0x7ADC, + 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD, 0x7AE1, 0xE28E, + 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, + 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87, 0x7AED, 0xE291, 0x7AEF, 0x925B, + 0x7AF0, 0xE292, 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, + 0x8EB1, 0x7AFF, 0x8AC6, 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, + 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, + 0x8FCE, 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A, + 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C, 0x7B2C, + 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D, 0x7B39, 0x8DF9, + 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4, 0x7B49, 0x9399, 0x7B4B, + 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, + 0x7B51, 0x927D, 0x7B52, 0x939B, 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, + 0xE2B6, 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, + 0x7B70, 0xE2A9, 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, + 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0, + 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5, 0x7B97, + 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2, 0x7B9C, 0xE2B1, + 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, + 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0, 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, + 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, + 0x95D1, 0x7BC9, 0x927A, 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, + 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, + 0xE2C2, 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC, + 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB, 0x7C11, + 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, + 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD, 0x7C27, 0xE2CE, 0x7C2A, + 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, + 0x7C3E, 0x97FA, 0x7C3F, 0x95EB, 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, + 0xE2D4, 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, + 0x7C56, 0xE2DD, 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, + 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0, + 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1, 0x7C89, + 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2, 0x7C92, 0x97B1, + 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, + 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5, 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, + 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, + 0xE2EC, 0x7CB1, 0xE2EB, 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, + 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, + 0xE2F0, 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C, + 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C, 0x7CE0, + 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, + 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85, 0x7CFA, 0xE2FB, 0x7CFB, + 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, + 0x7D05, 0x8D67, 0x7D06, 0xE2FC, 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, + 0x945B, 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, + 0x7D18, 0x8D68, 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, + 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87, + 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7, 0x7D32, + 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0, 0x7D3A, 0x8DAE, + 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, + 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A, 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, + 0x7D4E, 0xE34D, 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, + 0xE355, 0x7D5C, 0xFB8B, 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, + 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, + 0x939D, 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2, + 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356, 0x7D93, + 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358, 0x7D9C, 0x918E, + 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361, 0x7DA3, 0xE35B, 0x7DAB, + 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, + 0x7DB0, 0xE366, 0x7DB1, 0x8D6A, 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, + 0xE35C, 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, + 0x7DBD, 0xE35E, 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, + 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F, + 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC, 0x7DDC, + 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7, 0x7DE1, 0xE36D, + 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, + 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB, 0x7DFB, 0xE36B, 0x7E01, 0x898F, + 0x7E04, 0x93EA, 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, + 0xE376, 0x7E12, 0xE372, 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, + 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, + 0x9644, 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B, + 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A, 0x7E3D, + 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D, 0x7E46, 0xE378, + 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A, 0x7E52, 0xFB8F, 0x7E54, + 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, + 0x7E5D, 0xE383, 0x7E5E, 0xE385, 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, + 0xE38A, 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, + 0x7E7B, 0xE38C, 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, + 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C, + 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396, 0x7E92, + 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399, 0x7E9B, 0xE39B, + 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, + 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0, 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, + 0x7F50, 0xE3A3, 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, + 0xE3A7, 0x7F5F, 0xE3A8, 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, + 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, + 0x94B1, 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD, + 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785, 0x7F86, + 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, + 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7, 0x7F9D, 0xE3B6, 0x7F9E, + 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, + 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC, 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, + 0xE3BD, 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, + 0x7FC5, 0xE3C0, 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, + 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5, + 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB, 0x7FF3, + 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783, 0x8000, 0x9773, + 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, + 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7, 0x8010, 0x91CF, 0x8012, 0xE3CE, + 0x8015, 0x8D6B, 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, + 0xE3D1, 0x8021, 0xE3D2, 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, + 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, + 0xE3D6, 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA, + 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC, 0x8068, + 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF, 0x8073, 0xE3DE, + 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045, 0x8079, 0xE3E2, 0x807D, + 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, + 0x8086, 0xE3E6, 0x8087, 0x94A3, 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, + 0x94A7, 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, + 0x809B, 0xE3E8, 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, + 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB, + 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6, 0x80BA, + 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F, 0x80CC, 0x9477, + 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, + 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645, 0x80E1, 0x8CD3, 0x80E4, 0x88FB, + 0x80E5, 0xE3EF, 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, + 0x8BB9, 0x80FC, 0xE445, 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, + 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, + 0x90D2, 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9, + 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF, 0x813E, + 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074, 0x8150, 0x9585, + 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F, 0x8155, 0x9872, 0x815F, + 0xE454, 0x8165, 0xE448, 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, + 0x8170, 0x8D98, 0x8171, 0xE446, 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, + 0x95A0, 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, + 0x8183, 0xE44B, 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, + 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547, + 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663, 0x81A9, + 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458, 0x81B8, 0xE45A, + 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, + 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0, 0x81C8, 0xE464, 0x81C9, 0xE45F, + 0x81CD, 0xE460, 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, + 0xE462, 0x81DA, 0xE465, 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, + 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, + 0x8F4C, 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A, + 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D, 0x8205, + 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8, 0x820A, 0xE470, + 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9, 0x8210, 0xE472, 0x8212, + 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, + 0x821C, 0x8F77, 0x821E, 0x9591, 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, + 0x8D71, 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, + 0x8235, 0x91C7, 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, + 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479, + 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480, 0x8264, + 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482, 0x826B, 0xE483, + 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, + 0x8990, 0x8277, 0xE486, 0x8278, 0xE487, 0x827E, 0xE488, 0x828B, 0x88F0, + 0x828D, 0xE489, 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, + 0xE48C, 0x82A5, 0x8A48, 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, + 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, + 0x8C7C, 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1, + 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB, 0x82D7, + 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C, 0x82DE, 0xE49A, + 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490, 0x82E5, 0x8EE1, 0x82E6, + 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, + 0x82F4, 0xE493, 0x82F9, 0xE499, 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, + 0xFB93, 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, + 0x8306, 0xE49B, 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, + 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF, + 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2, 0x8334, + 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9, 0x8339, 0xE4A5, + 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, + 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72, 0x8358, 0x9191, 0x8362, 0xFB94, + 0x8373, 0xE4B8, 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, + 0xE4B6, 0x837F, 0xFB95, 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, + 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, + 0xE4AD, 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0, + 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789, 0x83B5, + 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B, 0x83C7, 0xFB96, + 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0, 0x83D3, 0x89D9, 0x83D6, + 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, + 0x83E9, 0x95EC, 0x83EB, 0xE4BF, 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, + 0x9548, 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, + 0x83FB, 0xE4D0, 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, + 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE, + 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B, 0x842A, + 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0, 0x8438, 0xE4CE, + 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, + 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298, 0x845B, 0x8A8B, 0x8461, 0x9592, + 0x8462, 0xE4E2, 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, + 0xE4D7, 0x846C, 0x9192, 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, + 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, + 0x9598, 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E, + 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5, 0x84A1, + 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99, 0x84B8, 0x8FF6, + 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193, 0x84BF, 0xE4E4, 0x84C1, + 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, + 0x84CB, 0x8A57, 0x84CD, 0xE4E7, 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, + 0xE4ED, 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, + 0x84EE, 0x9840, 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, + 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7, + 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955, 0x851F, + 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4, 0x852D, 0x88FC, + 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, + 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4, 0x854A, 0x8EC7, 0x854B, 0xE542, + 0x854E, 0x8BBC, 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, + 0xE4FB, 0x8559, 0xFB9B, 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, + 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, + 0xE550, 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E, + 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547, 0x8594, + 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C, 0x859C, 0xE54F, + 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549, 0x85A9, 0x8E46, 0x85AA, + 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, + 0x85B0, 0xFB9E, 0x85B9, 0xE556, 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, + 0xE553, 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, + 0x85DC, 0xE55B, 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, + 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561, + 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562, 0x8607, + 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E, 0x8616, 0x9F50, + 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, + 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566, 0x864D, 0xE567, 0x864E, 0x8CD5, + 0x8650, 0x8B73, 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, + 0x97B8, 0x865E, 0x8BF1, 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, + 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, + 0xE571, 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E, + 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A, 0x86AF, + 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575, 0x86C6, 0xE576, + 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260, 0x86CD, 0x8C75, 0x86CE, + 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, + 0x86DF, 0xE580, 0x86E4, 0x94B8, 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, + 0x9567, 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, + 0x86FB, 0xE588, 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, + 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D, + 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277, 0x871A, + 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593, 0x8734, 0xE58E, + 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, + 0x9858, 0x874C, 0xE598, 0x874E, 0xE599, 0x8753, 0xE59F, 0x8755, 0x9049, + 0x8757, 0xE59B, 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, + 0xE5A0, 0x8766, 0x89DA, 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, + 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, + 0xE5A5, 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC, + 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1, 0x87BD, + 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, + 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB, 0x87E0, 0xE5B4, 0x87EF, + 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, + 0x87FB, 0x8B61, 0x87FE, 0xE5B7, 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, + 0xE5B6, 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, + 0x8816, 0xE5BD, 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, + 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5, + 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F, 0x884C, + 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70, 0x8857, 0x8A58, + 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, + 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF, 0x8868, 0x955C, 0x886B, 0xE5CC, + 0x8870, 0x908A, 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, + 0xE5D1, 0x887E, 0xE5CE, 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, + 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, + 0x91B3, 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9, + 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC, 0x88B1, + 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF, 0x88BF, 0xE5DD, + 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF, 0x88C4, 0xE5E0, 0x88C5, + 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, + 0x88D9, 0xE5E3, 0x88DC, 0x95E2, 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, + 0x97A1, 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, + 0x88F5, 0xFBA2, 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, + 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1, + 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A, 0x8913, + 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0, 0x8925, 0xE5F1, + 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, + 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF, 0x8944, 0xE5F5, 0x894C, 0xE5F9, + 0x894D, 0xE8B5, 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, + 0xE5FB, 0x8964, 0xE641, 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, + 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, + 0xE647, 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2, + 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9, 0x898F, + 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460, 0x8998, 0xE64C, + 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F, 0x89A7, 0x9797, 0x89A9, + 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, + 0x89B3, 0x8ACF, 0x89BA, 0xE653, 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, + 0xE656, 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, + 0x89E3, 0x89F0, 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, + 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76, + 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F, 0x8A12, + 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5, 0x8A18, 0x8B4C, + 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, + 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD, 0x8A31, 0x8B96, 0x8A33, 0x96F3, + 0x8A34, 0x9169, 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, + 0x9290, 0x8A3C, 0x8FD8, 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, + 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, + 0x955D, 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D, + 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C, 0x8A6C, + 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C, 0x8A71, 0x9862, + 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5, 0x8A7C, 0xE66A, 0x8A82, + 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, + 0x8A8C, 0x8E8F, 0x8A8D, 0x9446, 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, + 0x9261, 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, + 0x8AA1, 0xE672, 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, + 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7, + 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62, 0x8ABE, + 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678, 0x8AC7, 0x926B, + 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, + 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B, 0x8ADB, 0xE687, 0x8ADC, 0x92B3, + 0x8ADE, 0xE686, 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, + 0xE684, 0x8AE4, 0xE680, 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, + 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, + 0xFBAA, 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8, + 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3, 0x8B07, + 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D, 0x8B14, 0xE682, + 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA, 0x8B1A, 0xE68A, 0x8B1B, + 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, + 0x8B28, 0xE695, 0x8B2B, 0xE693, 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, + 0x8BDE, 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, + 0x8B4E, 0xE699, 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, + 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F, + 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1, 0x8B70, + 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2, 0x8B77, 0x8CEC, + 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, + 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6, 0x8B90, 0x8F51, 0x8B92, 0xE6A7, + 0x8B93, 0xE6A8, 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, + 0x924A, 0x8C3A, 0xE6AC, 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, + 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, + 0xE6B2, 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4, + 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6, 0x8C79, + 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, + 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665, 0x8C8D, 0xE6BC, 0x8C8E, + 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, + 0x8CA0, 0x9589, 0x8CA1, 0x8DE0, 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, + 0x89DD, 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, + 0x8CAD, 0xE6C2, 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, + 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483, + 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4, 0x8CBF, + 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847, 0x8CC3, 0x92C0, + 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, + 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6, 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, + 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, + 0x8CAB, 0x8CE3, 0xE6CC, 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, + 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, + 0xE6D0, 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2, + 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4, 0x8D0D, + 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, + 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4, 0x8D66, 0x8ECD, 0x8D67, + 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, + 0x8D73, 0xE6E0, 0x8D74, 0x958B, 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, + 0xE6E1, 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, + 0x8DA8, 0x9096, 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, + 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8, + 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE, 0x8DE1, + 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC, 0x8DEB, 0xE6ED, + 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, + 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2, 0x8E0A, 0x9778, 0x8E0F, 0x93A5, + 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, + 0xE748, 0x8E30, 0xE6FA, 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, + 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, + 0xE6FC, 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745, + 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746, 0x8E72, + 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D, 0x8E81, 0xE74E, + 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F, 0x8E8A, 0xE753, 0x8E8B, + 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, + 0x8E99, 0xE757, 0x8EA1, 0xE759, 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, + 0xE75A, 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, + 0x8EC5, 0xE75F, 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, + 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC, + 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763, 0x8EEB, + 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764, 0x8EFD, 0x8C79, + 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, + 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B, 0x8F13, 0xE76D, 0x8F14, 0x95E3, + 0x8F15, 0xE76A, 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, + 0x8B50, 0x8F1F, 0xE76F, 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, + 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, + 0xE774, 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D, + 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779, 0x8F4D, + 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, + 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781, 0x8F64, 0xE782, 0x8F9B, + 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, + 0x8FA7, 0x999F, 0x8FA8, 0x999E, 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, + 0xE787, 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, + 0x8FBA, 0x95D3, 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, + 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF, + 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A, 0x8FE6, + 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497, 0x8FED, 0x9352, + 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, + 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792, 0x8FFD, 0x92C7, 0x9000, 0x91DE, + 0x9001, 0x9197, 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, + 0xE799, 0x900D, 0xE796, 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, + 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, + 0xE798, 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0, + 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795, 0x9022, + 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF, 0x9031, 0x8F54, + 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B, 0x9038, 0x88ED, 0x9039, + 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, + 0x9045, 0x9278, 0x9047, 0x8BF6, 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, + 0x895E, 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, + 0x9051, 0xE7A1, 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, + 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB, + 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD, 0x9065, + 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B, 0x906D, 0x9198, + 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, + 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149, 0x907A, 0x88E2, 0x907C, 0x97C9, + 0x907D, 0xE7AF, 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, + 0xE7AE, 0x9083, 0xE284, 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, + 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, + 0x964D, 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7, + 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78, 0x90CE, + 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53, 0x90E2, 0xE7B9, + 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73, 0x90F5, 0x9758, 0x90F7, + 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, + 0x9119, 0xE7BF, 0x9127, 0xFBB9, 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, + 0xE7C0, 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, + 0x914D, 0x947A, 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, + 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6, + 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9, 0x9173, + 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F, 0x9182, 0xE7CC, + 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, + 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE, 0x919C, 0x8F58, 0x91A2, 0xE7CD, + 0x91A4, 0x8FDD, 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, + 0xE7D2, 0x91B5, 0xE7D1, 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, + 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, + 0xE7D6, 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC, + 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9, 0x91D7, + 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC, 0x91DC, 0x8A98, + 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA, 0x91E1, 0xE7DB, 0x91E3, + 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, + 0x91ED, 0xFBBD, 0x91EE, 0xFBBE, 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, + 0xE7DD, 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, + 0x920E, 0x8A62, 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, + 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9, + 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6, 0x923F, + 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8, 0x9248, 0xE7EB, + 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, + 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8, 0x925A, 0xE7F4, 0x925B, 0x8994, + 0x925E, 0xE7E6, 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, + 0xFBCB, 0x9271, 0x8D7A, 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, + 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, + 0x914C, 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1, + 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC, 0x92AD, + 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, + 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4, 0x92D7, 0xFBD0, 0x92D9, + 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, + 0x92EA, 0x95DD, 0x92ED, 0x8973, 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, + 0x8B98, 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, + 0x92FF, 0xFBDC, 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, + 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD, + 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841, 0x9323, + 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564, 0x932B, 0x8EE0, + 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, + 0xE845, 0x933A, 0xE844, 0x933B, 0xE846, 0x9344, 0xE7FB, 0x9348, 0xFA5E, + 0x934B, 0x93E7, 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, + 0xFBE0, 0x935B, 0x9262, 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, + 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, + 0x8FDF, 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199, + 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D, 0x93AD, + 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850, 0x93C3, 0xE856, + 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858, 0x93D1, 0x934C, 0x93D6, + 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, + 0x93E1, 0x8BBE, 0x93E4, 0xE85A, 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, + 0xFBE4, 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, + 0x9414, 0xE85C, 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, + 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861, + 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868, 0x9445, + 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867, 0x9453, 0x96F8, + 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, + 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F, 0x9475, 0xE870, 0x9477, 0xE871, + 0x947C, 0xE874, 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, + 0xE876, 0x9577, 0x92B7, 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, + 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, + 0x895B, 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B, + 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880, 0x95A2, + 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4, 0x95A7, 0xE882, + 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B, 0x95B9, 0xE886, 0x95BB, + 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, + 0x95CA, 0xE888, 0x95CC, 0xE88C, 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, + 0xE88D, 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, + 0x95E2, 0xE893, 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, + 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668, + 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898, 0x9644, + 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E, 0x964F, 0xE89A, + 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, + 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940, 0x9663, 0x9077, 0x9664, 0x8F9C, + 0x9665, 0x8AD7, 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, + 0x8941, 0x9672, 0xE8A2, 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, + 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, + 0x8BF7, 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440, + 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75, 0x9695, + 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84, 0x969B, 0x8DDB, + 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942, 0x96A3, 0x97D7, 0x96A7, + 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, + 0x96B1, 0xE8AA, 0x96B2, 0xE8AB, 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, + 0x97EA, 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, + 0x96C0, 0x909D, 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, + 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93, + 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8, 0x96D6, + 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6, 0x96E2, 0x97A3, + 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, + 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB, 0x96F7, 0x978B, 0x96F9, 0xE8B9, + 0x96FB, 0x9364, 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, + 0x906B, 0x9708, 0xE8BC, 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, + 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, + 0xE8C2, 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6, + 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED, 0x9738, + 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7, 0x973E, 0xE8C8, + 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9, 0x9746, 0xE8CA, 0x9748, + 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, + 0x9752, 0x90C2, 0x9755, 0xFBF3, 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, + 0xE8CE, 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, + 0x9764, 0xE8D0, 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, + 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6, + 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93, 0x9785, + 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6, 0x978F, 0xE8DD, + 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, + 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0, 0x97AB, 0xE691, 0x97AD, 0x95DA, + 0x97B3, 0xE8E3, 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, + 0xE8E7, 0x97CB, 0xE8E8, 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, + 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, + 0xE8EE, 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8, + 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B, 0x980C, + 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6, 0x9812, 0x94D0, + 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC, 0x981A, 0x8C7A, 0x9821, + 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, + 0x9837, 0xE8F5, 0x9838, 0xE8F2, 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, + 0xE8F6, 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, + 0x984E, 0x8A7B, 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, + 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5, + 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC, 0x9871, + 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597, 0x98AA, 0xE943, + 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, + 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2, 0x98DC, 0xE3CA, 0x98DF, 0x9048, + 0x98E2, 0x8B51, 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, + 0x9F5A, 0x98EF, 0x94D1, 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, + 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, + 0xE94D, 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E, + 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952, 0x991E, + 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954, 0x9927, 0xFBF8, + 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957, 0x993D, 0xE958, 0x993E, + 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, + 0x994C, 0xE961, 0x9950, 0xE95D, 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, + 0xE962, 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, + 0x9999, 0x8D81, 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, + 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9, + 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977, 0x99C6, + 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D, 0x99D2, 0x8BEE, + 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, + 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E, 0x99EE, 0xE96F, 0x99F1, 0xE970, + 0x99F2, 0xE971, 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, + 0xE974, 0x9A05, 0xE976, 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, + 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, + 0x93AB, 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C, + 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB, 0x9A55, + 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983, 0x9A5F, 0xE985, + 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987, 0x9A69, 0xE989, 0x9A6A, + 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, + 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E, 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, + 0xE990, 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, + 0x9AD9, 0xFBFC, 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, + 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A, + 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D, 0x9AF4, + 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0, 0x9B18, 0xE9A1, + 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, + 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8, 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, + 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, + 0xE2F6, 0x9B3C, 0x8B53, 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, + 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, + 0xE9B0, 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B, + 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41, 0x9B83, + 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8, 0x9B92, 0x95A9, + 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA, 0x9B9F, 0xE9BB, 0x9BA0, + 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, + 0x9BAE, 0x914E, 0x9BB1, 0xFC44, 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, + 0xFC45, 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, + 0x9BCF, 0xE9C3, 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, + 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6, + 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD, 0x9BF2, + 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8, 0x9C06, 0xE9D4, + 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, + 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6, 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, + 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, + 0xE9DB, 0x9C2D, 0x9568, 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, + 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, + 0xE9E2, 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690, + 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5, 0x9C76, + 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, + 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA, 0x9CF3, 0x9650, 0x9CF4, + 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, + 0x9D08, 0xE9EC, 0x9D09, 0xE9EB, 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, + 0xE9F6, 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, + 0x9D28, 0x8A9B, 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, + 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5, + 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43, 0x9D59, + 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41, 0x9D60, 0x8D94, + 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, + 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46, 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, + 0x9D89, 0xEA47, 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, + 0xEA4E, 0x9DAB, 0xEA49, 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, + 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, + 0xEA57, 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59, + 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D, 0x9DF2, + 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, + 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60, 0x9E1E, 0xEA61, 0x9E75, + 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, + 0x9E81, 0xEA65, 0x9E88, 0xEA66, 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, + 0xEA6B, 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, + 0x9E9D, 0xEA6C, 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, + 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D, + 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80, 0x9EBF, + 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F, 0x9ECE, 0xEA74, + 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, + 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9, 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, + 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, + 0xEA7D, 0x9EEF, 0xEA7E, 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, + 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, + 0xEA87, 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A, + 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540, 0x9F3E, + 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, + 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92, 0x9F60, 0xEA93, 0x9F61, + 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, + 0x9F6A, 0xEA98, 0x9F6C, 0xEA97, 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, + 0xEA99, 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, + 0x9FA0, 0xEA9E, 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, + 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8, + 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75, 0xFA18, + 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82, 0xFA1C, 0xFB86, + 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, + 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1, 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, + 0xFA26, 0xFBB7, 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, + 0xFBF6, 0xFA2B, 0xFBF7, 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, + 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, + 0x8195, 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196, + 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144, 0xFF0F, + 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251, 0xFF13, 0x8252, + 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255, 0xFF17, 0x8256, 0xFF18, + 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, + 0xFF1D, 0x8181, 0xFF1E, 0x8184, 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, + 0x8260, 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, + 0xFF26, 0x8265, 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, + 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D, + 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271, 0xFF33, + 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275, 0xFF37, 0x8276, + 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, + 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F, 0xFF3F, 0x8151, 0xFF40, 0x814D, + 0xFF41, 0x8281, 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, + 0x8285, 0xFF46, 0x8286, 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, + 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, + 0x828E, 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292, + 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296, 0xFF57, + 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A, 0xFF5B, 0x816F, + 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160, 0xFF61, 0x00A1, 0xFF62, + 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, + 0xFF67, 0x00A7, 0xFF68, 0x00A8, 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, + 0x00AB, 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, + 0xFF70, 0x00B0, 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, + 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8, + 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC, 0xFF7D, + 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0, 0xFF81, 0x00C1, + 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, + 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8, 0xFF89, 0x00C9, 0xFF8A, 0x00CA, + 0xFF8B, 0x00CB, 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, + 0x00CF, 0xFF90, 0x00D0, 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, + 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, + 0x00D8, 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC, + 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191, 0xFFE1, + 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55, 0xFFE5, 0x818F, + 0, 0 }; + +/// Shift_JIS --> Unicode pairs +static const WCHAR oem2uni932[] + = { 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, 0x00A5, + 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, 0x00A9, 0xFF69, + 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, 0x00AD, 0xFF6D, 0x00AE, + 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, 0x00B1, 0xFF71, 0x00B2, 0xFF72, + 0x00B3, 0xFF73, 0x00B4, 0xFF74, 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, + 0xFF77, 0x00B8, 0xFF78, 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, + 0x00BC, 0xFF7C, 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, + 0xFF80, 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, + 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, 0x00C9, + 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, 0x00CD, 0xFF8D, + 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, 0x00D1, 0xFF91, 0x00D2, + 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, 0x00D5, 0xFF95, 0x00D6, 0xFF96, + 0x00D7, 0xFF97, 0x00D8, 0xFF98, 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, + 0xFF9B, 0x00DC, 0xFF9C, 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, + 0x8140, 0x3000, 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, + 0xFF0E, 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, 0x814D, + 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, 0x8151, 0xFF3F, + 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, 0x8155, 0x309E, 0x8156, + 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, 0x8159, 0x3006, 0x815A, 0x3007, + 0x815B, 0x30FC, 0x815C, 0x2015, 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, + 0xFF3C, 0x8160, 0xFF5E, 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, + 0x8164, 0x2025, 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, + 0x201D, 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, + 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, 0x8171, + 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, 0x8175, 0x300C, + 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, 0x8179, 0x3010, 0x817A, + 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, 0x817D, 0x00B1, 0x817E, 0x00D7, + 0x8180, 0x00F7, 0x8181, 0xFF1D, 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, + 0xFF1E, 0x8185, 0x2266, 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, + 0x8189, 0x2642, 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, + 0x2033, 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, 0x8196, + 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, 0x819A, 0x2605, + 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, 0x819E, 0x25C7, 0x819F, + 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, 0x81A2, 0x25B3, 0x81A3, 0x25B2, + 0x81A4, 0x25BD, 0x81A5, 0x25BC, 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, + 0x2192, 0x81A9, 0x2190, 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, + 0x81B8, 0x2208, 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, + 0x2282, 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, + 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, 0x81CD, + 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, 0x81DC, 0x2312, + 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, 0x81E0, 0x2252, 0x81E1, + 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, 0x81E4, 0x223D, 0x81E5, 0x221D, + 0x81E6, 0x2235, 0x81E7, 0x222B, 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, + 0x2030, 0x81F2, 0x266F, 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, + 0x81F6, 0x2021, 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, + 0xFF11, 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, 0x8260, + 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, 0x8264, 0xFF25, + 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, 0x8268, 0xFF29, 0x8269, + 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, 0x826C, 0xFF2D, 0x826D, 0xFF2E, + 0x826E, 0xFF2F, 0x826F, 0xFF30, 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, + 0xFF33, 0x8273, 0xFF34, 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, + 0x8277, 0xFF38, 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, + 0xFF42, 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, + 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, 0x828B, + 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, 0x828F, 0xFF4F, + 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, 0x8293, 0xFF53, 0x8294, + 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, 0x8297, 0xFF57, 0x8298, 0xFF58, + 0x8299, 0xFF59, 0x829A, 0xFF5A, 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, + 0x3043, 0x82A2, 0x3044, 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, + 0x82A6, 0x3048, 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, + 0x304C, 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, 0x82B3, + 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, 0x82B7, 0x3059, + 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, 0x82BB, 0x305D, 0x82BC, + 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, 0x82BF, 0x3061, 0x82C0, 0x3062, + 0x82C1, 0x3063, 0x82C2, 0x3064, 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, + 0x3067, 0x82C6, 0x3068, 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, + 0x82CA, 0x306C, 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, + 0x3070, 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, + 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, 0x82D7, + 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, 0x82DB, 0x307D, + 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, 0x82DF, 0x3081, 0x82E0, + 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, 0x82E3, 0x3085, 0x82E4, 0x3086, + 0x82E5, 0x3087, 0x82E6, 0x3088, 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, + 0x308B, 0x82EA, 0x308C, 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, + 0x82EE, 0x3090, 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, + 0x30A1, 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, 0x8349, + 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, 0x834D, 0x30AE, + 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, 0x8351, 0x30B2, 0x8352, + 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, 0x8355, 0x30B6, 0x8356, 0x30B7, + 0x8357, 0x30B8, 0x8358, 0x30B9, 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, + 0x30BC, 0x835C, 0x30BD, 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, + 0x8360, 0x30C1, 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, + 0x30C5, 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, + 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, 0x836D, + 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, 0x8371, 0x30D2, + 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, 0x8375, 0x30D6, 0x8376, + 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, 0x8379, 0x30DA, 0x837A, 0x30DB, + 0x837B, 0x30DC, 0x837C, 0x30DD, 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, + 0x30E0, 0x8381, 0x30E1, 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, + 0x8385, 0x30E5, 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, + 0x30E9, 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, 0x8392, + 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5, 0x8396, 0x30F6, + 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, + 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, + 0x83A8, 0x039A, 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, + 0x039E, 0x83AD, 0x039F, 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, + 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, + 0x03A8, 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3, + 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7, 0x83C6, + 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB, 0x83CA, 0x03BC, + 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF, 0x83CE, 0x03C0, 0x83CF, + 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, + 0x83D4, 0x03C7, 0x83D5, 0x03C8, 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, + 0x0411, 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, + 0x8446, 0x0401, 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, + 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D, + 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421, 0x8453, + 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425, 0x8457, 0x0426, + 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, + 0x042B, 0x845D, 0x042C, 0x845E, 0x042D, 0x845F, 0x042E, 0x8460, 0x042F, + 0x8470, 0x0430, 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, + 0x0434, 0x8475, 0x0435, 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, + 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, + 0x043C, 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440, + 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444, 0x8487, + 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448, 0x848B, 0x0449, + 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C, 0x848F, 0x044D, 0x8490, + 0x044E, 0x8491, 0x044F, 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, + 0x84A2, 0x2510, 0x84A3, 0x2518, 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, + 0x252C, 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, + 0x84AB, 0x2503, 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, + 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B, + 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528, 0x84B8, + 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530, 0x84BC, 0x2525, + 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, + 0x2462, 0x8743, 0x2463, 0x8744, 0x2464, 0x8745, 0x2465, 0x8746, 0x2466, + 0x8747, 0x2467, 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, + 0x246B, 0x874C, 0x246C, 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, + 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, + 0x2160, 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164, + 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168, 0x875D, + 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322, 0x8762, 0x334D, + 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303, 0x8766, 0x3336, 0x8767, + 0x3351, 0x8768, 0x3357, 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, + 0x876C, 0x332B, 0x876D, 0x334A, 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, + 0x339D, 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, + 0x8775, 0x33A1, 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, + 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5, + 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231, 0x878B, + 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D, 0x878F, 0x337C, + 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, + 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03, 0x88A2, 0x963F, 0x88A3, 0x54C0, + 0x88A4, 0x611B, 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, + 0x8475, 0x88A9, 0x831C, 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, + 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, + 0x9BF5, 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271, + 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4, 0x88BA, + 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216, 0x88BE, 0x7C9F, + 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5, 0x88C2, 0x6309, 0x88C3, + 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, + 0x88C8, 0x4EE5, 0x88C9, 0x4F0A, 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, + 0x5049, 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, + 0x88D1, 0x5C09, 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, + 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570, + 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3, 0x88DE, + 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055, 0x88E2, 0x907A, + 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, + 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF, 0x88EA, 0x4E00, 0x88EB, 0x58F1, + 0x88EC, 0x6EA2, 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, + 0x828B, 0x88F1, 0x9C2F, 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, + 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, + 0x98F2, 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662, + 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B, 0x8945, + 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD, 0x8949, 0x8FC2, + 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C, 0x894D, 0x7ABA, 0x894E, + 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, + 0x8953, 0x5504, 0x8954, 0x6B1D, 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, + 0x59E5, 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, + 0x895C, 0x5642, 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, + 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30, + 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804, 0x8969, + 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B, 0x896D, 0x76C8, + 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, + 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2, 0x8975, 0x75AB, 0x8976, 0x76CA, + 0x8977, 0x99C5, 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, + 0x95B2, 0x897C, 0x698E, 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, + 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, + 0x6028, 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14, + 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5, 0x898E, + 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1, 0x8992, 0x8597, + 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B, 0x8996, 0x5869, 0x8997, + 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, + 0x899C, 0x5965, 0x899D, 0x5F80, 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, + 0x65FA, 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, + 0x89A5, 0x7FC1, 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, + 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104, + 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876, 0x89B2, + 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378, 0x89B6, 0x6069, + 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, + 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55, 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, + 0x89C0, 0x4F73, 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, + 0x590F, 0x89C5, 0x5AC1, 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, + 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, + 0x6CB3, 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE, + 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB, 0x89D6, + 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3, 0x89DA, 0x8766, + 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8, 0x89DE, 0x8FE6, 0x89DF, + 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, + 0x89E4, 0x6211, 0x89E5, 0x7259, 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, + 0x82BD, 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, + 0x89ED, 0x99D5, 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, + 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB, + 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0, 0x89FA, + 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41, 0x8A41, 0x6666, + 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, + 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5, 0x8A49, 0x87F9, 0x8A4A, 0x958B, + 0x8A4B, 0x968E, 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, + 0x5916, 0x8A50, 0x54B3, 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, + 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, + 0x8857, 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C, + 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF, 0x8A61, + 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687, 0x8A65, 0x5404, + 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9, 0x8A69, 0x683C, 0x8A6A, + 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, + 0x8A6F, 0x899A, 0x8A70, 0x89D2, 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, + 0x90ED, 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, + 0x8A78, 0x5CB3, 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, + 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6, + 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D, 0x8A86, + 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07, 0x8A8A, 0x6ED1, + 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, + 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B, 0x8A92, 0x6A3A, 0x8A93, 0x9784, + 0x8A94, 0x682A, 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, + 0x91DC, 0x8A99, 0x938C, 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, + 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, + 0x82C5, 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0, + 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7, 0x8AAA, + 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, + 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72, 0x8AB2, 0x5E79, 0x8AB3, + 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, + 0x8AB8, 0x6562, 0x8AB9, 0x67D1, 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, + 0x6B3E, 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, + 0x8AC1, 0x6F45, 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, + 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9, + 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266, 0x8ACE, + 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB, 0x8AD2, 0x9084, + 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, + 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928, 0x8ADA, 0x8218, 0x8ADB, 0x4E38, + 0x8ADC, 0x542B, 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, + 0x764C, 0x8AE1, 0x773C, 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, + 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, + 0x4F01, 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668, + 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4, 0x8AF2, + 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, + 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2, 0x8AFA, 0x671F, 0x8AFB, + 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, + 0x8B43, 0x6C17, 0x8B44, 0x6C7D, 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, + 0x5B63, 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, + 0x8B4C, 0x8A18, 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, + 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80, + 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C, 0x8B59, + 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A, 0x8B5D, 0x72A0, + 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, + 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC, 0x8B65, 0x83CA, 0x8B66, 0x97A0, + 0x8B67, 0x5409, 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, + 0x6A58, 0x8B6C, 0x8A70, 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, + 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, + 0x9006, 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11, + 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13, 0x8B7D, + 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42, 0x8B82, 0x6C72, + 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403, 0x8B86, 0x7A76, 0x8B87, + 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, + 0x8B8C, 0x65E7, 0x8B8D, 0x725B, 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, + 0x5DE8, 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, + 0x8B95, 0x865A, 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, + 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB, + 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1, 0x8BA2, + 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6, 0x8BA6, 0x5354, + 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, + 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37, 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, + 0x8BB0, 0x6050, 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, + 0x6A4B, 0x8BB5, 0x6CC1, 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, + 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, + 0x90F7, 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A, + 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681, 0x8BC6, + 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975, 0x8BCA, 0x7389, + 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5, 0x8BCE, 0x52E4, 0x8BCF, + 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, + 0x8BD4, 0x6B3D, 0x8BD5, 0x7434, 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, + 0x7B4B, 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, + 0x8BDD, 0x895F, 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, + 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5, + 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9, 0x8BEA, + 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8, 0x8BEE, 0x99D2, + 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, + 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3, 0x8BF6, 0x9047, 0x8BF7, 0x9685, + 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, + 0x5C48, 0x8C40, 0x6398, 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, + 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, + 0x7C82, 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C, + 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13, 0x8C51, + 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366, 0x8C55, 0x8888, + 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE, 0x8C59, 0x5211, 0x8C5A, + 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, + 0x8C5F, 0x5951, 0x8C60, 0x5F62, 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, + 0x6176, 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, + 0x8C68, 0x656C, 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, + 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99, + 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A, 0x8C75, + 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66, 0x8C79, 0x8EFD, + 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, + 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F, 0x8C82, 0x6483, 0x8C83, 0x6FC0, + 0x8C84, 0x9699, 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, + 0x6C7A, 0x8C89, 0x6F54, 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, + 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, + 0x5026, 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263, + 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC, 0x8C9A, + 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3, 0x8C9E, 0x6372, + 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D, 0x8CA2, 0x72AC, 0x8CA3, + 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, + 0x8CA8, 0x80A9, 0x8CA9, 0x898B, 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, + 0x8ED2, 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, + 0x8CB1, 0x9A13, 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, + 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90, + 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237, 0x8CBE, + 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E, 0x8CC2, 0x500B, + 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, + 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB, 0x8CCA, 0x5F27, 0x8CCB, 0x6238, + 0x8CCC, 0x6545, 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, + 0x7CCA, 0x8CD1, 0x88B4, 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, + 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, + 0x96C7, 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92, + 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E, 0x8CE2, + 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F, 0x8CE6, 0x68A7, + 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881, 0x8CEA, 0x8A9E, 0x8CEB, + 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, + 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C, 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, + 0x5016, 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, + 0x8CF9, 0x52FE, 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, + 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D, + 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5, 0x8D49, + 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83, 0x8D4D, 0x5E9A, + 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, + 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7, 0x8D55, 0x653B, 0x8D56, 0x6602, + 0x8D57, 0x6643, 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, + 0x6897, 0x8D5C, 0x69CB, 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, + 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, + 0x786C, 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18, + 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003, 0x8D6D, + 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F, 0x8D71, 0x822A, + 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861, 0x8D75, 0x8B1B, 0x8D76, + 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, + 0x8D7B, 0x783F, 0x8D7C, 0x92FC, 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, + 0x9805, 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, + 0x8D85, 0x52AB, 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, + 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9, + 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD, 0x8D92, + 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2, 0x8D96, 0x7344, + 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, + 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB, 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, + 0x8DA0, 0x9803, 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, + 0x58BE, 0x8DA5, 0x5A5A, 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, + 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, + 0x75D5, 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B, + 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F, 0x8DB6, + 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99, 0x8DBA, 0x7473, + 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396, 0x8DBE, 0x88DF, 0x8DBF, + 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, + 0x8DC4, 0x518D, 0x8DC5, 0x6700, 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, + 0x59BB, 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, + 0x8DCD, 0x683D, 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, + 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D, + 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1, 0x8DDA, + 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728, 0x8DDE, 0x6750, + 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, + 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A, 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, + 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, + 0x4F5C, 0x8DED, 0x524A, 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, + 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, + 0x7D22, 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39, + 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF, 0x8E41, + 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D, 0x8E45, 0x6BBA, + 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690, 0x8E49, 0x9BD6, 0x8E4A, + 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, + 0x8E4F, 0x4E09, 0x8E50, 0x5098, 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, + 0x60E8, 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, + 0x8E58, 0x73CA, 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, + 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910, + 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5, 0x8E65, + 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A, 0x8E69, 0x53F8, + 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, + 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF, 0x8E71, 0x5B50, 0x8E72, 0x5C4D, + 0x8E73, 0x5E02, 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, + 0x6307, 0x8E78, 0x652F, 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, + 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, + 0x6C0F, 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8, + 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102, 0x8E8A, + 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, + 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7, 0x8E92, 0x8CDC, 0x8E93, + 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, + 0x8E98, 0x4F8D, 0x8E99, 0x5150, 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, + 0x6148, 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, + 0x8EA1, 0x6CBB, 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, + 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA, + 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F, 0x8EAE, + 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA, 0x8EB2, 0x8EF8, + 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, + 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9, 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, + 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, + 0x5B9F, 0x8EC1, 0x8500, 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, + 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, + 0x820E, 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66, + 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17, 0x8ED2, + 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E, 0x8ED6, 0x86C7, + 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA, 0x8EDA, 0x5C3A, 0x8EDB, + 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, + 0x8EE0, 0x932B, 0x8EE1, 0x82E5, 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, + 0x60F9, 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, + 0x8EE9, 0x6731, 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, + 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996, + 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF, 0x8EF6, + 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700, 0x8EFA, 0x56DA, + 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, + 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101, 0x8F45, 0x62FE, 0x8F46, 0x6D32, + 0x8F47, 0x79C0, 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, + 0x7FD2, 0x8F4C, 0x81ED, 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, + 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, + 0x9031, 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C, + 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341, 0x8F5D, + 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41, 0x8F61, 0x6E0B, + 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD, 0x8F65, 0x9283, 0x8F66, + 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, + 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B, 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, + 0x51FA, 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, + 0x8F74, 0x6625, 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, + 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F, + 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64, 0x8F82, + 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075, 0x8F86, 0x9187, + 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, + 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A, 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, + 0x8F90, 0x7F72, 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, + 0x8AF8, 0x8F95, 0x52A9, 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, + 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, + 0x50B7, 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347, + 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531, 0x8FA6, + 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, + 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11, 0x8FAE, 0x5C1A, 0x8FAF, + 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, + 0x8FB4, 0x6284, 0x8FB5, 0x62DB, 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, + 0x6607, 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, + 0x8FBD, 0x68A2, 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, + 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126, + 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D, 0x8FCA, + 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0, 0x8FCE, 0x7B11, + 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, + 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D, 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, + 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, + 0x8CDE, 0x8FDD, 0x91A4, 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, + 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, + 0x4E1E, 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE, + 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38, 0x8FEE, + 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756, 0x8FF2, 0x6D44, + 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63, 0x8FF6, 0x84B8, 0x8FF7, + 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, + 0x8FFC, 0x98FE, 0x9040, 0x62ED, 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, + 0x71ED, 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, + 0x9048, 0x98DF, 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, + 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20, + 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E, 0x9055, + 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE, 0x9059, 0x699B, + 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, + 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6, 0x9061, 0x7D33, 0x9062, 0x81E3, + 0x9063, 0x82AF, 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, + 0x8EAB, 0x9068, 0x8F9B, 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, + 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, + 0x58EC, 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E, + 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D, 0x9079, + 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162, 0x907D, 0x56F3, + 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439, 0x9082, 0x5782, 0x9083, + 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, + 0x9088, 0x7C8B, 0x9089, 0x7FE0, 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, + 0x9154, 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, + 0x9091, 0x9AC4, 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, + 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749, + 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0, 0x909E, + 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8, 0x90A2, 0x4E16, + 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, + 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3, 0x90AA, 0x5F81, 0x90AB, 0x6027, + 0x90AC, 0x6210, 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, + 0x6674, 0x90B1, 0x68F2, 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, + 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, + 0x8056, 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0, + 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192, 0x90C2, + 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E, 0x90C6, 0x8106, + 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC, 0x90CA, 0x621A, 0x90CB, + 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, + 0x90D0, 0x7C4D, 0x90D1, 0x7E3E, 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, + 0x8D64, 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, + 0x90D9, 0x62D9, 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, + 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA, + 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9, 0x90E6, + 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3, 0x90EA, 0x5C02, + 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, + 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834, 0x90F2, 0x6CC9, 0x90F3, 0x6D45, + 0x90F4, 0x6D17, 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, + 0x717D, 0x90F9, 0x65CB, 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, + 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, + 0x8239, 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5, + 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291, 0x914D, + 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584, 0x9151, 0x6F38, + 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985, 0x9155, 0x7E55, 0x9156, + 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, + 0x915B, 0x63AA, 0x915C, 0x66FE, 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, + 0x72D9, 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, + 0x9164, 0x79DF, 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, + 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20, + 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2, 0x9171, + 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F, 0x9175, 0x723D, + 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, + 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383, 0x917D, 0x633F, 0x917E, 0x63BB, + 0x9180, 0x64CD, 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, + 0x69CD, 0x9185, 0x69FD, 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, + 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, + 0x7DCF, 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358, + 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5, 0x9196, + 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397, 0x919A, 0x971C, + 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897, 0x919E, 0x618E, 0x919F, + 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, + 0x91A4, 0x5074, 0x91A5, 0x5247, 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, + 0x6349, 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, + 0x91AD, 0x4FD7, 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, + 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3, + 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D, 0x91BA, + 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A, 0x91BE, 0x592A, + 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, + 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253, 0x91C6, 0x67C1, 0x91C7, 0x8235, + 0x91C8, 0x6955, 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, + 0x4F53, 0x91CD, 0x5806, 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, + 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, + 0x6234, 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE, + 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8, 0x91DE, + 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, + 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927, 0x91E6, 0x7B2C, 0x91E7, + 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, + 0x91EC, 0x5353, 0x91ED, 0x5544, 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, + 0x629E, 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, + 0x91F5, 0x8A17, 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, + 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9, + 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A, 0x9245, + 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF, 0x9249, 0x68DA, + 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, + 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358, 0x9251, 0x5606, 0x9252, 0x5766, + 0x9253, 0x62C5, 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, + 0x6DE1, 0x9258, 0x6E5B, 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, + 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, + 0x86CB, 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7, + 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80, 0x9269, + 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024, 0x926D, 0x77E5, + 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065, 0x9271, 0x667A, 0x9272, + 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, + 0x9277, 0x8718, 0x9278, 0x9045, 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, + 0x755C, 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, + 0x9281, 0x79E9, 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, + 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0, + 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8, 0x928E, + 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E, 0x9292, 0x92F3, + 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, + 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF, 0x929A, 0x4E01, 0x929B, 0x5146, + 0x929C, 0x51CB, 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, + 0x5E33, 0x92A1, 0x5E81, 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, + 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, + 0x671D, 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A, + 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776, 0x92B2, + 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3, 0x92B6, 0x929A, + 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5, 0x92BA, 0x52C5, 0x92BB, + 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, + 0x92C0, 0x8CC3, 0x92C1, 0x93AE, 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, + 0x589C, 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, + 0x92C9, 0x75DB, 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, + 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8, + 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354, 0x92D6, + 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7, 0x92DA, 0x5B2C, + 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, + 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E, 0x92E2, 0x505C, 0x92E3, 0x5075, + 0x92E4, 0x5243, 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, + 0x5B9A, 0x92E9, 0x5E1D, 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, + 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, + 0x63D0, 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E, + 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02, 0x92FA, + 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8, 0x9341, 0x912D, + 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5, 0x9345, 0x6458, 0x9346, + 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, + 0x934B, 0x9069, 0x934C, 0x93D1, 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, + 0x5FB9, 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, + 0x9354, 0x5178, 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, + 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC, + 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D, 0x9361, + 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB, 0x9365, 0x514E, + 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, + 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597, 0x936D, 0x675C, 0x936E, 0x6E21, + 0x936F, 0x767B, 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, + 0x90FD, 0x9374, 0x934D, 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, + 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, + 0x5012, 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200, + 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957, 0x9386, + 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC, 0x938A, 0x6295, + 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843, 0x938E, 0x68BC, 0x938F, + 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, + 0x9394, 0x706F, 0x9395, 0x71C8, 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, + 0x7977, 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, + 0x939D, 0x7D71, 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, + 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F, + 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676, 0x93AA, + 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD, 0x93AE, 0x52D5, + 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, + 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3, 0x93B6, 0x7AE5, 0x93B7, 0x80F4, + 0x93B8, 0x8404, 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, + 0x9D07, 0x93BD, 0x533F, 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, + 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, + 0x6BD2, 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61, + 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A, 0x93CE, + 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149, 0x93D2, 0x701E, + 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7, 0x93D6, 0x6566, 0x93D7, + 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, + 0x93DC, 0x66C7, 0x93DD, 0x920D, 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, + 0x5185, 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, + 0x93E5, 0x7058, 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, + 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960, + 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C, 0x93F2, + 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302, 0x93F6, 0x8CD1, + 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, + 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982, 0x9441, 0x5C3F, 0x9442, 0x97EE, + 0x9443, 0x4EFB, 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, + 0x6FE1, 0x9448, 0x79B0, 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, + 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, + 0x637B, 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43, + 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2, 0x9459, + 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD, 0x945D, 0x8133, + 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997, 0x9461, 0x86A4, 0x9462, + 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, + 0x9467, 0x6CE2, 0x9468, 0x6D3E, 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, + 0x5A46, 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, + 0x9470, 0x5EC3, 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, + 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA, + 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9, 0x947D, + 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164, 0x9482, 0x72FD, + 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, + 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4, 0x948A, 0x77E7, 0x948B, 0x8429, + 0x948C, 0x4F2F, 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, + 0x67CF, 0x9491, 0x6CCA, 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, + 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, + 0x6F20, 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1, + 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872, 0x94A2, + 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8, 0x94A6, 0x5E61, + 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560, 0x94AA, 0x516B, 0x94AB, + 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, + 0x94B0, 0x4F10, 0x94B1, 0x7F70, 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, + 0x95A5, 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, + 0x94B9, 0x96BC, 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, + 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591, + 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248, 0x94C6, + 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41, 0x94CA, 0x822C, + 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, + 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF, 0x94D2, 0x633D, 0x94D3, 0x6669, + 0x94D4, 0x756A, 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, + 0x86EE, 0x94D9, 0x532A, 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, + 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, + 0x6279, 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC, + 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8, 0x94EA, + 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB, 0x94EE, 0x8AB9, + 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E, 0x94F2, 0x98DB, 0x94F3, + 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, + 0x94F8, 0x6787, 0x94F9, 0x6BD8, 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, + 0x7F8E, 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, + 0x9544, 0x758B, 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, + 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562, + 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB, 0x9551, + 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C, 0x9555, 0x4FF5, + 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, + 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868, 0x955D, 0x8A55, 0x955E, 0x8C79, + 0x955F, 0x5EDF, 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, + 0x82D7, 0x9564, 0x9328, 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, + 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, + 0x6D5C, 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B, + 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8, 0x9575, + 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC, 0x9579, 0x51A8, + 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016, 0x957D, 0x6276, 0x957E, + 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, + 0x9584, 0x7B26, 0x9585, 0x8150, 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, + 0x8B5C, 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, + 0x958D, 0x9644, 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, + 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01, + 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557, 0x959A, + 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45, 0x959E, 0x670D, + 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, + 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255, 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, + 0x95A8, 0x7269, 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, + 0x5674, 0x95AD, 0x58B3, 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, + 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, + 0x96F0, 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75, + 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73, 0x95BE, + 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D, 0x95C2, 0x9589, + 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801, 0x95C6, 0x50FB, 0x95C7, + 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, + 0x95CC, 0x8511, 0x95CD, 0x7B86, 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, + 0x7247, 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, + 0x95D5, 0x904D, 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, + 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA, + 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B, 0x95E2, + 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF, 0x95E6, 0x5893, + 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, + 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023, 0x95EE, 0x4FF8, 0x95EF, 0x5305, + 0x95F0, 0x5446, 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, + 0x5CF0, 0x95F5, 0x5CEF, 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, + 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, + 0x6CD5, 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B, + 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC, 0x9649, + 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A, 0x964D, 0x90A6, + 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3, 0x9651, 0x9D6C, 0x9652, + 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, + 0x9657, 0x59A8, 0x9658, 0x5E3D, 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, + 0x623F, 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, + 0x9660, 0x5192, 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, + 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632, + 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5, 0x966D, + 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734, 0x9671, 0x7267, + 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, + 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800, 0x9679, 0x5E4C, 0x967A, 0x5954, + 0x967B, 0x672C, 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, + 0x6469, 0x9681, 0x78E8, 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, + 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, + 0x54E9, 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795, + 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D, 0x9692, + 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9, 0x9696, 0x672B, + 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD, 0x969A, 0x7E6D, 0x969B, + 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, + 0x96A0, 0x8513, 0x96A1, 0x5473, 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, + 0x5DF3, 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, + 0x96A9, 0x6E4A, 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, + 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9, + 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB, 0x96B6, + 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F, 0x96BA, 0x5A18, + 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, + 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298, 0x96C2, 0x9CF4, 0x96C3, 0x59EA, + 0x96C4, 0x725D, 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, + 0x7DBF, 0x96C9, 0x7DEC, 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, + 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, + 0x6BDB, 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017, + 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9, 0x96DA, + 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905, 0x96DE, 0x5C24, + 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0, 0x96E2, 0x554F, 0x96E3, + 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, + 0x96E8, 0x51B6, 0x96E9, 0x591C, 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, + 0x91CE, 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, + 0x96F1, 0x7D04, 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, + 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109, + 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED, 0x9741, + 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A, 0x9745, 0x52C7, + 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, + 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709, 0x974D, 0x67DA, 0x974E, 0x6E67, + 0x974F, 0x6D8C, 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, + 0x7950, 0x9754, 0x88D5, 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, + 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, + 0x4E88, 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F, + 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996, 0x9765, + 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA, 0x9769, 0x64C1, + 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8, 0x976D, 0x6D0B, 0x976E, + 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, + 0x9773, 0x8000, 0x9774, 0x8449, 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, + 0x8B21, 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, + 0x977C, 0x617E, 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, + 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85, + 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1, 0x978A, + 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61, 0x978E, 0x843D, + 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, + 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD, 0x9796, 0x862D, 0x9797, 0x89A7, + 0x9798, 0x5229, 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, + 0x68A8, 0x979D, 0x7406, 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, + 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, + 0x5F8B, 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0, + 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C, 0x97AE, + 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92, 0x97B2, 0x9686, + 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6, 0x97B6, 0x616E, 0x97B7, + 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, + 0x97BC, 0x4E21, 0x97BD, 0x51CC, 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, + 0x6881, 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, + 0x97C5, 0x7A1C, 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, + 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B, + 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797, 0x97D2, + 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8, 0x97D6, 0x8F2A, + 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, + 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F, 0x97DE, 0x985E, 0x97DF, 0x4EE4, + 0x97E0, 0x4F36, 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, + 0x5DBA, 0x97E5, 0x601C, 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, + 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, + 0x9E97, 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217, + 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9, 0x97F6, + 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149, 0x97FA, 0x7C3E, + 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE, 0x9841, 0x9023, 0x9842, + 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, + 0x9847, 0x8CC2, 0x9848, 0x8DEF, 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, + 0x5A41, 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, + 0x9850, 0x6994, 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, + 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B, + 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984, 0x985D, + 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D, 0x9861, 0x548C, + 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, + 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2, 0x9869, 0x4E99, 0x986A, 0x4E98, + 0x986B, 0x9C10, 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, + 0x6900, 0x9870, 0x6E7E, 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, + 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, + 0x4E36, 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56, + 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B, 0x98AD, + 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, + 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2, 0x98B5, 0x4EB0, 0x98B6, + 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, + 0x98BB, 0x4EC6, 0x98BC, 0x4EC2, 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, + 0x4EED, 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, + 0x98C4, 0x4F30, 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, + 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98, + 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91, 0x98D1, + 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118, 0x98D5, 0x4FD4, + 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, + 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0, 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, + 0x98DF, 0x501A, 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, + 0x5025, 0x98E4, 0x5005, 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, + 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, + 0x5011, 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703, + 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A, 0x98F5, + 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080, 0x98F9, 0x509A, + 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2, 0x9940, 0x50C9, 0x9941, + 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, + 0x9946, 0x50E5, 0x9947, 0x50ED, 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, + 0x50F9, 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, + 0x994F, 0x5116, 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, + 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B, + 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C, 0x995C, + 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169, 0x9960, 0x516A, + 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, + 0x518C, 0x9966, 0x5189, 0x9967, 0x518F, 0x9968, 0x5191, 0x9969, 0x5193, + 0x996A, 0x5195, 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, + 0x51A2, 0x996F, 0x51A9, 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, + 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, + 0x51BD, 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0, + 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0, 0x9981, + 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B, 0x9985, 0x5214, + 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A, 0x9989, 0x522E, 0x998A, + 0x5233, 0x998B, 0x5239, 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, + 0x998F, 0x524C, 0x9990, 0x525E, 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, + 0x5274, 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, + 0x9998, 0x528D, 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, + 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC, + 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1, 0x99A5, + 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3, 0x99A9, 0x52E6, + 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, + 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306, 0x99B1, 0x5308, 0x99B2, 0x7538, + 0x99B3, 0x530D, 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, + 0x531A, 0x99B8, 0x5323, 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, + 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, + 0x4E17, 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E, + 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B, 0x99C9, + 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0, 0x99CD, 0x53A6, + 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0, 0x99D1, 0x53B6, 0x99D2, + 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, + 0x99D7, 0x71EE, 0x99D8, 0x53EE, 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, + 0x53FA, 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, + 0x99E0, 0x542D, 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, + 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475, + 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477, 0x99ED, + 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480, 0x99F1, 0x5476, + 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, + 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5, 0x99F9, 0x54AC, 0x99FA, 0x54C4, + 0x99FB, 0x54C8, 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, + 0x54A4, 0x9A43, 0x54BE, 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, + 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, + 0x54EE, 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539, + 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E, 0x9A54, + 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557, 0x9A58, 0x5538, + 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599, 0x9A5C, 0x5580, 0x9A5D, + 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, + 0x9A62, 0x5598, 0x9A63, 0x559E, 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, + 0x5583, 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, + 0x9A6B, 0x55C5, 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, + 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616, + 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9, 0x9A78, + 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634, 0x9A7C, 0x5636, + 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, + 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A, 0x9A85, 0x5686, 0x9A86, 0x5680, + 0x9A87, 0x568A, 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, + 0x56A5, 0x9A8C, 0x56AE, 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, + 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, + 0x56C8, 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7, + 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF, 0x9A9D, + 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B, 0x9AA1, 0x570D, + 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716, 0x9AA5, 0x55C7, 0x9AA6, + 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, + 0x9AAB, 0x573B, 0x9AAC, 0x5740, 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, + 0x57C0, 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, + 0x9AB4, 0x5793, 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, + 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4, + 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6, 0x9AC1, + 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D, 0x9AC5, 0x5872, + 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, + 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D, 0x9ACD, 0x5879, 0x9ACE, 0x5885, + 0x9ACF, 0x58B9, 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, + 0x58DE, 0x9AD4, 0x58BB, 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, + 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, + 0x58D8, 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF, + 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB, 0x9AE5, + 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A, 0x9AE9, 0x5910, + 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925, 0x9AED, 0x592C, 0x9AEE, + 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, + 0x9AF3, 0x5955, 0x9AF4, 0x5950, 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, + 0x5958, 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, + 0x9AFC, 0x5969, 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, + 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6, + 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9, 0x9B4C, + 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11, 0x9B50, 0x5A1C, + 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, + 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36, 0x9B58, 0x5A62, 0x9B59, 0x5A6A, + 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, + 0x5AC2, 0x9B5F, 0x5ABD, 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, + 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, + 0x5B0C, 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0, + 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43, 0x9B70, + 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55, 0x9B74, 0x5B5A, + 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69, 0x9B78, 0x5B70, 0x9B79, + 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, + 0x9B7E, 0x5B80, 0x9B80, 0x5B83, 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, + 0x5BC3, 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, + 0x9B88, 0x5BE4, 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, + 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3, + 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D, 0x9B95, + 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28, 0x9B99, 0x5C38, + 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, + 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F, 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, + 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, + 0x5C8C, 0x9BA8, 0x5C91, 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, + 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, + 0x5CC5, 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9, + 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C, 0x9BB9, + 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, + 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11, 0x9BC1, 0x5D14, 0x9BC2, + 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, + 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E, 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, + 0x5D73, 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, + 0x9BD0, 0x5DA2, 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, + 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9, + 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6, 0x9BDD, + 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5, 0x9BE1, 0x5E0B, + 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, + 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44, 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, + 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, + 0x5E62, 0x9BF0, 0x5E64, 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, + 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, + 0x5EC1, 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF, + 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA, 0x9C44, + 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, + 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3, 0x9C4C, 0x5EF0, 0x9C4D, + 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, + 0x9C52, 0x5F5D, 0x9C53, 0x5F5C, 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, + 0x5F16, 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, + 0x9C5B, 0x5F48, 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, + 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61, + 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83, 0x9C68, + 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88, 0x9C6C, 0x5F91, + 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, + 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD, 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, + 0x9C76, 0x5FFB, 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, + 0x5FDD, 0x9C7B, 0x60B3, 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, + 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, + 0x6031, 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026, + 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041, 0x9C8D, + 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A, 0x9C91, 0x6046, + 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043, 0x9C95, 0x6064, 0x9C96, + 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, + 0x9C9B, 0x608D, 0x9C9C, 0x60E7, 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, + 0x6084, 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, + 0x9CA4, 0x60A7, 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, + 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD, + 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D, 0x9CB1, + 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7, 0x9CB5, 0x6100, + 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, + 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D, 0x9CBD, 0x610E, 0x9CBE, 0x6147, + 0x9CBF, 0x613E, 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, + 0x613F, 0x9CC4, 0x613C, 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, + 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, + 0x6158, 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174, + 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F, 0x9CD5, + 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199, 0x9CD9, 0x6196, + 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194, 0x9CDD, 0x619A, 0x9CDE, + 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, + 0x9CE3, 0x61CA, 0x9CE4, 0x61C9, 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, + 0x61C3, 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, + 0x9CEC, 0x61CD, 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, + 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC, + 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209, 0x9CF9, + 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B, 0x9D40, 0x621E, + 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, + 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241, 0x9D48, 0x624E, 0x9D49, 0x625E, + 0x9D4A, 0x6263, 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, + 0x627C, 0x9D4F, 0x6282, 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, + 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, + 0x6294, 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF, + 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8, 0x9D60, + 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2, 0x9D64, 0x62C7, + 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C, 0x9D68, 0x62EE, 0x9D69, + 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, + 0x9D6E, 0x62F5, 0x9D6F, 0x6350, 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, + 0x641C, 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, + 0x9D77, 0x63AB, 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, + 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369, + 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6, 0x9D85, + 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6, 0x9D89, 0x63C4, + 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, + 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D, 0x9D91, 0x6417, 0x9D92, 0x6428, + 0x9D93, 0x640F, 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, + 0x644E, 0x9D98, 0x652A, 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, + 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, + 0x64D2, 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8, + 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209, 0x9DA9, + 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, + 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4, 0x9DB1, 0x64F2, 0x9DB2, + 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, + 0x9DB7, 0x6505, 0x9DB8, 0x6524, 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, + 0x6534, 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, + 0x9DC0, 0x754B, 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, + 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572, + 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A, 0x9DCD, + 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7, 0x9DD1, 0x65C3, + 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, + 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9, 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, + 0x9DDB, 0x65F1, 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, + 0x65FB, 0x9DE0, 0x6773, 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, + 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, + 0x6641, 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667, + 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670, 0x9DF1, + 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689, 0x9DF5, 0x6684, + 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1, 0x9DF9, 0x66B9, 0x9DFA, + 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, + 0x9E42, 0x66D6, 0x9E43, 0x66DA, 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, + 0x66E6, 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, + 0x9E4B, 0x670F, 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, + 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736, + 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746, 0x9E58, + 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763, 0x9E5C, 0x6764, + 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, + 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B, 0x9E64, 0x67A6, 0x9E65, 0x67A1, + 0x9E66, 0x6785, 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, + 0x67EC, 0x9E6B, 0x67B3, 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, + 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, + 0x67B9, 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C, + 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840, 0x9E7C, + 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3, 0x9E81, 0x682B, + 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877, 0x9E85, 0x687F, 0x9E86, + 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, + 0x9E8B, 0x689B, 0x9E8C, 0x6883, 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, + 0x6874, 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, + 0x9E94, 0x688D, 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, + 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1, + 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7, 0x9EA1, + 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904, 0x9EA5, 0x68D7, + 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, + 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A, 0x9EAD, 0x691A, 0x9EAE, 0x6923, + 0x9EAF, 0x6921, 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, + 0x695C, 0x9EB4, 0x6978, 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, + 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, + 0x6959, 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D, + 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE, 0x9EC5, + 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, + 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA, 0x9ECD, 0x69DD, 0x9ECE, + 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, + 0x9ED3, 0x69A0, 0x9ED4, 0x699C, 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, + 0x69DE, 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, + 0x9EDC, 0x6B0A, 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, + 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14, + 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1, 0x9EE9, + 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C, 0x9EED, 0x6A72, + 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, + 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48, 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, + 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, + 0x6AA2, 0x9EFC, 0x6AA3, 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, + 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, + 0x6AAC, 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA, + 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05, 0x9F50, + 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16, 0x9F54, 0x9B31, + 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37, 0x9F58, 0x76DC, 0x9F59, + 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, + 0x9F5E, 0x6B50, 0x9F5F, 0x6B59, 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, + 0x6B5F, 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, + 0x9F67, 0x6B80, 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, + 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA, + 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1, 0x9F74, + 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6, 0x9F78, 0x6BCB, + 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, + 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE, 0x9F81, 0x6C08, 0x9F82, 0x6C13, + 0x9F83, 0x6C14, 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, + 0x6C5E, 0x9F88, 0x6C55, 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, + 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, + 0x6C7E, 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90, + 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD, 0x9F99, + 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, + 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB, 0x9FA1, 0x6CEF, 0x9FA2, + 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, + 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D, 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, + 0x6D35, 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, + 0x9FB0, 0x6D93, 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, + 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85, + 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5, 0x9FBD, + 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6, 0x9FC1, 0x6DEC, + 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, + 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9, 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, + 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, + 0x6E2E, 0x9FD0, 0x6E19, 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, + 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, + 0x6E4D, 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E, + 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38, 0x9FE1, + 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, + 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF, 0x9FE9, 0x6EC4, 0x9FEA, + 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, + 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F, 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, + 0x704C, 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, + 0x9FF8, 0x6EF2, 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, + 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86, + 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80, 0xE048, + 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D, 0xE04C, 0x6F82, + 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, + 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3, 0xE054, 0x6FA3, 0xE055, 0x6FA1, + 0xE056, 0x6FA4, 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, + 0x6FDF, 0xE05B, 0x6FD5, 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, + 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, + 0x700B, 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F, + 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74, 0xE06C, + 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030, 0xE070, 0x703E, + 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063, 0xE074, 0x7099, 0xE075, + 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, + 0xE07A, 0x70B3, 0xE07B, 0x70AE, 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, + 0x70DD, 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, + 0xE084, 0x7119, 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, + 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C, + 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195, 0xE091, + 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9, 0xE095, 0x71BE, + 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, + 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7, 0xE09D, 0x71F5, 0xE09E, 0x71FC, + 0xE09F, 0x71F9, 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, + 0x721B, 0xE0A4, 0x7228, 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, + 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, + 0x7240, 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274, + 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287, 0xE0B5, + 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, + 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6, 0xE0BD, 0x72C4, 0xE0BE, + 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, + 0xE0C3, 0x72F9, 0xE0C4, 0x72F7, 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, + 0x730A, 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, + 0xE0CC, 0x732F, 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, + 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A, + 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375, 0xE0D9, + 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3, 0xE0DD, 0x73CE, + 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, + 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405, 0xE0E5, 0x746F, 0xE0E6, 0x7425, + 0xE0E7, 0x73F8, 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, + 0x743F, 0xE0EC, 0x745F, 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, + 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, + 0x7476, 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7, + 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1, 0xE140, + 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9, 0xE144, 0x74EE, + 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1, 0xE148, 0x74F8, 0xE149, + 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, + 0xE14E, 0x750E, 0xE14F, 0x750D, 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, + 0x751E, 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, + 0xE157, 0x754D, 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, + 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567, + 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576, 0xE164, + 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A, 0xE168, 0x7589, + 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, + 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2, 0xE170, 0x75B3, 0xE171, 0x75C3, + 0xE172, 0x75B5, 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, + 0x75B1, 0xE177, 0x75CD, 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, + 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, + 0x75FC, 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2, + 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609, 0xE189, + 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621, 0xE18D, 0x7622, + 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630, 0xE191, 0x763B, 0xE192, + 0x7647, 0xE193, 0x7648, 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, + 0xE197, 0x7661, 0xE198, 0x7662, 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, + 0x766A, 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, + 0xE1A0, 0x7676, 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, + 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696, + 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0, 0xE1AD, + 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA, 0xE1B1, 0x76C2, + 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, + 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7, 0xE1B9, 0x76EA, 0xE1BA, 0x862F, + 0xE1BB, 0x76FB, 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, + 0x7729, 0xE1C0, 0x7724, 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, + 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, + 0x775A, 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765, + 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E, 0xE1D1, + 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E, 0xE1D5, 0x77B0, + 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF, 0xE1D9, 0x77BC, 0xE1DA, + 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, + 0xE1DF, 0x77DA, 0xE1E0, 0x77DC, 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, + 0x77FC, 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, + 0xE1E8, 0x792A, 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, + 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3, + 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1, 0xE1F5, + 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE, 0xE1F9, 0x78BC, + 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, + 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4, 0xE244, 0x7907, 0xE245, 0x7912, + 0xE246, 0x7911, 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, + 0x7940, 0xE24B, 0x7960, 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, + 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, + 0x798A, 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA, + 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA, 0xE25C, + 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC, 0xE260, 0x79E1, + 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D, 0xE264, 0x7A18, 0xE265, + 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, + 0xE26A, 0x7A3B, 0xE26B, 0x7A3E, 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, + 0x7A57, 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, + 0xE273, 0x9F9D, 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, + 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96, + 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6, 0xE281, + 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083, 0xE285, 0x7AC7, + 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, + 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA, 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, + 0xE28F, 0x7AE2, 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, + 0x7B02, 0xE294, 0x7B0F, 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, + 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, + 0x7B28, 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04, + 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45, 0xE2A5, + 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, + 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E, 0xE2AD, 0x7B9D, 0xE2AE, + 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, + 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92, 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, + 0x7B99, 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, + 0xE2BC, 0x7BB4, 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, + 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60, + 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3, 0xE2C9, + 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6, 0xE2CD, 0x7C23, + 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, + 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C, 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, + 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, + 0x7C5F, 0xE2DC, 0x7C64, 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, + 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, + 0x7CAD, 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8, + 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE, 0xE2ED, + 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, + 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC, 0xE2F5, 0x7CE2, 0xE2F6, + 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, + 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06, 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, + 0x7D15, 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, + 0xE347, 0x7D32, 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, + 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68, + 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93, 0xE354, + 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D, 0xE358, 0x7D9B, + 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, + 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB, 0xE360, 0x7E3D, 0xE361, 0x7DA2, + 0xE362, 0x7DAF, 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, + 0x7DB0, 0xE367, 0x7DD8, 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, + 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, + 0x7E0A, 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31, + 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22, 0xE378, + 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35, 0xE37C, 0x7E39, + 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32, 0xE381, 0x7E3A, 0xE382, + 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, + 0xE387, 0x7E5A, 0xE388, 0x7E79, 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, + 0x7E7C, 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, + 0xE390, 0x8FAE, 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, + 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94, + 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C, 0xE39D, + 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C, 0xE3A1, 0x7F4D, + 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, + 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F, 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, + 0xE3AB, 0x7F69, 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, + 0x7F86, 0xE3B0, 0x7F83, 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, + 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, + 0x7FA3, 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE, + 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5, 0xE3C1, + 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, + 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3, 0xE3C9, 0x7FF9, 0xE3CA, + 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, + 0xE3CF, 0x8018, 0xE3D0, 0x8019, 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, + 0x8028, 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, + 0xE3D8, 0x8052, 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, + 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070, + 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F, 0xE3E5, + 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B, 0xE3E9, 0x8093, + 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, + 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9, 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, + 0xE3F3, 0x80DA, 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, + 0x80F1, 0xE3F8, 0x811B, 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, + 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, + 0x8153, 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E, + 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183, 0xE44C, + 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182, 0xE450, 0x81A0, + 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3, 0xE454, 0x815F, 0xE455, + 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, + 0xE45A, 0x81B8, 0xE45B, 0x81BD, 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, + 0x81BA, 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, + 0xE463, 0x81D8, 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, + 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE, + 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207, 0xE470, + 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216, 0xE474, 0x8229, + 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, + 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D, 0xE47C, 0x825A, 0xE47D, 0x825F, + 0xE47E, 0x8264, 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, + 0x826B, 0xE484, 0x822E, 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, + 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, + 0x829F, 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3, + 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3, 0xE495, + 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB, 0xE499, 0x82F9, + 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC, 0xE49D, 0x8309, 0xE49E, + 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, + 0xE4A3, 0x8331, 0xE4A4, 0x8340, 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, + 0x8345, 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, + 0xE4AC, 0x8385, 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, + 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387, + 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373, 0xE4B9, + 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8, 0xE4BD, 0x83F4, + 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, + 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B, 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, + 0xE4C7, 0x8407, 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, + 0x8422, 0xE4CC, 0x8420, 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, + 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, + 0x855A, 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD, + 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446, 0xE4DD, + 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435, 0xE4E1, 0x84CA, + 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF, 0xE4E5, 0x849F, 0xE4E6, + 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, + 0xE4EB, 0x84C1, 0xE4EC, 0x84C6, 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, + 0x8521, 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, + 0xE4F4, 0x852C, 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, + 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548, + 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555, 0xE544, + 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591, 0xE548, 0x858A, + 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, + 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C, 0xE550, 0x8577, 0xE551, 0x857E, + 0xE552, 0x8590, 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, + 0x85B9, 0xE557, 0x85D0, 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, + 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, + 0x860B, 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622, + 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D, 0xE568, + 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667, 0xE56C, 0x8671, + 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9, 0xE570, 0x86AA, 0xE571, + 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, + 0xE576, 0x86C6, 0xE577, 0x86B0, 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, + 0x86AB, 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, + 0xE580, 0x86DF, 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, + 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB, + 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9, 0xE58D, + 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737, 0xE591, 0x873B, + 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, + 0x875F, 0xE597, 0x8778, 0xE598, 0x874C, 0xE599, 0x874E, 0xE59A, 0x8774, + 0xE59B, 0x8757, 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, + 0x8753, 0xE5A0, 0x8763, 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, + 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, + 0x87BD, 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB, + 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6, 0xE5B1, + 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0, 0xE5B5, 0x880F, + 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6, 0xE5B9, 0x87F7, 0xE5BA, + 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, + 0xE5BF, 0x8822, 0xE5C0, 0x8821, 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, + 0x8839, 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, + 0xE5C8, 0x8852, 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, + 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875, + 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882, 0xE5D5, + 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899, 0xE5D9, 0x88A2, + 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, + 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4, 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, + 0xE5E3, 0x88D9, 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, + 0x88FC, 0xE5E8, 0x88F4, 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, + 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, + 0x891E, 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941, + 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938, 0xE5F9, + 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E, 0xE640, 0x8966, + 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A, 0xE644, 0x896F, 0xE645, + 0x8974, 0xE646, 0x8977, 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, + 0xE64A, 0x898A, 0xE64B, 0x8993, 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, + 0x89A9, 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, + 0xE653, 0x89BA, 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, + 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4, + 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10, 0xE660, + 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25, 0xE664, 0x8A36, + 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, + 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D, 0xE66C, 0x8A6C, 0xE66D, 0x8A62, + 0xE66E, 0x8A85, 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, + 0x8AA1, 0xE673, 0x8A91, 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, + 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, + 0x8ADA, 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4, + 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2, 0xE685, + 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C, 0xE689, 0x8B07, + 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16, 0xE68D, 0x8B10, 0xE68E, + 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, + 0xE693, 0x8B2B, 0xE694, 0x8B3E, 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, + 0x8B4C, 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, + 0xE69C, 0x8B5B, 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, + 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80, + 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93, 0xE6A9, + 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A, 0xE6AD, 0x8C41, + 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, + 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62, 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, + 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, + 0x8C8A, 0xE6BC, 0x8C8D, 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, + 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, + 0x8CBD, 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6, + 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3, 0xE6CD, + 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, + 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07, 0xE6D5, 0x8D0F, 0xE6D6, + 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, + 0xE6DB, 0x8D14, 0xE6DC, 0x8D16, 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, + 0x8D71, 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, + 0xE6E4, 0x8DBE, 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, + 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA, + 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC, 0xE6F1, + 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D, 0xE6F5, 0x8E1E, + 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, + 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A, 0xE740, 0x8E47, 0xE741, 0x8E49, + 0xE742, 0x8E4C, 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, + 0x8E64, 0xE747, 0x8E60, 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, + 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, + 0x8E87, 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A, + 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99, 0xE758, + 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, + 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5, 0xE760, 0x8EC8, 0xE761, + 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, + 0xE766, 0x8EEB, 0xE767, 0x8EFE, 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, + 0x8F15, 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, + 0xE76F, 0x8F1F, 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, + 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42, + 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46, 0xE77C, + 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62, 0xE781, 0x8F63, + 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, + 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7, 0xE789, 0x8FDA, 0xE78A, 0x8FE5, + 0xE78B, 0x8FE2, 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, + 0x8FF4, 0xE790, 0x9005, 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, + 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, + 0x9016, 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035, + 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050, 0xE7A1, + 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049, 0xE7A5, 0x903E, + 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E, 0xE7A9, 0x9068, 0xE7AA, + 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, + 0xE7AF, 0x907D, 0xE7B0, 0x9081, 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, + 0x9089, 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, + 0xE7B8, 0x90B5, 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, + 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132, + 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158, 0xE7C5, + 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173, 0xE7C9, 0x9172, + 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, + 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA, 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, + 0xE7D3, 0x91BA, 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, + 0x91CB, 0xE7D8, 0x91D0, 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, + 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, + 0x921E, 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215, + 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245, 0xE7E9, + 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295, 0xE7ED, 0x923F, + 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C, 0xE7F1, 0x9296, 0xE7F2, + 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, + 0xE7F7, 0x92B7, 0xE7F8, 0x92E9, 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, + 0x9344, 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, + 0xE843, 0x9323, 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, + 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356, + 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394, 0xE850, + 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8, 0xE854, 0x93E5, + 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, + 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A, 0xE85C, 0x9414, 0xE85D, 0x9413, + 0xE85E, 0x9403, 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, + 0x942B, 0xE863, 0x9435, 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, + 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, + 0x9462, 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470, + 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A, 0xE874, + 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F, 0xE878, 0x9582, + 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594, 0xE87C, 0x9596, 0xE87D, + 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, + 0xE883, 0x95AD, 0xE884, 0x95BC, 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, + 0x95BE, 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, + 0xE88C, 0x95CC, 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, + 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621, + 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642, 0xE899, + 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677, 0xE89D, 0x965C, + 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, + 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D, 0xE8A5, 0x9698, 0xE8A6, 0x9695, + 0xE8A7, 0x9697, 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, + 0x96B2, 0xE8AC, 0x96B0, 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, + 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, + 0x96CD, 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5, + 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708, 0xE8BD, + 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F, 0xE8C1, 0x9716, + 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A, 0xE8C5, 0x9730, 0xE8C6, + 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, + 0xE8CB, 0x9748, 0xE8CC, 0x9742, 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, + 0x9760, 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, + 0xE8D4, 0x976B, 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, + 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B, + 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8, 0xE8E1, + 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4, 0xE8E5, 0x97C3, + 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, + 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2, 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, + 0xE8EF, 0x97F5, 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, + 0x9824, 0xE8F4, 0x9821, 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, + 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, + 0x9870, 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA, + 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4, 0xE948, + 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB, 0xE94C, 0x9903, + 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914, 0xE950, 0x9918, 0xE951, + 0x9921, 0xE952, 0x991D, 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, + 0xE956, 0x992C, 0xE957, 0x992E, 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, + 0x9942, 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, + 0xE95F, 0x9951, 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, + 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE, + 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD, 0xE96C, + 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE, 0xE970, 0x99F1, + 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, + 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2, 0xE978, 0x9A19, 0xE979, 0x9A2B, + 0xE97A, 0x9A37, 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, + 0x9A43, 0xE980, 0x9A3E, 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, + 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, + 0x9A64, 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD, + 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF, 0xE991, + 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE, 0xE995, 0x9ADF, + 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6, 0xE999, 0x9AEF, 0xE99A, + 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, + 0xE99F, 0x9AFB, 0xE9A0, 0x9B06, 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, + 0x9B1F, 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, + 0xE9A8, 0x9B28, 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, + 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F, + 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58, 0xE9B5, + 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91, 0xE9B9, 0x9B96, + 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, + 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA, 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, + 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, + 0x9BE2, 0xE9C8, 0x9BE4, 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, + 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, + 0x9C14, 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06, + 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04, 0xE9D9, + 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, + 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32, 0xE9E1, 0x9C46, 0xE9E2, + 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, + 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7, 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, + 0x9D09, 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, + 0xE9F0, 0x9D2A, 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, + 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41, + 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48, 0xEA40, + 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51, 0xEA44, 0x9D50, + 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, + 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A, 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, + 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, + 0x9DBB, 0xEA53, 0x9DB8, 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, + 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, + 0x9DE6, 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A, + 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79, 0xEA64, + 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, + 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91, 0xEA6C, 0x9E9D, 0xEA6D, + 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, + 0xEA72, 0x9761, 0xEA73, 0x9ECC, 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, + 0x9ED0, 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, + 0xEA7B, 0x9EE0, 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, + 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB, + 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08, 0xEA89, + 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C, 0xEA8D, 0x9F3E, + 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, + 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61, 0xEA95, 0x9F66, 0xEA96, 0x9F67, + 0xEA97, 0x9F6C, 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, + 0x9F76, 0xEA9C, 0x9F95, 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, + 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, + 0x7199, 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173, + 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177, 0xFA48, + 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07, 0xFA57, 0xFF02, + 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348, 0xFA5F, 0x9288, 0xFA60, + 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, + 0xFA65, 0x92F9, 0xFA66, 0x66FB, 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, + 0x4EE1, 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, + 0xFA6E, 0x4F56, 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, + 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF, + 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042, 0xFA7B, + 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A, 0xFA80, 0x5164, + 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, + 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0, 0xFA88, 0x52DB, 0xFA89, 0x5300, + 0xFA8A, 0x5307, 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, + 0x53B2, 0xFA8F, 0x53DD, 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, + 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, + 0x5765, 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F, + 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B, 0xFAA0, + 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963, 0xFAA4, 0x59A4, + 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0, 0xFAA8, 0x752F, 0xFAA9, + 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, + 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27, 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, + 0x5D42, 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, + 0xFAB7, 0x5F21, 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, + 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE, + 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111, 0xFAC4, + 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213, 0xFAC8, 0x62A6, + 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, + 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615, 0xFAD0, 0x663B, 0xFAD1, 0x6609, + 0xFAD2, 0x662E, 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, + 0x6657, 0xFAD7, 0x6659, 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, + 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, + 0x670E, 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852, + 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF, 0xFAE8, + 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998, 0xFAEC, 0x69E2, + 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46, 0xFAF0, 0x6A73, 0xFAF1, + 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, + 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86, 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, + 0x6D04, 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, + 0xFB42, 0x6DCF, 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, + 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF, + 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005, 0xFB4F, + 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB, 0xFB53, 0x710F, + 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, + 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE, 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, + 0xFB5D, 0x7324, 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, + 0x73C9, 0xFB62, 0x73D6, 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, + 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, + 0x742E, 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501, + 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E, 0xFB73, + 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746, 0xFB77, 0x52AF, + 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864, 0xFB7B, 0x787A, 0xFB7C, + 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, + 0xFB82, 0xFA1B, 0xFB83, 0x799B, 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, + 0xFA1C, 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, + 0xFB8B, 0x7D5C, 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, + 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301, + 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6, 0xFB98, + 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559, 0xFB9C, 0x856B, + 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, + 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12, 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, + 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, + 0x8AF6, 0xFBAB, 0x8B53, 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, + 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, + 0xFA24, 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26, + 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7, 0xFBBC, + 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, + 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A, 0xFBC4, 0x923A, 0xFBC5, + 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, + 0xFBCA, 0x9239, 0xFBCB, 0x9267, 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, + 0x9278, 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, + 0xFBD3, 0xFA27, 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, + 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E, + 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370, 0xFBE0, + 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE, 0xFBE4, 0x93F8, + 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, + 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D, 0xFBEC, 0x96AF, 0xFBED, 0x9733, + 0xFBEE, 0x973B, 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, + 0x9751, 0xFBF3, 0x9755, 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, + 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, + 0x9A4E, 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72, + 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00, 0xFC47, + 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, + 0, 0 }; +# endif + +/// Simplified Chinese +# if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0 +/// Unicode --> GBK pairs +static const WCHAR uni2oem936[] + = { 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, 0x00B1, + 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, 0x00E1, 0xA8A2, + 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, 0x00EC, 0xA8AC, 0x00ED, + 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, + 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, + 0xA8A7, 0x012B, 0xA8A9, 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, + 0x016B, 0xA8B1, 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, + 0xA8B3, 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, + 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, 0x02CA, + 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, 0x0392, 0xA6A2, + 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, 0x0396, 0xA6A6, 0x0397, + 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, 0x039A, 0xA6AA, 0x039B, 0xA6AB, + 0x039C, 0xA6AC, 0x039D, 0xA6AD, 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, + 0xA6B0, 0x03A1, 0xA6B1, 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, + 0x03A6, 0xA6B5, 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, + 0xA6C1, 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, 0x03BA, + 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, 0x03BE, 0xA6CE, + 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, 0x03C3, 0xA6D2, 0x03C4, + 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, + 0x03C9, 0xA6D8, 0x0401, 0xA7A7, 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, + 0xA7A3, 0x0413, 0xA7A4, 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, + 0x0417, 0xA7A9, 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, + 0xA7AD, 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, + 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, 0x0424, + 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, 0x0428, 0xA7BA, + 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, 0x042C, 0xA7BE, 0x042D, + 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, 0x0430, 0xA7D1, 0x0431, 0xA7D2, + 0x0432, 0xA7D3, 0x0433, 0xA7D4, 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, + 0xA7D8, 0x0437, 0xA7D9, 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, + 0x043B, 0xA7DD, 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, + 0xA7E1, 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, 0x0448, + 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, 0x044C, 0xA7EE, + 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, 0x0451, 0xA7D7, 0x2010, + 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, 0x2015, 0xA844, 0x2016, 0xA1AC, + 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, + 0xA845, 0x2026, 0xA1AD, 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, + 0x2035, 0xA846, 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, + 0xA847, 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, + 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, 0x2165, + 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, 0x2169, 0xA2FA, + 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, 0x2171, 0xA2A2, 0x2172, + 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, 0x2175, 0xA2A6, 0x2176, 0xA2A7, + 0x2177, 0xA2A8, 0x2178, 0xA2A9, 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, + 0xA1FC, 0x2192, 0xA1FA, 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, + 0x2198, 0xA84B, 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, + 0xA1C6, 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, 0x2227, + 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, 0x222B, 0xA1D2, + 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, 0x2236, 0xA1C3, 0x2237, + 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, 0x224C, 0xA1D5, 0x2252, 0xA850, + 0x2260, 0xA1D9, 0x2261, 0xA1D4, 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, + 0xA851, 0x2267, 0xA852, 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, + 0x2299, 0xA1D1, 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, + 0xA2D9, 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, + 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, 0x2469, + 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, 0x2477, 0xA2C8, + 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, 0x247B, 0xA2CC, 0x247C, + 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, 0x247F, 0xA2D0, 0x2480, 0xA2D1, + 0x2481, 0xA2D2, 0x2482, 0xA2D3, 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, + 0xA2D6, 0x2486, 0xA2D7, 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, + 0x248A, 0xA2B3, 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, + 0xA2B7, 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, 0x2497, + 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, 0x249B, 0xA2C4, + 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, 0x2503, 0xA9A7, 0x2504, + 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, 0x2507, 0xA9AB, 0x2508, 0xA9AC, + 0x2509, 0xA9AD, 0x250A, 0xA9AE, 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, + 0xA9B1, 0x250E, 0xA9B2, 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, + 0x2512, 0xA9B6, 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, + 0xA9BA, 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, + 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, 0x251F, + 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, 0x2523, 0xA9C7, + 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, 0x2527, 0xA9CB, 0x2528, + 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, 0x252B, 0xA9CF, 0x252C, 0xA9D0, + 0x252D, 0xA9D1, 0x252E, 0xA9D2, 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, + 0xA9D5, 0x2532, 0xA9D6, 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, + 0x2536, 0xA9DA, 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, + 0xA9DE, 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, 0x2543, + 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, 0x2547, 0xA9EB, + 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, 0x254B, 0xA9EF, 0x2550, + 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, 0x2553, 0xA857, 0x2554, 0xA858, + 0x2555, 0xA859, 0x2556, 0xA85A, 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, + 0xA85D, 0x255A, 0xA85E, 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, + 0x255E, 0xA862, 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, + 0xA866, 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, + 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, 0x256B, + 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, 0x256F, 0xA873, + 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, 0x2573, 0xA877, 0x2581, + 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, 0x2584, 0xA87B, 0x2585, 0xA87C, + 0x2586, 0xA87D, 0x2587, 0xA87E, 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, + 0xA882, 0x258B, 0xA883, 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, + 0x258F, 0xA887, 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, + 0xA1F6, 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, 0x25CE, + 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, 0x25E4, 0xA88F, + 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, 0x2609, 0xA891, 0x2640, + 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, 0x3001, 0xA1A2, 0x3002, 0xA1A3, + 0x3003, 0xA1A8, 0x3005, 0xA1A9, 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, + 0xA1B4, 0x3009, 0xA1B5, 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, + 0x300D, 0xA1B9, 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, + 0xA1BF, 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, + 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, 0x3021, + 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, 0x3025, 0xA944, + 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, 0x3029, 0xA948, 0x3041, + 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, 0x3044, 0xA4A4, 0x3045, 0xA4A5, + 0x3046, 0xA4A6, 0x3047, 0xA4A7, 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, + 0xA4AA, 0x304B, 0xA4AB, 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, + 0x304F, 0xA4AF, 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, + 0xA4B3, 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, 0x305C, + 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, 0x3060, 0xA4C0, + 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, 0x3064, 0xA4C4, 0x3065, + 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, 0x3068, 0xA4C8, 0x3069, 0xA4C9, + 0x306A, 0xA4CA, 0x306B, 0xA4CB, 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, + 0xA4CE, 0x306F, 0xA4CF, 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, + 0x3073, 0xA4D3, 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, + 0xA4D7, 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, + 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, 0x3080, + 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, 0x3084, 0xA4E4, + 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, 0x3088, 0xA4E8, 0x3089, + 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, 0x308C, 0xA4EC, 0x308D, 0xA4ED, + 0x308E, 0xA4EE, 0x308F, 0xA4EF, 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, + 0xA4F2, 0x3093, 0xA4F3, 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, + 0x309E, 0xA967, 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, + 0xA5A4, 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, 0x30AD, + 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, 0x30B1, 0xA5B1, + 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, 0x30B5, 0xA5B5, 0x30B6, + 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, + 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, + 0xA5BF, 0x30C0, 0xA5C0, 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, + 0x30C4, 0xA5C4, 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, + 0xA5C8, 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, 0x30D1, + 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, 0x30D5, 0xA5D5, + 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, 0x30D9, 0xA5D9, 0x30DA, + 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, + 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, + 0xA5E3, 0x30E4, 0xA5E4, 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, + 0x30E8, 0xA5E8, 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, + 0xA5EC, 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, 0x30F5, + 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, 0x30FE, 0xA964, + 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, 0x3108, 0xA8C8, 0x3109, + 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, 0x310C, 0xA8CC, 0x310D, 0xA8CD, + 0x310E, 0xA8CE, 0x310F, 0xA8CF, 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, + 0xA8D2, 0x3113, 0xA8D3, 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, + 0x3117, 0xA8D7, 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, + 0xA8DB, 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, + 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, 0x3124, + 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, 0x3128, 0xA8E8, + 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, 0x3222, 0xA2E7, 0x3223, + 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, 0x3226, 0xA2EB, 0x3227, 0xA2EC, + 0x3228, 0xA2ED, 0x3229, 0xA2EE, 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, + 0xA94A, 0x338F, 0xA94B, 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, + 0x33A1, 0xA94F, 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, + 0xA953, 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, 0x4E07, + 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, 0x4E0B, 0xCFC2, + 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, 0x4E0F, 0x8144, 0x4E10, + 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, + 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, + 0xB1FB, 0x4E1A, 0xD2B5, 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, + 0x4E1E, 0xD8A9, 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, + 0xB6AA, 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, + 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, 0x4E2B, + 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, 0x4E2F, 0x814E, + 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, 0x4E33, 0x8150, 0x4E34, + 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, 0x4E37, 0x8152, 0x4E38, 0xCDE8, + 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, + 0xC0F6, 0x4E3E, 0xBED9, 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, + 0x4E42, 0x8156, 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, + 0x8158, 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, 0x4E4F, + 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, 0x4E53, 0xC5D2, + 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, 0x4E57, 0x815C, 0x4E58, + 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, + 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, + 0xCFE7, 0x4E62, 0x815F, 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, + 0x4E66, 0xCAE9, 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, + 0x8165, 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, + 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, 0x4E73, + 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, 0x4E77, 0x816F, + 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, 0x4E7B, 0x8173, 0x4E7C, + 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, 0x4E7F, 0x8176, 0x4E80, 0x8177, + 0x4E81, 0x8178, 0x4E82, 0x8179, 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, + 0x817C, 0x4E86, 0xC1CB, 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, + 0x4E8A, 0x817E, 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, + 0xD3DA, 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, 0x4E97, + 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, 0x4E9B, 0xD0A9, + 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, 0x4E9F, 0xD8BD, 0x4EA0, + 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, + 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, + 0xC4B6, 0x4EAA, 0x8188, 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, + 0x4EAE, 0xC1C1, 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, + 0xC7D7, 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, + 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, 0x4EBB, + 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, 0x4EBF, 0xD2DA, + 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, 0x4EC3, 0xD8EA, 0x4EC4, + 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, + 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, + 0xC8D4, 0x4ECE, 0xB4D3, 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, + 0x4ED2, 0x8198, 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, + 0xCBFB, 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, 0x4EDF, + 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, 0x4EE3, 0xB4FA, + 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, 0x4EE7, 0x819F, 0x4EE8, + 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, + 0x4EED, 0x81A1, 0x4EEE, 0x81A2, 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, + 0x81A4, 0x4EF2, 0xD6D9, 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, + 0x4EF6, 0xBCFE, 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, + 0x81A8, 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, + 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, 0x4F03, + 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, 0x4F07, 0x81B1, + 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, 0x4F0B, 0x81B3, 0x4F0C, + 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, + 0x4F11, 0xD0DD, 0x4F12, 0x81B5, 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, + 0x81B8, 0x4F16, 0x81B9, 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, + 0x4F1A, 0xBBE1, 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, + 0xC9A1, 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, 0x4F27, + 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, 0x4F2B, 0xD8F9, + 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, 0x4F2F, 0xB2AE, 0x4F30, + 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, 0x4F33, 0x81C4, 0x4F34, 0xB0E9, + 0x4F35, 0x81C5, 0x4F36, 0xC1E6, 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, + 0x81C7, 0x4F3A, 0xCBC5, 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, + 0x4F3E, 0x81C9, 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, + 0x81CD, 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, + 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, 0x4F4B, + 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, 0x4F4F, 0xD7A1, + 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, 0x4F53, 0xCCE5, 0x4F54, + 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, + 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, + 0xD8FE, 0x4F5E, 0xD8FA, 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, + 0x4F62, 0x81DA, 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, + 0x81DB, 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, 0x4F6F, + 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, 0x4F73, 0xBCD1, + 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, 0x4F77, 0x81E4, 0x4F78, + 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, + 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, + 0x81EA, 0x4F82, 0x81EB, 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, + 0x4F86, 0x81ED, 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, + 0x81EF, 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, + 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, 0x4F93, + 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, 0x4F97, 0xB6B1, + 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, 0x4F9B, 0xB9A9, 0x4F9C, + 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, + 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, + 0xBDC4, 0x4FA6, 0xD5EC, 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, + 0x4FAA, 0xD9AD, 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, + 0xCEEA, 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, 0x4FB7, + 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, 0x4FBB, 0x824D, + 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, 0x4FBF, 0xB1E3, 0x4FC0, + 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, + 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, + 0x8257, 0x4FCA, 0xBFA1, 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, + 0x4FCE, 0xD9DE, 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, + 0x825B, 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, + 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, 0x4FDB, + 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, 0x4FDF, 0xD9B9, + 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, 0x4FE3, 0xD9B6, 0x4FE4, + 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, + 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, + 0xBCF3, 0x4FEE, 0xD0DE, 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, + 0x4FF2, 0x826A, 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, + 0x826D, 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, 0x4FFF, + 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, 0x5003, 0x8277, + 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, 0x5007, 0x827B, 0x5008, + 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, 0x500B, 0x8280, 0x500C, 0xD9C4, + 0x500D, 0xB1B6, 0x500E, 0x8281, 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, + 0x8283, 0x5012, 0xB5B9, 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, + 0x5016, 0x8286, 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, + 0xD2D0, 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, + 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, 0x5023, + 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, 0x5027, 0x828F, + 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, 0x502B, 0x8290, 0x502C, + 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, 0x502F, 0x8291, 0x5030, 0x8292, + 0x5031, 0x8293, 0x5032, 0x8294, 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, + 0x8297, 0x5036, 0x8298, 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, + 0x503A, 0xD5AE, 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, + 0xC7E3, 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, 0x5047, + 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, 0x504B, 0x82A7, + 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, 0x504F, 0xC6AB, 0x5050, + 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, 0x5053, 0x82AC, 0x5054, 0x82AD, + 0x5055, 0xD9C9, 0x5056, 0x82AE, 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, + 0x82B1, 0x505A, 0xD7F6, 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, + 0x505E, 0x82B4, 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, + 0x82B8, 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, + 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, 0x506B, + 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, 0x506F, 0x82C3, + 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, 0x5073, 0x82C7, 0x5074, + 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, 0x5077, 0xCDB5, 0x5078, 0x82CA, + 0x5079, 0x82CB, 0x507A, 0x82CC, 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, + 0x82CE, 0x507E, 0xD9C7, 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, + 0x5082, 0x82D0, 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, + 0x82D3, 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, 0x508F, + 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, 0x5093, 0x82DE, + 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, 0x5097, 0x82E2, 0x5098, + 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, 0x509B, 0x82E6, 0x509C, 0x82E7, + 0x509D, 0x82E8, 0x509E, 0x82E9, 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, + 0x82EC, 0x50A2, 0x82ED, 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, + 0x50A6, 0x82EF, 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, + 0x82F0, 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, + 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, 0x50B3, + 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, 0x50B7, 0x82FB, + 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, 0x50BB, 0xC9B5, 0x50BC, + 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, 0x50BF, 0x8342, 0x50C0, 0x8343, + 0x50C1, 0x8344, 0x50C2, 0x8345, 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, + 0x8348, 0x50C6, 0x8349, 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, + 0x50CA, 0x834D, 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, + 0x8351, 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, 0x50D7, + 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, 0x50DB, 0x835B, + 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, 0x50DF, 0x835F, 0x50E0, + 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, 0x50E3, 0x8363, 0x50E4, 0x8364, + 0x50E5, 0x8365, 0x50E6, 0xD9D6, 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, + 0x8367, 0x50EA, 0x8368, 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, + 0x50EE, 0xD9D7, 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, + 0x836D, 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, + 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, 0x50FB, + 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, 0x50FF, 0x8377, + 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, 0x5103, 0x837B, 0x5104, + 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, 0x5107, 0xD9D8, 0x5108, 0x837E, + 0x5109, 0x8380, 0x510A, 0x8381, 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, + 0x8383, 0x510E, 0x8384, 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, + 0x5112, 0xC8E5, 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, + 0x838B, 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, 0x511F, + 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, 0x5123, 0x8397, + 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, 0x5127, 0x839B, 0x5128, + 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, 0x512B, 0x839F, 0x512C, 0x83A0, + 0x512D, 0x83A1, 0x512E, 0x83A2, 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, + 0x83A5, 0x5132, 0x83A6, 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, + 0x5136, 0x83AA, 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, + 0x83AE, 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, + 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, 0x5143, + 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, 0x5147, 0x83B4, + 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, 0x514B, 0xBFCB, 0x514C, + 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, 0x514F, 0x83B8, 0x5150, 0x83B9, + 0x5151, 0xB6D2, 0x5152, 0x83BA, 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, + 0xD9EE, 0x5156, 0xD9F0, 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, + 0x515A, 0xB5B3, 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, + 0x83C1, 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, 0x5167, + 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, 0x516B, 0xB0CB, + 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, 0x516F, 0x83CB, 0x5170, + 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, 0x5173, 0xB9D8, 0x5174, 0xD0CB, + 0x5175, 0xB1F8, 0x5176, 0xC6E4, 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, + 0xD7C8, 0x517A, 0x83CD, 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, + 0x517E, 0x83CE, 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, + 0xD8E7, 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, + 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, 0x518B, + 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, 0x518F, 0x83D7, + 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, 0x5193, 0x83DA, 0x5194, + 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, 0x5197, 0xC8DF, 0x5198, 0x83DC, + 0x5199, 0xD0B4, 0x519A, 0x83DD, 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, + 0x83DE, 0x519E, 0x83DF, 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, + 0x51A2, 0xDAA3, 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, + 0x83E3, 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, 0x51AF, + 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, 0x51B3, 0xBEF6, + 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, 0x51B7, 0xC0E4, 0x51B8, + 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, + 0x51BD, 0xD9FD, 0x51BE, 0x83EE, 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, + 0x83F0, 0x51C2, 0x83F1, 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, + 0x51C6, 0xD7BC, 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, + 0x83F5, 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, + 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, 0x51D3, + 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, 0x51D7, 0x83FE, + 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, 0x51DB, 0xC1DD, 0x51DC, + 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, 0x51DF, 0x8445, 0x51E0, 0xBCB8, + 0x51E1, 0xB7B2, 0x51E2, 0x8446, 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, + 0x8448, 0x51E6, 0x8449, 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, + 0x51EA, 0x844D, 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, + 0x844F, 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, 0x51F7, + 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, 0x51FB, 0xBBF7, + 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, 0x51FF, 0xD4E4, 0x5200, + 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, 0x5203, 0xC8D0, 0x5204, 0x8455, + 0x5205, 0x8456, 0x5206, 0xB7D6, 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, + 0x8457, 0x520A, 0xBFAF, 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, + 0x520E, 0xD8D8, 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, + 0xBBAE, 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, + 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, 0x521B, + 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, 0x521F, 0x8461, + 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, 0x5223, 0x8464, 0x5224, + 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, 0x5227, 0x8467, 0x5228, 0xC5D9, + 0x5229, 0xC0FB, 0x522A, 0x8468, 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, + 0xD8D9, 0x522E, 0xB9CE, 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, + 0x5232, 0x846C, 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, + 0xD6C6, 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, 0x523F, + 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, 0x5243, 0xCCEA, + 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, 0x5247, 0x8474, 0x5248, + 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, 0x524B, 0x8477, 0x524C, 0xD8DD, + 0x524D, 0xC7B0, 0x524E, 0x8478, 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, + 0xBDA3, 0x5252, 0x847A, 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, + 0x5256, 0xC6CA, 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, + 0x8481, 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, + 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, 0x5263, + 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, 0x5267, 0xBEE7, + 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, 0x526B, 0x848B, 0x526C, + 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, 0x526F, 0xB8B1, 0x5270, 0x848F, + 0x5271, 0x8490, 0x5272, 0xB8EE, 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, + 0x8493, 0x5276, 0x8494, 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, + 0x527A, 0x8498, 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, + 0x849B, 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, 0x5287, + 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, 0x528B, 0x84A4, + 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, 0x528F, 0x84A8, 0x5290, + 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, 0x5293, 0xD8E6, 0x5294, 0x84AB, + 0x5295, 0x84AC, 0x5296, 0x84AD, 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, + 0x84B0, 0x529A, 0x84B1, 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, + 0x529E, 0xB0EC, 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, + 0xDBBD, 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, + 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, 0x52AB, + 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, 0x52AF, 0x84B8, + 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, 0x52B3, 0xC0CD, 0x52B4, + 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, 0x52B7, 0x84BD, 0x52B8, 0x84BE, + 0x52B9, 0x84BF, 0x52BA, 0x84C0, 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, + 0x84C3, 0x52BE, 0xDBC0, 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, + 0x52C2, 0x84C6, 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, + 0x84C9, 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, 0x52CF, + 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, 0x52D3, 0x84D1, + 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, 0x52D7, 0x84D4, 0x52D8, + 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, 0x52DB, 0x84D7, 0x52DC, 0x84D8, + 0x52DD, 0x84D9, 0x52DE, 0x84DA, 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, + 0x84DC, 0x52E2, 0x84DD, 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, + 0x52E6, 0x84E0, 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, + 0x84E4, 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, + 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, 0x52F3, + 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, 0x52F7, 0x84F0, + 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, 0x52FB, 0x84F2, 0x52FC, + 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, 0x52FF, 0xCEF0, 0x5300, 0xD4C8, + 0x5301, 0x84F5, 0x5302, 0x84F6, 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, + 0xB0FC, 0x5306, 0xB4D2, 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, + 0x530A, 0x84FB, 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, + 0x84FE, 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, 0x5317, + 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, 0x531B, 0x8545, + 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, 0x531F, 0x8548, 0x5320, + 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, 0x5323, 0xCFBB, 0x5324, 0x854A, + 0x5325, 0x854B, 0x5326, 0xD8D0, 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, + 0x854E, 0x532A, 0xB7CB, 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, + 0x532E, 0xD8D1, 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, + 0x8555, 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, + 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, 0x533B, + 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, 0x533F, 0xC4E4, + 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, 0x5343, 0xC7A7, 0x5344, + 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, 0x5347, 0xC9FD, 0x5348, 0xCEE7, + 0x5349, 0xBBDC, 0x534A, 0xB0EB, 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, + 0x8564, 0x534E, 0xBBAA, 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, + 0x5352, 0xD7E4, 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, + 0xC2F4, 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, 0x535F, + 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, 0x5363, 0xD8D5, + 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, 0x5367, 0xCED4, 0x5368, + 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, 0x536B, 0xCEC0, 0x536C, 0x856E, + 0x536D, 0x856F, 0x536E, 0xD8B4, 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, + 0xCEA3, 0x5372, 0x8570, 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, + 0x5376, 0x8571, 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, + 0xDAE1, 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, + 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, 0x5383, + 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, 0x5387, 0x857A, + 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, 0x538B, 0xD1B9, 0x538C, + 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, 0x538F, 0x857E, 0x5390, 0x8580, + 0x5391, 0x8581, 0x5392, 0x8582, 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, + 0xB2DE, 0x5396, 0x8585, 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, + 0x539A, 0xBAF1, 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, + 0x858A, 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, 0x53A7, + 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, 0x53AB, 0x8590, + 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, 0x53AF, 0x8593, 0x53B0, + 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, 0x53B3, 0x8597, 0x53B4, 0x8598, + 0x53B5, 0x8599, 0x53B6, 0xDBCC, 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, + 0x859C, 0x53BA, 0x859D, 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, + 0x53BE, 0x85A0, 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, + 0xB2CE, 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, + 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, 0x53CB, + 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, 0x53CF, 0x85A8, + 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, 0x53D3, 0x85AB, 0x53D4, + 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, 0x53D7, 0xCADC, 0x53D8, 0xB1E4, + 0x53D9, 0xD0F0, 0x53DA, 0x85AD, 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, + 0x85AF, 0x53DE, 0x85B0, 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, + 0x53E2, 0x85B2, 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, + 0xC1ED, 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, 0x53EF, + 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, 0x53F3, 0xD3D2, + 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, 0x53F7, 0xBAC5, 0x53F8, + 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, + 0x53FD, 0xDFB4, 0x53FE, 0x85B6, 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, + 0xD3F5, 0x5402, 0x85B9, 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, + 0x5406, 0xDFBA, 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, + 0xB5F5, 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, + 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, 0x5413, + 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, 0x5417, 0xC2F0, + 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, 0x541B, 0xBEFD, 0x541C, + 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, 0x541F, 0xD2F7, 0x5420, 0xB7CD, + 0x5421, 0xDFC1, 0x5422, 0x85C2, 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, + 0x85C4, 0x5426, 0xB7F1, 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, + 0x542A, 0x85C5, 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, + 0xCBB1, 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, 0x5437, + 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, 0x543B, 0xCEC7, + 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, 0x543F, 0x85CC, 0x5440, + 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, 0x5443, 0xDFC0, 0x5444, 0x85CF, + 0x5445, 0x85D0, 0x5446, 0xB4F4, 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, + 0x85D2, 0x544A, 0xB8E6, 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, + 0x544E, 0x85D5, 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, + 0xDFBC, 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, + 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, 0x545B, + 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, 0x545F, 0x85DB, + 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, 0x5463, 0x85DE, 0x5464, + 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, 0x5467, 0x85E0, 0x5468, 0xD6DC, + 0x5469, 0x85E1, 0x546A, 0x85E2, 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, + 0x85E5, 0x546E, 0x85E6, 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, + 0x5472, 0xDFDA, 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, + 0xDFCE, 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, 0x547F, + 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, 0x5483, 0x85EF, + 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, 0x5487, 0x85F1, 0x5488, + 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, 0x548B, 0xD5A6, 0x548C, 0xBACD, + 0x548D, 0x85F5, 0x548E, 0xBECC, 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, + 0x85F6, 0x5492, 0xD6E4, 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, + 0x5496, 0xBFA7, 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, + 0xDFCB, 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, + 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, 0x54A3, + 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, 0x54A7, 0xDFD6, + 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, 0x54AB, 0xE5EB, 0x54AC, + 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, 0x54AF, 0xBFA9, 0x54B0, 0x8643, + 0x54B1, 0xD4DB, 0x54B2, 0x8644, 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, + 0x8645, 0x54B6, 0x8646, 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, + 0x54BA, 0x8649, 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, + 0x864B, 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, 0x54C7, + 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, 0x54CB, 0x864F, + 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, 0x54CF, 0xDFE7, 0x54D0, + 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, + 0x54D5, 0xDFDC, 0x54D6, 0x8650, 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, + 0xDFE0, 0x54DA, 0xDFE1, 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, + 0x54DE, 0xDFE8, 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, + 0x8655, 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, 0x54EB, + 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, 0x54EF, 0x865A, + 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, 0x54F3, 0xDFEE, 0x54F4, + 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, 0x54F7, 0x8660, 0x54F8, 0x8661, + 0x54F9, 0x8662, 0x54FA, 0xB2B8, 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, + 0xDFEC, 0x54FE, 0x8664, 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, + 0x5502, 0x8666, 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, + 0xCBF4, 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, 0x550F, + 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, 0x5513, 0x8671, + 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, 0x5517, 0x8674, 0x5518, + 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, 0x551B, 0xDFE9, 0x551C, 0x8678, + 0x551D, 0x8679, 0x551E, 0x867A, 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, + 0x867C, 0x5522, 0xDFEF, 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, + 0x5526, 0x867E, 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, + 0xDFF4, 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, + 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, 0x5533, + 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, 0x5537, 0xE0A1, + 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, 0x553B, 0x868B, 0x553C, + 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, 0x553F, 0xDFFC, 0x5540, 0x868D, + 0x5541, 0xDFFA, 0x5542, 0x868E, 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, + 0x868F, 0x5546, 0xC9CC, 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, + 0x554A, 0xB0A1, 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, + 0x8695, 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, 0x5557, + 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, 0x555B, 0x869F, + 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, 0x555F, 0x86A2, 0x5560, + 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, 0x5563, 0x86A5, 0x5564, 0xC6A1, + 0x5565, 0xC9B6, 0x5566, 0xC0B2, 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, + 0x86A7, 0x556A, 0xC5BE, 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, + 0x556E, 0xC4F6, 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, + 0x86AC, 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, + 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, 0x557B, + 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, 0x557F, 0x86B2, + 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, 0x5583, 0xE0AB, 0x5584, + 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, 0x5587, 0xC0AE, 0x5588, 0xE0AE, + 0x5589, 0xBAED, 0x558A, 0xBAB0, 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, + 0x86B6, 0x558E, 0x86B7, 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, + 0x5592, 0x86B9, 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, + 0x86BC, 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, 0x559F, + 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, 0x55A3, 0x86C4, + 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, 0x55A7, 0xD0FA, 0x55A8, + 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, 0x55AB, 0x86CB, 0x55AC, 0x86CC, + 0x55AD, 0x86CD, 0x55AE, 0x86CE, 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, + 0xE0AC, 0x55B2, 0x86D1, 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, + 0x55B6, 0x86D3, 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, + 0x86D5, 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, + 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, 0x55C3, + 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, 0x55C7, 0x86DD, + 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, 0x55CB, 0x86E0, 0x55CC, + 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, 0x55CF, 0x86E2, 0x55D0, 0x86E3, + 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, + 0x86E4, 0x55D6, 0xE0B2, 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, + 0x55DA, 0x86E8, 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, + 0x86EA, 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, 0x55E7, + 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, 0x55EB, 0xE0BF, + 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, 0x55EF, 0xE0C5, 0x55F0, + 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, 0x55F3, 0xE0C8, 0x55F4, 0x86F3, + 0x55F5, 0xE0CC, 0x55F6, 0x86F4, 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, + 0x86F6, 0x55FA, 0x86F7, 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, + 0x55FE, 0xE0D5, 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, + 0x86FB, 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, + 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, 0x560B, + 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, 0x560F, 0xD8C5, + 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, 0x5613, 0x8748, 0x5614, + 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, 0x5617, 0x874C, 0x5618, 0xD0EA, + 0x5619, 0x874D, 0x561A, 0x874E, 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, + 0x8750, 0x561E, 0xE0CF, 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, + 0x5622, 0x8753, 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, + 0x8755, 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, 0x562F, + 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, 0x5633, 0x875D, + 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, 0x5637, 0x875F, 0x5638, + 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, 0x563B, 0xCEFB, 0x563C, 0x8762, + 0x563D, 0x8763, 0x563E, 0x8764, 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, + 0x8766, 0x5642, 0x8767, 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, + 0x5646, 0x876B, 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, + 0x876F, 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, + 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, 0x5653, + 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, 0x5657, 0xE0DB, + 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, 0x565B, 0x8779, 0x565C, + 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, 0x565F, 0x877C, 0x5660, 0x877D, + 0x5661, 0x877E, 0x5662, 0xE0DE, 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, + 0x8781, 0x5666, 0x8782, 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, + 0x566A, 0xD4EB, 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, + 0x8785, 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, 0x5677, + 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, 0x567B, 0xE0E7, + 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, 0x567F, 0x8792, 0x5680, + 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, 0x5683, 0x8796, 0x5684, 0x8797, + 0x5685, 0xE0E9, 0x5686, 0xE0E3, 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, + 0x879A, 0x568A, 0x879B, 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, + 0x568E, 0xBABF, 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, + 0x87A1, 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, + 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, 0x569B, + 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, 0x569F, 0x87AD, + 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, 0x56A3, 0xCFF9, 0x56A4, + 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, 0x56A7, 0x87B4, 0x56A8, 0x87B5, + 0x56A9, 0x87B6, 0x56AA, 0x87B7, 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, + 0x87BA, 0x56AE, 0x87BB, 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, + 0x56B2, 0x87BE, 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, + 0x87C2, 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, 0x56BF, + 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, 0x56C3, 0x87CD, + 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, 0x56C7, 0x87D1, 0x56C8, + 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, 0x56CB, 0x87D4, 0x56CC, 0x87D5, + 0x56CD, 0x87D6, 0x56CE, 0x87D7, 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, + 0x87DA, 0x56D2, 0x87DB, 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, + 0x56D6, 0x87DE, 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, + 0xC7F4, 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, 0x56E3, + 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, 0x56E7, 0x87E5, + 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, 0x56EB, 0xE0F1, 0x56EC, + 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, 0x56EF, 0x87EB, 0x56F0, 0xC0A7, + 0x56F1, 0xB4D1, 0x56F2, 0x87EC, 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, + 0xE0F0, 0x56F6, 0x87EE, 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, + 0x56FA, 0xB9CC, 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, + 0xCDBC, 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, 0x5707, + 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, 0x570B, 0x87F8, + 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, 0x570F, 0x87FC, 0x5710, + 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, 0x5713, 0x8841, 0x5714, 0x8842, + 0x5715, 0x8843, 0x5716, 0x8844, 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, + 0x8847, 0x571A, 0x8848, 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, + 0x571E, 0x884B, 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, + 0x884E, 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, + 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, 0x572B, + 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, 0x572F, 0xDBDD, + 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, 0x5733, 0xDBDA, 0x5734, + 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, 0x5737, 0x8859, 0x5738, 0x885A, + 0x5739, 0xDBDB, 0x573A, 0xB3A1, 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, + 0x885C, 0x573E, 0xBBF8, 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, + 0x5742, 0xDBE0, 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, + 0x8862, 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, 0x574F, + 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, 0x5753, 0x8867, + 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, 0x5757, 0xBFE9, 0x5758, + 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, 0x575B, 0xCCB3, 0x575C, 0xDBDE, + 0x575D, 0xB0D3, 0x575E, 0xCEEB, 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, + 0xC6C2, 0x5762, 0x886D, 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, + 0x5766, 0xCCB9, 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, + 0xC6BA, 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, + 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, 0x5773, + 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, 0x5777, 0xBFC0, + 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, 0x577B, 0xDBE6, 0x577C, + 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, 0x577F, 0x887D, 0x5780, 0x887E, + 0x5781, 0x8880, 0x5782, 0xB4B9, 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, + 0xDBE2, 0x5786, 0xDBE4, 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, + 0x578A, 0x8884, 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, + 0x8886, 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, 0x5797, + 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, 0x579B, 0xB6E2, + 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, 0x579F, 0x8894, 0x57A0, + 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, + 0x57A5, 0x8895, 0x57A6, 0xBFD1, 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, + 0xDBD1, 0x57AA, 0x8897, 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, + 0x57AE, 0xBFE5, 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, + 0xDBEE, 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, + 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, 0x57BB, + 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, 0x57BF, 0x88A6, + 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, 0x57C3, 0xB0A3, 0x57C4, + 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, 0x57C7, 0x88AC, 0x57C8, 0x88AD, + 0x57C9, 0x88AE, 0x57CA, 0x88AF, 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, + 0x88B1, 0x57CE, 0xB3C7, 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, + 0x57D2, 0xDBF8, 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, + 0x88B5, 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, 0x57DF, + 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, 0x57E3, 0x88BC, + 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, 0x57E7, 0x88BF, 0x57E8, + 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, 0x57EB, 0x88C3, 0x57EC, 0x88C4, + 0x57ED, 0xDCA4, 0x57EE, 0x88C5, 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, + 0x88C7, 0x57F2, 0x88C8, 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, + 0x57F6, 0x88CB, 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, + 0xBBF9, 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, + 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, 0x5803, + 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, 0x5807, 0xDDC0, + 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, 0x580B, 0xDCA1, 0x580C, + 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, 0x580F, 0x88DA, 0x5810, 0x88DB, + 0x5811, 0xC7B5, 0x5812, 0x88DC, 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, + 0xB6E9, 0x5816, 0x88DF, 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, + 0x581A, 0x88E2, 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, + 0xDCA6, 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, 0x5827, + 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, 0x582B, 0x88EE, + 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, 0x582F, 0x88F2, 0x5830, + 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, 0x5833, 0x88F5, 0x5834, 0x88F6, + 0x5835, 0xB6C2, 0x5836, 0x88F7, 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, + 0x88FA, 0x583A, 0x88FB, 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, + 0x583E, 0x8940, 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, + 0x8944, 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, + 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, 0x584B, + 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, 0x584F, 0x894E, + 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, 0x5853, 0x8951, 0x5854, + 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, 0x5857, 0x8954, 0x5858, 0xCCC1, + 0x5859, 0x8955, 0x585A, 0x8956, 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, + 0x8959, 0x585E, 0xC8FB, 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, + 0x5862, 0x895D, 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, + 0x8960, 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, 0x586F, + 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, 0x5873, 0x896B, + 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, 0x5877, 0x896F, 0x5878, + 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, 0x587B, 0x8973, 0x587C, 0x8974, + 0x587D, 0x8975, 0x587E, 0xDBD3, 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, + 0xDCAC, 0x5882, 0x8977, 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, + 0x5886, 0x8979, 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, + 0x897C, 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, + 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, 0x5893, + 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, 0x5897, 0x8988, + 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, 0x589B, 0x898A, 0x589C, + 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, 0x589F, 0xD0E6, 0x58A0, 0x898D, + 0x58A1, 0x898E, 0x58A2, 0x898F, 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, + 0x8992, 0x58A6, 0x8993, 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, + 0x58AA, 0x8995, 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, + 0x8999, 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, 0x58B7, + 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, 0x58BB, 0x89A6, + 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, 0x58BF, 0x89A9, 0x58C0, + 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, 0x58C3, 0x89AC, 0x58C4, 0x89AD, + 0x58C5, 0xDBD5, 0x58C6, 0x89AE, 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, + 0x89B1, 0x58CA, 0x89B2, 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, + 0x58CE, 0x89B6, 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, + 0x89B9, 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, + 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, 0x58DB, + 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, 0x58DF, 0x89C5, + 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, 0x58E3, 0x89C9, 0x58E4, + 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, 0x58E7, 0x89CC, 0x58E8, 0x89CD, + 0x58E9, 0x89CE, 0x58EA, 0x89CF, 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, + 0x89D0, 0x58EE, 0xD7B3, 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, + 0x58F2, 0x89D3, 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, + 0xBAF8, 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, 0x58FF, + 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, 0x5903, 0x89E0, + 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, 0x5907, 0xB1B8, 0x5908, + 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, 0x590B, 0x89E6, 0x590C, 0x89E7, + 0x590D, 0xB8B4, 0x590E, 0x89E8, 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, + 0x89EA, 0x5912, 0x89EB, 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, + 0x5916, 0xCDE2, 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, + 0xB6E0, 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, + 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, 0x5923, + 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, 0x5927, 0xB4F3, + 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, 0x592B, 0xB7F2, 0x592C, + 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, 0x592F, 0xBABB, 0x5930, 0x89F9, + 0x5931, 0xCAA7, 0x5932, 0x89FA, 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, + 0x89FC, 0x5936, 0x89FD, 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, + 0x593A, 0xB6E1, 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, + 0x8A41, 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, 0x5947, + 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, 0x594B, 0xB7DC, + 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, 0x594F, 0xD7E0, 0x5950, + 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, 0x5953, 0x8A4C, 0x5954, 0xB1BC, + 0x5955, 0xDEC8, 0x5956, 0xBDB1, 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, + 0x8A4D, 0x595A, 0xDEC9, 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, + 0x595E, 0x8A51, 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, + 0xC9DD, 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, + 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, 0x596B, + 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, 0x596F, 0x8A5F, + 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, 0x5973, 0xC5AE, 0x5974, + 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, 0x5977, 0x8A64, 0x5978, 0xBCE9, + 0x5979, 0xCBFD, 0x597A, 0x8A65, 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, + 0xBAC3, 0x597E, 0x8A68, 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, + 0x5982, 0xC8E7, 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, + 0xD7B1, 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, 0x598F, + 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, 0x5993, 0xBCCB, + 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, 0x5997, 0xE6A1, 0x5998, + 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, 0x599B, 0x8A77, 0x599C, 0x8A78, + 0x599D, 0x8A79, 0x599E, 0xE6A4, 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, + 0x8A7C, 0x59A2, 0x8A7D, 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, + 0x59A6, 0x8A7E, 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, + 0xE5FD, 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, 0x59B3, + 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, 0x59B7, 0x8A89, + 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, 0x59BB, 0xC6DE, 0x59BC, + 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, + 0x59C1, 0x8A90, 0x59C2, 0x8A91, 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, + 0x8A94, 0x59C6, 0xC4B7, 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, + 0x59CA, 0xE6A2, 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, + 0x8A9A, 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, 0x59D7, + 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, 0x59DB, 0x8A9F, + 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, 0x59DF, 0x8AA1, 0x59E0, + 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, + 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, + 0x8AA8, 0x59EA, 0x8AA9, 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, + 0x59EE, 0x8AAC, 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, + 0x8AB0, 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, + 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, 0x59FB, + 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, 0x59FF, 0xD7CB, + 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, 0x5A03, 0xCDDE, 0x5A04, + 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, + 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, + 0x8ABF, 0x5A0E, 0x8AC0, 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, + 0x5A12, 0x8AC3, 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, + 0x8AC6, 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, 0x5A1F, + 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, 0x5A23, 0xE6B7, + 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, 0x5A27, 0x8AD1, 0x5A28, + 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, + 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, + 0xD3E9, 0x5A32, 0xE6B4, 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, + 0x5A36, 0xC8A2, 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, + 0x8ADF, 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, + 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, 0x5A43, + 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, 0x5A47, 0x8AE9, + 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, 0x5A4B, 0x8AEB, 0x5A4C, + 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, + 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, + 0xE6BC, 0x5A56, 0x8AF5, 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, + 0x5A5A, 0xBBE9, 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, + 0x8AFC, 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, 0x5A67, + 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, 0x5A6B, 0x8B47, + 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, 0x5A6F, 0x8B4B, 0x5A70, + 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, + 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, + 0x8B51, 0x5A7A, 0xE6C4, 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, + 0x5A7E, 0x8B55, 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, + 0x8B58, 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, + 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, 0x5A8B, + 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, 0x5A8F, 0x8B65, + 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, 0x5A93, 0x8B68, 0x5A94, + 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, + 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, + 0x8B70, 0x5A9E, 0x8B71, 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, + 0x5AA2, 0x8B75, 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, + 0x8B79, 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, 0x5AAF, + 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, 0x5AB3, 0xCFB1, + 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, 0x5AB7, 0x8B87, 0x5AB8, + 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, + 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, + 0xBCDE, 0x5AC2, 0xC9A9, 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, + 0x5AC6, 0x8B92, 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, + 0x8B95, 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, + 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, 0x5AD3, + 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, 0x5AD7, 0x8B9E, + 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, 0x5ADB, 0x8BA1, 0x5ADC, + 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, + 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, + 0x8BA7, 0x5AE6, 0xE6CF, 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, + 0x5AEA, 0x8BAA, 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, + 0x8BAD, 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, 0x5AF7, + 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, 0x5AFB, 0x8BB9, + 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, 0x5AFF, 0x8BBD, 0x5B00, + 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, + 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, + 0xE6D2, 0x5B0A, 0x8BC7, 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, + 0x5B0E, 0x8BCB, 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, + 0x8BCF, 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, 0x5B1B, + 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, 0x5B1F, 0x8BDA, + 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, 0x5B23, 0x8BDE, 0x5B24, + 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, + 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, + 0x8BE8, 0x5B2E, 0x8BE9, 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, + 0x5B32, 0xE6D5, 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, + 0x8BEF, 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, 0x5B3F, + 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, 0x5B43, 0x8BFA, + 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, 0x5B47, 0x8BFE, 0x5B48, + 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, + 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, + 0xE6DD, 0x5B52, 0x8C48, 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, + 0x5B56, 0x8C49, 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, + 0xE6DA, 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, + 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, 0x5B63, + 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, 0x5B67, 0x8C4D, + 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, 0x5B6B, 0x8C4F, 0x5B6C, + 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, + 0x5B71, 0xE5EE, 0x5B72, 0x8C53, 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, + 0xB7F5, 0x5B76, 0x8C55, 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, + 0x5B7A, 0xC8E6, 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, + 0x8C5B, 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, 0x5B87, + 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, 0x5B8B, 0xCBCE, + 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, 0x5B8F, 0xBAEA, 0x5B90, + 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, 0x5B93, 0xE5B5, 0x5B94, 0x8C65, + 0x5B95, 0xE5B4, 0x5B96, 0x8C66, 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, + 0xD6E6, 0x5B9A, 0xB6A8, 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, + 0x5B9E, 0xCAB5, 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, + 0xBFCD, 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, + 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, 0x5BAB, + 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, 0x5BAF, 0x8C6E, + 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, 0x5BB3, 0xBAA6, 0x5BB4, + 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, + 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, + 0xBFED, 0x5BBE, 0xB1F6, 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, + 0x5BC2, 0xBCC5, 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, + 0xC3DC, 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, 0x5BCF, + 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, 0x5BD3, 0xD4A2, + 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, 0x5BD7, 0x8C84, 0x5BD8, + 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, + 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, + 0xB9D1, 0x5BE2, 0x8C8B, 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, + 0x5BE6, 0x8C8D, 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, + 0x8C90, 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, + 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, 0x5BF3, + 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, 0x5BF7, 0x8C9B, + 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, 0x5BFB, 0xD1B0, 0x5BFC, + 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, + 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, + 0x8CA1, 0x5C06, 0xBDAB, 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, + 0x5C0A, 0xD7F0, 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, + 0x8CA7, 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, 0x5C17, + 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, 0x5C1B, 0x8CAD, + 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, 0x5C1F, 0x8CAF, 0x5C20, + 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, + 0x5C25, 0xDECD, 0x5C26, 0x8CB3, 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, + 0x8CB5, 0x5C2A, 0x8CB6, 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, + 0x5C2E, 0x8CB9, 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, + 0x8CBC, 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, + 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, 0x5C3B, + 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, 0x5C3F, 0xC4F2, + 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, 0x5C43, 0x8CC1, 0x5C44, + 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, + 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, + 0x8CC6, 0x5C4E, 0xCABA, 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, + 0x5C52, 0x8CC7, 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, + 0x8CCA, 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, 0x5C5F, + 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, 0x5C63, 0xE5EF, + 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, 0x5C67, 0x8CD4, 0x5C68, + 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, + 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, + 0xC9BD, 0x5C72, 0x8CDC, 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, + 0x5C76, 0x8CE0, 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, + 0xE1A8, 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, + 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, 0x5C83, + 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, 0x5C87, 0x8CEC, + 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, 0x5C8B, 0x8CEF, 0x5C8C, + 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, + 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, + 0x8CF4, 0x5C96, 0xE1AB, 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, + 0x5C9A, 0xE1B0, 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, + 0x8CF6, 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, 0x5CA7, + 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, 0x5CAB, 0xE1B6, + 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, 0x5CAF, 0x8D42, 0x5CB0, + 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, + 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, + 0x8D47, 0x5CBA, 0x8D48, 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, + 0x5CBE, 0x8D4B, 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, + 0x8D4D, 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, + 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, 0x5CCB, + 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, 0x5CCF, 0x8D58, + 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, 0x5CD3, 0x8D5B, 0x5CD4, + 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, + 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, + 0x8D64, 0x5CDE, 0x8D65, 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, + 0x5CE2, 0x8D68, 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, + 0xC2CD, 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, 0x5CEF, + 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, 0x5CF3, 0x8D72, + 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, 0x5CF7, 0x8D76, 0x5CF8, + 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, + 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, + 0x8D80, 0x5D02, 0xE1C0, 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, + 0x5D06, 0xE1C7, 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, + 0x8D85, 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, + 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, 0x5D13, + 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, 0x5D17, 0x8D8F, + 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, 0x5D1B, 0xE1C8, 0x5D1C, + 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, 0x5D1F, 0x8D95, 0x5D20, 0x8D96, + 0x5D21, 0x8D97, 0x5D22, 0x8D98, 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, + 0x8D9A, 0x5D26, 0xE1C3, 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, + 0x5D2A, 0x8D9C, 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, + 0xE1C4, 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, 0x5D37, + 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, 0x5D3B, 0x8DAA, + 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, 0x5D3F, 0x8DAC, 0x5D40, + 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, + 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, + 0x8DB5, 0x5D4A, 0xE1D3, 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, + 0x5D4E, 0x8DB7, 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, + 0x8DBB, 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, + 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, 0x5D5B, + 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, 0x5D5F, 0x8DC5, + 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, 0x5D63, 0x8DC9, 0x5D64, + 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, + 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, + 0x8DD0, 0x5D6E, 0x8DD1, 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, + 0x5D72, 0x8DD4, 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, + 0x8DD7, 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, 0x5D7F, + 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, 0x5D83, 0x8DE3, + 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, 0x5D87, 0x8DE7, 0x5D88, + 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, + 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, + 0x8DF1, 0x5D92, 0x8DF2, 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, + 0x5D96, 0x8DF6, 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, + 0x8DF9, 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, + 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, 0x5DA3, + 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, 0x5DA7, 0x8E46, + 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, 0x5DAB, 0x8E4A, 0x5DAC, + 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, + 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, + 0x8E54, 0x5DB6, 0x8E55, 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, + 0x5DBA, 0x8E58, 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, + 0x8E5C, 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, 0x5DC7, + 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, 0x5DCB, 0x8E68, + 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, 0x5DCF, 0x8E6B, 0x5DD0, + 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, + 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, + 0x8E75, 0x5DDA, 0x8E76, 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, + 0x5DDE, 0xD6DD, 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, + 0xB3B2, 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, 0x5DEB, + 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, 0x5DEF, 0xDBCF, + 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, 0x5DF3, 0xCBC8, 0x5DF4, + 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, + 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, + 0xD9E3, 0x5DFE, 0xBDED, 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, + 0x5E02, 0xCAD0, 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, + 0xB7AB, 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, 0x5E0F, + 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, 0x5E13, 0x8E92, + 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, 0x5E17, 0x8E93, 0x5E18, + 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, + 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, + 0x8E97, 0x5E22, 0x8E98, 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, + 0x5E26, 0xB4F8, 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, + 0x8E9E, 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, + 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, 0x5E33, + 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, 0x5E37, 0xE1A1, + 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, 0x5E3B, 0xE0FD, 0x5E3C, + 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, + 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, + 0xB7F9, 0x5E46, 0x8EAF, 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, + 0x5E4A, 0x8EB3, 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, + 0x8EB6, 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, 0x5E57, + 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, 0x5E5B, 0xE1A4, + 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, 0x5E5F, 0x8EC3, 0x5E60, + 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, + 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, + 0x8ECB, 0x5E6A, 0x8ECC, 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, + 0x5E6E, 0x8ED0, 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, + 0xB8C9, 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, + 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, 0x5E7B, + 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, 0x5E7F, 0xB9E3, + 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, 0x5E83, 0x8EDA, 0x5E84, + 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, + 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, + 0x8EDF, 0x5E8E, 0x8EE0, 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, + 0x5E92, 0x8EE1, 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, + 0xE2D2, 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, 0x5E9F, + 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, 0x5EA3, 0x8EE7, + 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, 0x5EA7, 0xD7F9, 0x5EA8, + 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, + 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, + 0x8EF1, 0x5EB2, 0x8EF2, 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, + 0x5EB6, 0xCAFC, 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, + 0x8EF4, 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, + 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, 0x5EC3, + 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, 0x5EC7, 0x8F41, + 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, 0x5ECB, 0x8F43, 0x5ECC, + 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, + 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, + 0x8F4A, 0x5ED6, 0xC1CE, 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, + 0x5EDA, 0x8F4E, 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, + 0x8F51, 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, 0x5EE7, + 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, 0x5EEB, 0x8F5C, + 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, 0x5EEF, 0x8F60, 0x5EF0, + 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, + 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, + 0x8F67, 0x5EFA, 0xBDA8, 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, + 0x5EFE, 0xDEC3, 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, + 0xD2EC, 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, + 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, 0x5F0B, + 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, 0x5F0F, 0xCABD, + 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, 0x5F13, 0xB9AD, 0x5F14, + 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, + 0x5F19, 0x8F76, 0x5F1A, 0x8F77, 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, + 0x8F79, 0x5F1E, 0x8F7A, 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, + 0x5F22, 0x8F7C, 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, + 0xCFD2, 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, 0x5F2F, + 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, 0x5F33, 0x8F86, + 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, 0x5F37, 0x8F8A, 0x5F38, + 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, + 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, + 0x8F90, 0x5F42, 0x8F91, 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, + 0x5F46, 0x8F95, 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, + 0x8F99, 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, + 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, 0x5F53, + 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, 0x5F57, 0xE5E7, + 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, 0x5F5B, 0x8FA3, 0x5F5C, + 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, + 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, + 0x8FA9, 0x5F66, 0xD1E5, 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, + 0x5F6A, 0xB1EB, 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, + 0x8FAD, 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, 0x5F77, + 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, 0x5F7B, 0xB3B9, + 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, 0x5F7F, 0x8FB7, 0x5F80, + 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, + 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, + 0xE1E0, 0x5F8A, 0xBBB2, 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, + 0x5F8E, 0x8FBB, 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, + 0xCDBD, 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, + 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, 0x5F9B, + 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, 0x5F9F, 0x8FC5, + 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, 0x5FA3, 0x8FC8, 0x5FA4, + 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, + 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, + 0xE1E6, 0x5FAE, 0xCEA2, 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, + 0x5FB2, 0x8FD3, 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, + 0x8FD6, 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, 0x5FBF, + 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, 0x5FC3, 0xD0C4, + 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, 0x5FC7, 0x8FE0, 0x5FC8, + 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, + 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, + 0xECFD, 0x5FD2, 0xDFAF, 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, + 0x5FD6, 0xE2E2, 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, + 0x8FE8, 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, + 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, 0x5FE3, + 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, 0x5FE7, 0xD3C7, + 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, 0x5FEB, 0xBFEC, 0x5FEC, + 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, + 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, + 0xC4EE, 0x5FF6, 0x8FF9, 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, + 0x5FFA, 0x8FFC, 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, + 0xE2E9, 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, 0x6007, + 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, 0x600B, 0x9042, + 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, 0x600F, 0xE2F3, 0x6010, + 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, 0x6013, 0x9046, 0x6014, 0xD5FA, + 0x6015, 0xC5C2, 0x6016, 0xB2C0, 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, + 0xE2EF, 0x601A, 0x9049, 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, + 0x601E, 0x904A, 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, + 0x904C, 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, + 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, 0x602B, + 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, 0x602F, 0xC7D3, + 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, 0x6033, 0x9055, 0x6034, + 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, 0x6037, 0x9058, 0x6038, 0x9059, + 0x6039, 0x905A, 0x603A, 0x905B, 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, + 0x905C, 0x603E, 0x905D, 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, + 0x6042, 0xE2FE, 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, + 0x9061, 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, 0x604F, + 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, 0x6053, 0x906A, + 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, 0x6057, 0x906D, 0x6058, + 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, 0x605B, 0x906F, 0x605C, 0x9070, + 0x605D, 0xEDA2, 0x605E, 0x9071, 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, + 0x9074, 0x6062, 0xBBD6, 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, + 0x6066, 0x9076, 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, + 0xE3A1, 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, + 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, 0x6073, + 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, 0x6077, 0x907C, + 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, 0x607B, 0xE2FC, 0x607C, + 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, 0x607F, 0xD3C1, 0x6080, 0x907E, + 0x6081, 0x9080, 0x6082, 0x9081, 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, + 0x9082, 0x6086, 0x9083, 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, + 0x608A, 0x9086, 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, + 0x9088, 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, 0x6097, + 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, 0x609B, 0xE3AA, + 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, 0x609F, 0xCEF2, 0x60A0, + 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, 0x60A3, 0xBBBC, 0x60A4, 0x9095, + 0x60A5, 0x9096, 0x60A6, 0xD4C3, 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, + 0x9098, 0x60AA, 0x9099, 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, + 0x60AE, 0x909A, 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, + 0xB1AF, 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, + 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, 0x60BB, + 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, 0x60BF, 0x90A4, + 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, 0x60C3, 0x90A8, 0x60C4, + 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, 0x60C7, 0x90AA, 0x60C8, 0x90AB, + 0x60C9, 0x90AC, 0x60CA, 0xBEAA, 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, + 0x90AE, 0x60CE, 0x90AF, 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, + 0x60D2, 0x90B2, 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, + 0x90B5, 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, 0x60DF, + 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, 0x60E3, 0x90BC, + 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, 0x60E7, 0xBEE5, 0x60E8, + 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, + 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, + 0x90C0, 0x60F2, 0x90C1, 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, + 0x60F6, 0xBBCC, 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, + 0xD0CA, 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, + 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, 0x6103, + 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, 0x6107, 0x90CE, + 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, 0x610B, 0x90D0, 0x610C, + 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, 0x610F, 0xD2E2, 0x6110, 0x90D2, + 0x6111, 0x90D3, 0x6112, 0x90D4, 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, + 0xE3B5, 0x6116, 0x90D7, 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, + 0x611A, 0xD3DE, 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, + 0x90DE, 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, 0x6127, + 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, 0x612B, 0xE3BA, + 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, 0x612F, 0x90E8, 0x6130, + 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, 0x6133, 0x90EC, 0x6134, 0x90ED, + 0x6135, 0x90EE, 0x6136, 0x90EF, 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, + 0x90F2, 0x613A, 0x90F3, 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, + 0x613E, 0x90F7, 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, + 0x90FA, 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, + 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, 0x614B, + 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, 0x614F, 0x9144, + 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, 0x6153, 0x9147, 0x6154, + 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, 0x6157, 0x914A, 0x6158, 0x914B, + 0x6159, 0x914C, 0x615A, 0x914D, 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, + 0xEDAB, 0x615E, 0x9150, 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, + 0x6162, 0xC2FD, 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, + 0x9157, 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, 0x616F, + 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, 0x6173, 0x9161, + 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, 0x6177, 0xBFB6, 0x6178, + 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, 0x617B, 0x9167, 0x617C, 0x9168, + 0x617D, 0x9169, 0x617E, 0x916A, 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, + 0x916D, 0x6182, 0x916E, 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, + 0x6186, 0x9172, 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, + 0x9176, 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, + 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, 0x6193, + 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, 0x6197, 0x9181, + 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, 0x619B, 0x9185, 0x619C, + 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, 0x619F, 0x9188, 0x61A0, 0x9189, + 0x61A1, 0x918A, 0x61A2, 0x918B, 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, + 0x918E, 0x61A6, 0x918F, 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, + 0x61AA, 0x9190, 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, + 0x9193, 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, 0x61B7, + 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, 0x61BB, 0x919F, + 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, 0x61BF, 0x91A2, 0x61C0, + 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, 0x61C3, 0x91A5, 0x61C4, 0x91A6, + 0x61C5, 0x91A7, 0x61C6, 0x91A8, 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, + 0x91AA, 0x61CA, 0xB0C3, 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, + 0x61CE, 0x91AD, 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, + 0xC0C1, 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, + 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, 0x61DB, + 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, 0x61DF, 0x91BB, + 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, 0x61E3, 0x91BF, 0x61E4, + 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, 0x61E7, 0x91C2, 0x61E8, 0x91C3, + 0x61E9, 0x91C4, 0x61EA, 0x91C5, 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, + 0x91C8, 0x61EE, 0x91C9, 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, + 0x61F2, 0x91CD, 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, + 0x91D0, 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, 0x61FF, + 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, 0x6203, 0x91DC, + 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, 0x6207, 0x91DF, 0x6208, + 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, 0x620B, 0xEAA7, 0x620C, 0xD0E7, + 0x620D, 0xCAF9, 0x620E, 0xC8D6, 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, + 0xCED2, 0x6212, 0xBDE4, 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, + 0x6216, 0xBBF2, 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, + 0xC6DD, 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, + 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, 0x6223, + 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, 0x6227, 0x91EA, + 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, 0x622B, 0x91ED, 0x622C, + 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, 0x622F, 0x91EF, 0x6230, 0x91F0, + 0x6231, 0x91F1, 0x6232, 0x91F2, 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, + 0x91F3, 0x6236, 0x91F4, 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, + 0x623A, 0x91F7, 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, + 0xECE5, 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, 0x6247, + 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, 0x624B, 0xCAD6, + 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, 0x624F, 0x9240, 0x6250, + 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, 0x6253, 0xB4F2, 0x6254, 0xC8D3, + 0x6255, 0x9242, 0x6256, 0x9243, 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, + 0x9245, 0x625A, 0x9246, 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, + 0x625E, 0x9249, 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, + 0x924D, 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, + 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, 0x626B, + 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, 0x626F, 0xB3B6, + 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, 0x6273, 0xB0E2, 0x6274, + 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, 0x6277, 0x9255, 0x6278, 0x9256, + 0x6279, 0xC5FA, 0x627A, 0x9257, 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, + 0x9259, 0x627E, 0xD5D2, 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, + 0x6282, 0x925B, 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, + 0x925E, 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, 0x628F, + 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, 0x6293, 0xD7A5, + 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, 0x6297, 0xBFB9, 0x6298, + 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, 0x629B, 0xC5D7, 0x629C, 0x9269, + 0x629D, 0x926A, 0x629E, 0x926B, 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, + 0xC2D5, 0x62A2, 0xC7C0, 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, + 0x62A6, 0x926D, 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, + 0x9270, 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, + 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, 0x62B3, + 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, 0x62B7, 0x9279, + 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, 0x62BB, 0xDED3, 0x62BC, + 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, 0x62BF, 0xC3F2, 0x62C0, 0x927D, + 0x62C1, 0x927E, 0x62C2, 0xB7F7, 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, + 0xB5A3, 0x62C6, 0xB2F0, 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, + 0x62CA, 0xDED4, 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, + 0xC1E0, 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, 0x62D7, + 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, 0x62DB, 0xD5D0, + 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, 0x62DF, 0xC4E2, 0x62E0, + 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, 0x62E3, 0xBCF0, 0x62E4, 0x9289, + 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, + 0xD4F1, 0x62EA, 0x928A, 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, + 0x62EE, 0xDED7, 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, + 0x928D, 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, 0x62FB, + 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, 0x62FF, 0xC4C3, + 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, 0x6303, 0x9294, 0x6304, + 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, 0x6307, 0xD6B8, 0x6308, 0xEAFC, + 0x6309, 0xB0B4, 0x630A, 0x9298, 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, + 0x929B, 0x630E, 0xBFE6, 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, + 0x6312, 0x929E, 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, + 0xCDDA, 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, 0x631F, + 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, 0x6323, 0xD5F5, + 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, 0x6327, 0x92A7, 0x6328, + 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, 0x632B, 0xB4EC, 0x632C, 0x92A9, + 0x632D, 0x92AA, 0x632E, 0x92AB, 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, + 0x92AD, 0x6332, 0xEAFD, 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, + 0x6336, 0x92B1, 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, + 0xCDA6, 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, + 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, 0x6343, + 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, 0x6347, 0x92BB, + 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, 0x634B, 0xDEDB, 0x634C, + 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, 0x634F, 0xC4F3, 0x6350, 0xBEE8, + 0x6351, 0x92BE, 0x6352, 0x92BF, 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, + 0xB2B6, 0x6356, 0x92C2, 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, + 0x635A, 0x92C6, 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, + 0xC0CC, 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, 0x6367, + 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, 0x636B, 0x92D0, + 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, 0x636F, 0x92D2, 0x6370, + 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, 0x6373, 0x92D5, 0x6374, 0x92D6, + 0x6375, 0x92D7, 0x6376, 0xB4B7, 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, + 0x92D9, 0x637A, 0xDEE0, 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, + 0x637E, 0x92DC, 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, + 0xB5E0, 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, + 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, 0x638B, + 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, 0x638F, 0xCCCD, + 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, 0x6393, 0x92E6, 0x6394, + 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, 0x6397, 0x92E9, 0x6398, 0xBEF2, + 0x6399, 0x92EA, 0x639A, 0x92EB, 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, + 0x92EE, 0x639E, 0x92EF, 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, + 0x63A2, 0xCCBD, 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, + 0x92F3, 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, 0x63AF, + 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, 0x63B3, 0xC2B0, + 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, 0x63B7, 0xD6C0, 0x63B8, + 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, 0x63BB, 0x92FB, 0x63BC, 0xDEE8, + 0x63BD, 0x92FC, 0x63BE, 0xDEF2, 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, + 0x9340, 0x63C2, 0x9341, 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, + 0x63C6, 0xDEF1, 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, + 0x9346, 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, 0x63D3, + 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, 0x63D7, 0x934D, + 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, 0x63DB, 0x9351, 0x63DC, + 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, 0x63DF, 0x9354, 0x63E0, 0xDEEB, + 0x63E1, 0xCED5, 0x63E2, 0x9355, 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, + 0x9357, 0x63E6, 0x9358, 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, + 0x63EA, 0xBEBE, 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, + 0x935D, 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, 0x63F7, + 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, 0x63FB, 0x9366, + 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, 0x63FF, 0xDEEC, 0x6400, + 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, 0x6403, 0x9369, 0x6404, 0x936A, + 0x6405, 0xBDC1, 0x6406, 0x936B, 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, + 0x936E, 0x640A, 0x936F, 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, + 0x640E, 0x9371, 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, + 0x9373, 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, + 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, 0x641B, + 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, 0x641F, 0x937B, + 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, 0x6423, 0x937D, 0x6424, + 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, 0x6427, 0x9381, 0x6428, 0x9382, + 0x6429, 0x9383, 0x642A, 0xCCC2, 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, + 0xB4EE, 0x642E, 0x9385, 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, + 0x6432, 0x9389, 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, + 0x938C, 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, 0x643F, + 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, 0x6443, 0x9395, + 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, 0x6447, 0xD2A1, 0x6448, + 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, 0x644B, 0x9397, 0x644C, 0x9398, + 0x644D, 0x9399, 0x644E, 0x939A, 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, + 0x939D, 0x6452, 0xDEF0, 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, + 0x6456, 0x93A0, 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, + 0x93A3, 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, + 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, 0x6463, + 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, 0x6467, 0xB4DD, + 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, 0x646B, 0x93B1, 0x646C, + 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, 0x646F, 0x93B4, 0x6470, 0x93B5, + 0x6471, 0x93B6, 0x6472, 0x93B7, 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, + 0x93BA, 0x6476, 0x93BB, 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, + 0x647A, 0xDFA1, 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, + 0x93C0, 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, 0x6487, + 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, 0x648B, 0x93C9, + 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, 0x648F, 0x93CD, 0x6490, + 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, 0x6493, 0x93CF, 0x6494, 0x93D0, + 0x6495, 0xCBBA, 0x6496, 0xDEFE, 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, + 0xDFA4, 0x649A, 0x93D3, 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, + 0x649E, 0xD7B2, 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, + 0x93DA, 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, + 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, 0x64AB, + 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, 0x64AF, 0x93E2, + 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, 0x64B3, 0x93E5, 0x64B4, + 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, + 0x64B9, 0x93E8, 0x64BA, 0xDFA5, 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, + 0x93EA, 0x64BE, 0x93EB, 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, + 0x64C2, 0xC0DE, 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, + 0x93F0, 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, 0x64CF, + 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, 0x64D3, 0x93F9, + 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, 0x64D7, 0xDFA8, 0x64D8, + 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, 0x64DB, 0x9440, 0x64DC, 0x9441, + 0x64DD, 0x9442, 0x64DE, 0xCBD3, 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, + 0x9445, 0x64E2, 0xDFAA, 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, + 0x64E6, 0xB2C1, 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, + 0x944B, 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, + 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, 0x64F3, + 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, 0x64F7, 0x9458, + 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, 0x64FB, 0x945C, 0x64FC, + 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, 0x64FF, 0x9460, 0x6500, 0xC5CA, + 0x6501, 0x9461, 0x6502, 0x9462, 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, + 0x9465, 0x6506, 0x9466, 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, + 0x650A, 0x9469, 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, + 0x946D, 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, 0x6517, + 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, 0x651B, 0x9478, + 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, 0x651F, 0x947C, 0x6520, + 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, 0x6523, 0x9481, 0x6524, 0x9482, + 0x6525, 0xDFAC, 0x6526, 0x9483, 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, + 0x9486, 0x652A, 0x9487, 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, + 0x652E, 0xDFAD, 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, + 0x948C, 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, + 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, 0x653B, + 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, 0x653F, 0xD5FE, + 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, 0x6543, 0x9495, 0x6544, + 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, 0x6547, 0x9498, 0x6548, 0xD0A7, + 0x6549, 0xF4CD, 0x654A, 0x9499, 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, + 0x949B, 0x654E, 0x949C, 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, + 0x6552, 0x949E, 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, + 0xB0BD, 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, 0x655F, + 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, 0x6563, 0xC9A2, + 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, 0x6567, 0x94AA, 0x6568, + 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, 0x656B, 0xEBB8, 0x656C, 0xBEB4, + 0x656D, 0x94AE, 0x656E, 0x94AF, 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, + 0x94B1, 0x6572, 0xC7C3, 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, + 0x6576, 0x94B4, 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, + 0x94B7, 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, + 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, 0x6583, + 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, 0x6587, 0xCEC4, + 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, 0x658B, 0xD5AB, 0x658C, + 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, 0x658F, 0x94C9, 0x6590, 0xECB3, + 0x6591, 0xB0DF, 0x6592, 0x94CA, 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, + 0x94CC, 0x6596, 0x94CD, 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, + 0x659A, 0x94CF, 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, + 0x94D1, 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, 0x65A7, + 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, 0x65AB, 0xEDBD, + 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, 0x65AF, 0xCBB9, 0x65B0, + 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, 0x65B3, 0x94DC, 0x65B4, 0x94DD, + 0x65B5, 0x94DE, 0x65B6, 0x94DF, 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, + 0xB7BD, 0x65BA, 0x94E2, 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, + 0x65BE, 0x94E4, 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, + 0x94E7, 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, + 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, 0x65CB, + 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, 0x65CF, 0xD7E5, + 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, 0x65D3, 0x94EF, 0x65D4, + 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, 0x65D7, 0xC6EC, 0x65D8, 0x94F2, + 0x65D9, 0x94F3, 0x65DA, 0x94F4, 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, + 0x94F7, 0x65DE, 0x94F8, 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, + 0x65E2, 0xBCC8, 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, + 0xB5A9, 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, 0x65EF, + 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, 0x65F3, 0x9541, + 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, 0x65F7, 0xBFF5, 0x65F8, + 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, 0x65FB, 0x9546, 0x65FC, 0x9547, + 0x65FD, 0x9548, 0x65FE, 0x9549, 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, + 0x954B, 0x6602, 0xB0BA, 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, + 0x6606, 0xC0A5, 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, + 0xEABB, 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, + 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, 0x6613, + 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, 0x6617, 0x9557, + 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, 0x661B, 0x955A, 0x661C, + 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, 0x661F, 0xD0C7, 0x6620, 0xD3B3, + 0x6621, 0x955D, 0x6622, 0x955E, 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, + 0xB4BA, 0x6626, 0x9561, 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, + 0x662A, 0x9563, 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, + 0x9566, 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, 0x6637, + 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, 0x663B, 0x956E, + 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, 0x663F, 0x9570, 0x6640, + 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, 0x6643, 0xBBCE, 0x6644, 0x9573, + 0x6645, 0x9574, 0x6646, 0x9575, 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, + 0x9578, 0x664A, 0x9579, 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, + 0x664E, 0x957B, 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, + 0xC9B9, 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, + 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, 0x665B, + 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, 0x665F, 0xEAC9, + 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, 0x6663, 0x9587, 0x6664, + 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, 0x6667, 0x9589, 0x6668, 0xB3BF, + 0x6669, 0x958A, 0x666A, 0x958B, 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, + 0x958E, 0x666E, 0xC6D5, 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, + 0x6672, 0x9590, 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, + 0xBEA7, 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, 0x667F, + 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, 0x6683, 0x959B, + 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, 0x6687, 0xCFBE, 0x6688, + 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, 0x668B, 0x95A1, 0x668C, 0xEAD2, + 0x668D, 0x95A2, 0x668E, 0x95A3, 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, + 0xCAEE, 0x6692, 0x95A6, 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, + 0x6696, 0xC5AF, 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, + 0x95AC, 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, + 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, 0x66A3, + 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, 0x66A7, 0xEAD3, + 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, 0x66AB, 0x95BA, 0x66AC, + 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, 0x66AF, 0x95BD, 0x66B0, 0x95BE, + 0x66B1, 0x95BF, 0x66B2, 0x95C0, 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, + 0x95C2, 0x66B6, 0x95C3, 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, + 0x66BA, 0x95C6, 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, + 0xEAD5, 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, 0x66C7, + 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, 0x66CB, 0x95D6, + 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, 0x66CF, 0x95DA, 0x66D0, + 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, 0x66D3, 0x95DE, 0x66D4, 0x95DF, + 0x66D5, 0x95E0, 0x66D6, 0x95E1, 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, + 0xCAEF, 0x66DA, 0x95E4, 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, + 0x66DE, 0x95E5, 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, + 0x95E9, 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, + 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, 0x66EB, + 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, 0x66EF, 0x95F4, + 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, 0x66F3, 0xD2B7, 0x66F4, + 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, 0x66F7, 0xEAC2, 0x66F8, 0x95F8, + 0x66F9, 0xB2DC, 0x66FA, 0x95F9, 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, + 0x95FB, 0x66FE, 0xD4F8, 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, + 0x6702, 0x95FD, 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, + 0x9642, 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, 0x670F, + 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, 0x6713, 0x9649, + 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, 0x6717, 0xC0CA, 0x6718, + 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, 0x671B, 0xCDFB, 0x671C, 0x964E, + 0x671D, 0xB3AF, 0x671E, 0x964F, 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, + 0x9651, 0x6722, 0x9652, 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, + 0x6726, 0xEBFC, 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, + 0xCEB4, 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, + 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, 0x6733, + 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, 0x6737, 0x965D, + 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, 0x673B, 0x9660, 0x673C, + 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, 0x673F, 0x9663, 0x6740, 0xC9B1, + 0x6741, 0x9664, 0x6742, 0xD4D3, 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, + 0x9666, 0x6746, 0xB8CB, 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, + 0x674A, 0x9668, 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, + 0xC0EE, 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, 0x6757, + 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, 0x675B, 0x9672, + 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, 0x675F, 0xCAF8, 0x6760, + 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, 0x6763, 0x9675, 0x6764, 0x9676, + 0x6765, 0xC0B4, 0x6766, 0x9677, 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, + 0xE8BF, 0x676A, 0xE8C2, 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, + 0x676E, 0x967B, 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, + 0xEABD, 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, + 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, 0x677B, + 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, 0x677F, 0xB0E5, + 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, 0x6783, 0x9687, 0x6784, + 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, 0x6787, 0xE8C1, 0x6788, 0x968A, + 0x6789, 0xCDF7, 0x678A, 0x968B, 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, + 0x968D, 0x678E, 0x968E, 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, + 0x6792, 0x9691, 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, + 0x9694, 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, 0x679F, + 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, 0x67A3, 0xD4E6, + 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, 0x67A7, 0xE8C5, 0x67A8, + 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, 0x67AB, 0xB7E3, 0x67AC, 0x969D, + 0x67AD, 0xE8C9, 0x67AE, 0x969E, 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, + 0x969F, 0x67B2, 0x96A0, 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, + 0x67B6, 0xBCDC, 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, + 0x96A3, 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, + 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, 0x67C3, + 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, 0x67C7, 0x96AD, + 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, 0x67CB, 0x96B1, 0x67CC, + 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, + 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, + 0x96B5, 0x67D6, 0x96B6, 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, + 0x67DA, 0xE8D6, 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, + 0xD7F5, 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, 0x67E7, + 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, 0x67EB, 0x96C1, + 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, 0x67EF, 0xBFC2, 0x67F0, + 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, + 0x67F5, 0x96C5, 0x67F6, 0x96C6, 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, + 0x96C9, 0x67FA, 0x96CA, 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, + 0x67FE, 0x96CD, 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, + 0x96CF, 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, + 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, 0x680B, + 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, 0x680F, 0xC0B8, + 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, 0x6813, 0xCBA8, 0x6814, + 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, 0x6817, 0xC0F5, 0x6818, 0x96D8, + 0x6819, 0x96D9, 0x681A, 0x96DA, 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, + 0xE8E9, 0x681E, 0x96DD, 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, + 0x6822, 0x96E0, 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, + 0x96E4, 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, 0x682F, + 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, 0x6833, 0xE8E1, + 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, 0x6837, 0xD1F9, 0x6838, + 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, 0x683B, 0x96F2, 0x683C, 0xB8F1, + 0x683D, 0xD4D4, 0x683E, 0xE8EF, 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, + 0xE8EC, 0x6842, 0xB9F0, 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, + 0x6846, 0xBFF2, 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, + 0xE8F0, 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, + 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, 0x6853, + 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, 0x6857, 0x96FA, + 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, 0x685B, 0x96FE, 0x685C, + 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, 0x685F, 0x9743, 0x6860, 0xE8E2, + 0x6861, 0xE8E3, 0x6862, 0xE8E5, 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, + 0xC7C5, 0x6866, 0xE8EB, 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, + 0x686A, 0x9744, 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, + 0x9747, 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, 0x6877, + 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, 0x687B, 0x9751, + 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, 0x687F, 0x9755, 0x6880, + 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, 0x6883, 0xE8E8, 0x6884, 0x9758, + 0x6885, 0xC3B7, 0x6886, 0xB0F0, 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, + 0x975B, 0x688A, 0x975C, 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, + 0x688E, 0x9760, 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, + 0x9763, 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, + 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, 0x689B, + 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, 0x689F, 0x976E, + 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, 0x68A3, 0x9771, 0x68A4, + 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, + 0x68A9, 0x9774, 0x68AA, 0x9775, 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, + 0xCBF3, 0x68AE, 0x9778, 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, + 0x68B2, 0x977A, 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, + 0x977C, 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, 0x68BF, + 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, 0x68C3, 0x9788, + 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, 0x68C7, 0x978C, 0x68C8, + 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, 0x68CB, 0xC6E5, 0x68CC, 0x978F, + 0x68CD, 0xB9F7, 0x68CE, 0x9790, 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, + 0x9793, 0x68D2, 0xB0F4, 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, + 0x68D6, 0x9796, 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, + 0xC5EF, 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, + 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, 0x68E3, + 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, 0x68E7, 0x97A3, + 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, 0x68EB, 0x97A7, 0x68EC, + 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, 0x68EF, 0x97AA, 0x68F0, 0xE9A2, + 0x68F1, 0xC0E2, 0x68F2, 0x97AB, 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, + 0xBFC3, 0x68F6, 0x97AE, 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, + 0x68FA, 0xB9D7, 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, + 0x97B3, 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, 0x6907, + 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, 0x690B, 0xE9A3, + 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, 0x690F, 0x97BF, 0x6910, + 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, 0x6913, 0x97C1, 0x6914, 0x97C2, + 0x6915, 0x97C3, 0x6916, 0x97C4, 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, + 0x97C7, 0x691A, 0x97C8, 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, + 0x691E, 0x97CC, 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, + 0x97CE, 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, + 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, 0x692B, + 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, 0x692F, 0x97D9, + 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, 0x6933, 0x97DC, 0x6934, + 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, 0x6937, 0x97DF, 0x6938, 0x97E0, + 0x6939, 0xE9A9, 0x693A, 0x97E1, 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, + 0xB4AA, 0x693E, 0x97E4, 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, + 0x6942, 0xE9AB, 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, + 0x97EA, 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, 0x694F, + 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, 0x6953, 0x97F7, + 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, 0x6957, 0xE9A5, 0x6958, + 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, 0x695B, 0x97FC, 0x695C, 0x97FD, + 0x695D, 0xE9AC, 0x695E, 0xC0E3, 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, + 0x9840, 0x6962, 0x9841, 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, + 0x6966, 0xE9B8, 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, + 0x9847, 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, + 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, 0x6973, + 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, 0x6977, 0xBFAC, + 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, 0x697B, 0x9852, 0x697C, + 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, 0x697F, 0x9855, 0x6980, 0xE9AF, + 0x6981, 0x9856, 0x6982, 0xB8C5, 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, + 0x9858, 0x6986, 0xD3DC, 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, + 0x698A, 0x9859, 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, + 0x985C, 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, 0x6997, + 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, 0x699B, 0xE9BB, + 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, 0x699F, 0x9868, 0x69A0, + 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, 0x69A3, 0x986C, 0x69A4, 0x986D, + 0x69A5, 0x986E, 0x69A6, 0x986F, 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, + 0x9870, 0x69AA, 0x9871, 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, + 0x69AE, 0x9873, 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, + 0x9876, 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, + 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, 0x69BB, + 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, 0x69BF, 0x9881, + 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, 0x69C3, 0x9884, 0x69C4, + 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, 0x69C7, 0x9888, 0x69C8, 0x9889, + 0x69C9, 0x988A, 0x69CA, 0xE9C3, 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, + 0x988C, 0x69CE, 0xE9B6, 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, + 0x69D2, 0x988F, 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, + 0x9892, 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, 0x69DF, + 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, 0x69E3, 0x989C, + 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, 0x69E7, 0x98A0, 0x69E8, + 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, 0x69EB, 0x98A4, 0x69EC, 0x98A5, + 0x69ED, 0xE9CA, 0x69EE, 0x98A6, 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, + 0x98A9, 0x69F2, 0xE9CE, 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, + 0x69F6, 0x98AD, 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, + 0x98B1, 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, + 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, 0x6A03, + 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, 0x6A07, 0x98BC, + 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, 0x6A0B, 0x98BF, 0x6A0C, + 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, 0x6A0F, 0x98C3, 0x6A10, 0x98C4, + 0x6A11, 0x98C5, 0x6A12, 0x98C6, 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, + 0x98C9, 0x6A16, 0x98CA, 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, + 0x6A1A, 0x98CC, 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, + 0x98D0, 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, 0x6A27, + 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, 0x6A2B, 0x98D9, + 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, 0x6A2F, 0xE9C9, 0x6A30, + 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, 0x6A33, 0x98DF, 0x6A34, 0x98E0, + 0x6A35, 0xE9D4, 0x6A36, 0x98E1, 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, + 0x98E4, 0x6A3A, 0x98E5, 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, + 0x6A3E, 0xE9D0, 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, + 0x98EB, 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, + 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, 0x6A4B, + 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, 0x6A4F, 0x98F6, + 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, 0x6A53, 0x98F9, 0x6A54, + 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, 0x6A57, 0x98FD, 0x6A58, 0xE9D9, + 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, + 0x9941, 0x6A5E, 0x9942, 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, + 0x6A62, 0x9945, 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, + 0x9948, 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, 0x6A6F, + 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, 0x6A73, 0x9954, + 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, 0x6A77, 0x9958, 0x6A78, + 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, + 0x6A7D, 0x995C, 0x6A7E, 0x995D, 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, + 0x995F, 0x6A82, 0x9960, 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, + 0x6A86, 0x9963, 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, + 0x9967, 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, + 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, 0x6A93, + 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, 0x6A97, 0xE9DE, + 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, 0x6A9B, 0x9974, 0x6A9C, + 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, + 0x6AA1, 0x9979, 0x6AA2, 0x997A, 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, + 0x997D, 0x6AA6, 0x997E, 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, + 0x6AAA, 0x9982, 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, + 0x9984, 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, 0x6AB7, + 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, 0x6ABB, 0x9991, + 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, 0x6ABF, 0x9995, 0x6AC0, + 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, 0x6AC3, 0x9999, 0x6AC4, 0x999A, + 0x6AC5, 0x999B, 0x6AC6, 0x999C, 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, + 0x999F, 0x6ACA, 0x99A0, 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, + 0x6ACE, 0x99A4, 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, + 0x99A8, 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, + 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, 0x6ADB, + 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, 0x6ADF, 0x99B5, + 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, 0x6AE3, 0x99B9, 0x6AE4, + 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, + 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, + 0x99C3, 0x6AEE, 0x99C4, 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, + 0x6AF2, 0x99C8, 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, + 0x99CC, 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, 0x6AFF, + 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, 0x6B03, 0x99D9, + 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, 0x6B07, 0x99DD, 0x6B08, + 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, + 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, + 0x99E7, 0x6B12, 0x99E8, 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, + 0x6B16, 0x99EC, 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, + 0x99F0, 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, + 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, 0x6B23, + 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, 0x6B27, 0xC5B7, + 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, 0x6B2B, 0x99FB, 0x6B2C, + 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, 0x6B2F, 0x9A40, 0x6B30, 0x9A41, + 0x6B31, 0x9A42, 0x6B32, 0xD3FB, 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, + 0x9A45, 0x6B36, 0x9A46, 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, + 0x6B3A, 0xC6DB, 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, + 0xBFEE, 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, 0x6B47, + 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, 0x6B4B, 0x9A53, + 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, 0x6B4F, 0x9A56, 0x6B50, + 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, + 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, + 0xECA8, 0x6B5A, 0x9A60, 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, + 0x6B5E, 0x9A64, 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, + 0xD6B9, 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, 0x6B6B, + 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, 0x6B6F, 0x9A6E, + 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, 0x6B73, 0x9A72, 0x6B74, + 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, 0x6B77, 0x9A76, 0x6B78, 0x9A77, + 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, + 0x9A79, 0x6B7E, 0x9A7A, 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, + 0x6B82, 0xE9E3, 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, + 0xB4F9, 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, 0x6B8F, + 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, 0x6B93, 0xE9E7, + 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, 0x6B97, 0x9A87, 0x6B98, + 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, + 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, + 0xE9EB, 0x6BA2, 0x9A8F, 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, + 0x6BA6, 0x9A93, 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, + 0xE9EC, 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, + 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, 0x6BB3, + 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, 0x6BB7, 0xD2F3, + 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, 0x6BBB, 0x9AA3, 0x6BBC, + 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, + 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, + 0xD2E3, 0x6BC6, 0x9AAA, 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, + 0x6BCA, 0x9AAE, 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, + 0x9AB0, 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, 0x6BD7, + 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, 0x6BDB, 0xC3AB, + 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, 0x6BDF, 0x9AB8, 0x6BE0, + 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, + 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, + 0x9AC1, 0x6BEA, 0xEBA4, 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, + 0x6BEE, 0x9AC4, 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, + 0x9AC7, 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, + 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, 0x6BFB, + 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, 0x6BFF, 0x9AD0, + 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, 0x6C03, 0x9AD4, 0x6C04, + 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, + 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, + 0xEBAC, 0x6C0E, 0x9ADB, 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, + 0x6C12, 0x9ADC, 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, + 0xC4CA, 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, 0x6C1F, + 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, 0x6C23, 0x9AE2, + 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, 0x6C27, 0xD1F5, 0x6C28, + 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, + 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, + 0x9AE7, 0x6C32, 0xEBB5, 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, + 0x6C36, 0x9AE9, 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, + 0x9AEC, 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, + 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, 0x6C43, + 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, 0x6C47, 0xBBE3, + 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, 0x6C4B, 0x9AF5, 0x6C4C, + 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, + 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, + 0xC9C7, 0x6C56, 0x9AFD, 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, + 0x6C5A, 0x9B41, 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, + 0xB9AF, 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, 0x6C67, + 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, 0x6C6B, 0x9B47, + 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, 0x6C6F, 0x9B4B, 0x6C70, + 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, + 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, + 0xD0DA, 0x6C7A, 0x9B51, 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, + 0x6C7E, 0xB7DA, 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, + 0xD2CA, 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, + 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, 0x6C8B, + 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, 0x6C8F, 0xC6E3, + 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, 0x6C93, 0xEDB3, 0x6C94, + 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, 0x6C97, 0x9B60, 0x6C98, 0x9B61, + 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, + 0x9B64, 0x6C9E, 0x9B65, 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, + 0x6CA2, 0x9B67, 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, + 0xC2D9, 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, 0x6CAF, + 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, 0x6CB3, 0xBAD3, + 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, 0x6CB7, 0x9B6F, 0x6CB8, + 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, + 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, + 0x9B72, 0x6CC2, 0x9B73, 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, + 0x6CC6, 0x9B75, 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, + 0xB2B4, 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, + 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, 0x6CD3, + 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, 0x6CD7, 0xE3F4, + 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, 0x6CDB, 0xB7BA, 0x6CDC, + 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, + 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, + 0xC4E0, 0x6CE6, 0x9B86, 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, + 0x6CEA, 0xC0E1, 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, + 0xE3FA, 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, 0x6CF7, + 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, 0x6CFB, 0xD0BA, + 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, 0x6CFF, 0x9B8E, 0x6D00, + 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, 0x6D03, 0x9B91, 0x6D04, 0xE4A7, + 0x6D05, 0x9B92, 0x6D06, 0x9B93, 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, + 0x9B95, 0x6D0A, 0x9B96, 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, + 0x6D0E, 0xE4A9, 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, + 0xC8F7, 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, + 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, 0x6D1B, + 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, 0x6D1F, 0x9BA2, + 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, 0x6D23, 0x9BA6, 0x6D24, + 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, + 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, + 0x9BAC, 0x6D2E, 0xE4AC, 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, + 0x6D32, 0xD6DE, 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, + 0x9BB0, 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, 0x6D3F, + 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, 0x6D43, 0xE4A4, + 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, 0x6D47, 0xBDBD, 0x6D48, + 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, + 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, + 0xBBEB, 0x6D52, 0xE4B0, 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, + 0x6D56, 0x9BBC, 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, + 0xBFA3, 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, + 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, 0x6D63, + 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, 0x6D67, 0x9BC6, + 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, 0x6D6B, 0x9BC8, 0x6D6C, + 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, + 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, + 0x9BCF, 0x6D76, 0x9BD0, 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, + 0x6D7A, 0x9BD2, 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, + 0x9BD5, 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, 0x6D87, + 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, 0x6D8B, 0x9BDE, + 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, 0x6D8F, 0x9BE0, 0x6D90, + 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, + 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, + 0x9BE6, 0x6D9A, 0x9BE7, 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, + 0x6D9E, 0xE4B5, 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, + 0x9BE9, 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, 0x6DAB, + 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, 0x6DAF, 0xD1C4, + 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, 0x6DB3, 0x9BEF, 0x6DB4, + 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, + 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, + 0x9BF7, 0x6DBE, 0x9BF8, 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, + 0x6DC2, 0x9BFA, 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, + 0xCFFD, 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, 0x6DCF, + 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, 0x6DD3, 0x9C45, + 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, 0x6DD7, 0x9C48, 0x6DD8, + 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, + 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, + 0xB5AD, 0x6DE2, 0x9C4D, 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, + 0x6DE6, 0xE4C6, 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, + 0x9C53, 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, + 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, 0x6DF3, + 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, 0x6DF7, 0xBBEC, + 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, 0x6DFB, 0xCCED, 0x6DFC, + 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, + 0x6E01, 0x9C61, 0x6E02, 0x9C62, 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, + 0xC7E5, 0x6E06, 0x9C65, 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, + 0x6E0A, 0xD4A8, 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, + 0xE4C2, 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, 0x6E17, + 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, 0x6E1B, 0x9C70, + 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, 0x6E1F, 0x9C73, 0x6E20, + 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, + 0x6E25, 0xE4D7, 0x6E26, 0x9C75, 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, + 0xCEC2, 0x6E2A, 0x9C78, 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, + 0x6E2E, 0x9C7A, 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, + 0xE4D6, 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, + 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, 0x6E3B, + 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, 0x6E3F, 0x9C87, + 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, 0x6E43, 0xC5C8, 0x6E44, + 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, + 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, + 0xCDC4, 0x6E4E, 0xE4CF, 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, + 0x6E52, 0x9C96, 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, + 0xBAFE, 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, 0x6E5F, + 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, 0x6E63, 0x9CA1, + 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, 0x6E67, 0x9CA5, 0x6E68, + 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, + 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, + 0x9CAD, 0x6E72, 0x9CAE, 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, + 0x6E76, 0x9CB2, 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, + 0x9CB6, 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, 0x6E83, + 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, 0x6E87, 0x9CBE, + 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, 0x6E8B, 0x9CC1, 0x6E8C, + 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, + 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, + 0x9CC9, 0x6E96, 0x9CCA, 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, + 0x6E9A, 0x9CCD, 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, + 0x9CD0, 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, 0x6EA7, + 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, 0x6EAB, 0x9CD8, + 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, 0x6EAF, 0xCBDD, 0x6EB0, + 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, + 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, + 0x9CE0, 0x6EBA, 0xC4E7, 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, + 0x6EBE, 0x9CE2, 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, + 0xE4E8, 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, + 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, 0x6ECB, + 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, 0x6ECF, 0xE4E6, + 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, 0x6ED3, 0xD7D2, 0x6ED4, + 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, + 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, + 0x9CF6, 0x6EDE, 0xD6CD, 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, + 0x6EE2, 0xE4DE, 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, + 0xC2D0, 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, 0x6EEF, + 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, 0x6EF3, 0x9D43, + 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, 0x6EF7, 0x9D46, 0x6EF8, + 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, + 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, + 0x9D4F, 0x6F02, 0xC6AF, 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, + 0x6F06, 0xC6E1, 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, + 0x9D55, 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, + 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, 0x6F13, + 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, 0x6F17, 0x9D5E, + 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, 0x6F1B, 0x9D62, 0x6F1C, + 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, + 0x6F21, 0x9D67, 0x6F22, 0x9D68, 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, + 0x9D6A, 0x6F26, 0x9D6B, 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, + 0x6F2A, 0xE4F4, 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, + 0x9D6F, 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, 0x6F37, + 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, 0x6F3B, 0x9D78, + 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, 0x6F3F, 0x9D7B, 0x6F40, + 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, 0x6F43, 0x9D80, 0x6F44, 0x9D81, + 0x6F45, 0x9D82, 0x6F46, 0xE4EB, 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, + 0x9D84, 0x6F4A, 0x9D85, 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, + 0x6F4E, 0x9D87, 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, + 0x9D8B, 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, + 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, 0x6F5B, + 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, 0x6F5F, 0x9D95, + 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, 0x6F63, 0x9D98, 0x6F64, + 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, + 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, + 0xCCB6, 0x6F6E, 0xB3B1, 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, + 0x6F72, 0xE4FB, 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, + 0x9DA6, 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, 0x6F7F, + 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, 0x6F83, 0x9DB0, + 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, 0x6F87, 0x9DB3, 0x6F88, + 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, + 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, + 0x9DB8, 0x6F92, 0x9DB9, 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, + 0x6F96, 0x9DBD, 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, + 0x9DC1, 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, + 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, 0x6FA3, + 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, 0x6FA7, 0xE5A2, + 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, 0x6FAB, 0x9DCF, 0x6FAC, + 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, + 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, + 0x9DD8, 0x6FB6, 0xE5A4, 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, + 0x6FBA, 0x9DDB, 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, + 0x9DDF, 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, 0x6FC7, + 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, 0x6FCB, 0x9DE9, + 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, 0x6FCF, 0x9DED, 0x6FD0, + 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, + 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, + 0x9DF5, 0x6FDA, 0x9DF6, 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, + 0x6FDE, 0xE5A8, 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, + 0x9DFB, 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, + 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, 0x6FEB, + 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, 0x6FEF, 0xE5AA, + 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, 0x6FF3, 0x9E4B, 0x6FF4, + 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, + 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, + 0x9E55, 0x6FFE, 0x9E56, 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, + 0x7002, 0x9E5A, 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, + 0x9E5E, 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, 0x700F, + 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, 0x7013, 0x9E6A, + 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, 0x7017, 0x9E6E, 0x7018, + 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, 0x701B, 0xE5AD, 0x701C, 0x9E71, + 0x701D, 0x9E72, 0x701E, 0x9E73, 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, + 0x9E76, 0x7022, 0x9E77, 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, + 0x7026, 0x9E7A, 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, + 0x9E7E, 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, + 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, 0x7033, + 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, 0x7037, 0x9E8B, + 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, 0x703B, 0x9E8E, 0x703C, + 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, 0x703F, 0x9E92, 0x7040, 0x9E93, + 0x7041, 0x9E94, 0x7042, 0x9E95, 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, + 0x9E98, 0x7046, 0x9E99, 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, + 0x704A, 0x9E9D, 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, + 0x9EA0, 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, 0x7057, + 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, 0x705B, 0x9EAC, + 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, 0x705F, 0x9EAF, 0x7060, + 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, 0x7063, 0x9EB3, 0x7064, 0x9EB4, + 0x7065, 0x9EB5, 0x7066, 0x9EB6, 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, + 0x9EB9, 0x706A, 0x9EBA, 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, + 0x706E, 0x9EBB, 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, + 0x9EBD, 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, + 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, 0x707B, + 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, 0x707F, 0xB2D3, + 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, 0x7083, 0x9EC7, 0x7084, + 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, 0x7087, 0x9ECA, 0x7088, 0x9ECB, + 0x7089, 0xC2AF, 0x708A, 0xB4B6, 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, + 0x9ECE, 0x708E, 0xD1D7, 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, + 0x7092, 0xB3B4, 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, + 0xECC0, 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, 0x709F, + 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, 0x70A3, 0x9EDC, + 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, 0x70A7, 0x9EE0, 0x70A8, + 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, 0x70AB, 0xECC5, 0x70AC, 0xBEE6, + 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, + 0xECC6, 0x70B2, 0x9EE5, 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, + 0x70B6, 0x9EE8, 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, + 0x9EE9, 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, + 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, 0x70C3, + 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, 0x70C7, 0x9EEF, + 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, 0x70CB, 0x9EF1, 0x70CC, + 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, + 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, + 0x9EFB, 0x70D6, 0x9EFC, 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, + 0x70DA, 0x9EFE, 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, + 0x9F42, 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, 0x70E7, + 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, 0x70EB, 0xCCCC, + 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, 0x70EF, 0xCFA9, 0x70F0, + 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, + 0x70F5, 0x9F4F, 0x70F6, 0x9F50, 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, + 0xC5EB, 0x70FA, 0x9F52, 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, + 0x70FE, 0x9F55, 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, + 0x9F59, 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, + 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, 0x710B, + 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, 0x710F, 0x9F64, + 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, 0x7113, 0xECCA, 0x7114, + 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, 0x7117, 0x9F68, 0x7118, 0xECE2, + 0x7119, 0xB1BA, 0x711A, 0xB7D9, 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, + 0x9F6B, 0x711E, 0x9F6C, 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, + 0x7122, 0x9F70, 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, + 0xBDB9, 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, 0x712F, + 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, 0x7133, 0x9F7D, + 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, 0x7137, 0x9F81, 0x7138, + 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, 0x713B, 0x9F85, 0x713C, 0x9F86, + 0x713D, 0x9F87, 0x713E, 0x9F88, 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, + 0x9F8B, 0x7142, 0x9F8C, 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, + 0x7146, 0x9F8F, 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, + 0xECD3, 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, + 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, 0x7153, + 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, 0x7157, 0x9F9D, + 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, 0x715B, 0x9FA1, 0x715C, + 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, 0x715F, 0x9FA3, 0x7160, 0x9FA4, + 0x7161, 0x9FA5, 0x7162, 0x9FA6, 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, + 0x9FA8, 0x7166, 0xECE3, 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, + 0x716A, 0x9FAA, 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, + 0xD6F3, 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, 0x7177, + 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, 0x717B, 0x9FB6, + 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, 0x717F, 0x9FB9, 0x7180, + 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, 0x7183, 0x9FBD, 0x7184, 0xCFA8, + 0x7185, 0x9FBE, 0x7186, 0x9FBF, 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, + 0x9FC2, 0x718A, 0xD0DC, 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, + 0x718E, 0x9FC6, 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, + 0x9FC9, 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, + 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, 0x719B, + 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, 0x719F, 0xCAEC, + 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, 0x71A3, 0x9FD5, 0x71A4, + 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, 0x71A7, 0x9FD9, 0x71A8, 0xECD9, + 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, + 0x9FDD, 0x71AE, 0x9FDE, 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, + 0x71B2, 0x9FE2, 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, + 0x9FE4, 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, 0x71BF, + 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, 0x71C3, 0xC8BC, + 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, 0x71C7, 0x9FF3, 0x71C8, + 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, + 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, + 0x9FFC, 0x71D2, 0x9FFD, 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, + 0x71D6, 0xA040, 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, + 0xA044, 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, + 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, 0x71E3, + 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, 0x71E7, 0xECDD, + 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, 0x71EB, 0xA052, 0x71EC, + 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, 0x71EF, 0xA055, 0x71F0, 0xA056, + 0x71F1, 0xA057, 0x71F2, 0xA058, 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, + 0xA05B, 0x71F6, 0xA05C, 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, + 0x71FA, 0xA05F, 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, + 0xA063, 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, 0x7207, + 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, 0x720B, 0xA06F, + 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, 0x720F, 0xA073, 0x7210, + 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, 0x7213, 0xA077, 0x7214, 0xA078, + 0x7215, 0xA079, 0x7216, 0xA07A, 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, + 0xA07D, 0x721A, 0xA07E, 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, + 0x721E, 0xA082, 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, + 0xA086, 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, + 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, 0x722B, + 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, 0x722F, 0xA090, + 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, 0x7233, 0xA092, 0x7234, + 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, 0x7237, 0xD2AF, 0x7238, 0xB0D6, + 0x7239, 0xB5F9, 0x723A, 0xA094, 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, + 0xCBAC, 0x723E, 0xA096, 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, + 0x7242, 0xA099, 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, + 0xA09D, 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, 0x724F, + 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, 0x7253, 0xA0A5, + 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, 0x7257, 0xA0A8, 0x7258, + 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, 0x725B, 0xC5A3, 0x725C, 0xA0AB, + 0x725D, 0xEAF2, 0x725E, 0xA0AC, 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, + 0xC4B5, 0x7262, 0xC0CE, 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, + 0x7266, 0xEAF3, 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, + 0xA0B2, 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, + 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, 0x7273, + 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, 0x7277, 0xA0BB, + 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, 0x727B, 0xA0BD, 0x727C, + 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, 0x727F, 0xEAF6, 0x7280, 0xCFAC, + 0x7281, 0xC0E7, 0x7282, 0xA0C0, 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, + 0xA0C2, 0x7286, 0xA0C3, 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, + 0x728A, 0xB6BF, 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, + 0xA0C8, 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, 0x7297, + 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, 0x729B, 0xA0D3, + 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, 0x729F, 0xEAF1, 0x72A0, + 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, + 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, + 0xA0E0, 0x72AA, 0xA0E1, 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, + 0x72AE, 0xA0E3, 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, + 0xA0E5, 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, 0x72BB, + 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, 0x72BF, 0xA0ED, + 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, 0x72C3, 0xE1F0, 0x72C4, + 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, + 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, + 0xE1F3, 0x72CE, 0xE1F2, 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, + 0x72D2, 0xE1F4, 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, + 0xA0FB, 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, 0x72DF, + 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, 0x72E3, 0xAA44, + 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, 0x72E7, 0xAA48, 0x72E8, + 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, + 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, + 0xD3FC, 0x72F2, 0xE1F8, 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, + 0x72F6, 0xAA4C, 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, + 0xE1FE, 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, + 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, 0x7303, + 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, 0x7307, 0xAA56, + 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, 0x730B, 0xAA59, 0x730C, + 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, 0x730F, 0xAA5C, 0x7310, 0xAA5D, + 0x7311, 0xAA5E, 0x7312, 0xAA5F, 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, + 0xE2A8, 0x7316, 0xB2FE, 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, + 0x731A, 0xAA63, 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, + 0xE2A6, 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, 0x7327, + 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, 0x732B, 0xC3A8, + 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, 0x732F, 0xAA6C, 0x7330, + 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, 0x7333, 0xAA6F, 0x7334, 0xBAEF, + 0x7335, 0xAA70, 0x7336, 0xAA71, 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, + 0xE2AA, 0x733A, 0xAA72, 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, + 0x733E, 0xBBAB, 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, + 0xAA78, 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, + 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, 0x734B, + 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, 0x734F, 0xAA85, + 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, 0x7353, 0xAA87, 0x7354, + 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, 0x7357, 0xE2B1, 0x7358, 0xAA8B, + 0x7359, 0xAA8C, 0x735A, 0xAA8D, 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, + 0xAA90, 0x735E, 0xAA91, 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, + 0x7362, 0xAA94, 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, + 0xAA98, 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, 0x736F, + 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, 0x7373, 0xAB41, + 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, 0x7377, 0xAB45, 0x7378, + 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, 0x737B, 0xAB49, 0x737C, 0xAB4A, + 0x737D, 0xAB4B, 0x737E, 0xE2B5, 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, + 0xAB4E, 0x7382, 0xAB4F, 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, + 0x7386, 0xAB52, 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, + 0xAB54, 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, + 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, 0x7393, + 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, 0x7397, 0xAB5D, + 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, 0x739B, 0xC2EA, 0x739C, + 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, 0x739F, 0xE7E4, 0x73A0, 0xAB64, + 0x73A1, 0xAB65, 0x73A2, 0xE7E3, 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, + 0xAB68, 0x73A6, 0xAB69, 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, + 0x73AA, 0xAB6C, 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, + 0xE7E2, 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, 0x73B7, + 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, 0x73BB, 0xB2A3, + 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, 0x73BF, 0xAB78, 0x73C0, + 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, + 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, + 0xE7EB, 0x73CA, 0xC9BA, 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, + 0x73CE, 0xAB82, 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, + 0xAB83, 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, + 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, 0x73DB, + 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, 0x73DF, 0xAB8E, + 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, 0x73E3, 0xAB91, 0x73E4, + 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, 0x73E7, 0xE7F2, 0x73E8, 0xAB94, + 0x73E9, 0xE7F1, 0x73EA, 0xAB95, 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, + 0xB0E0, 0x73EE, 0xAB98, 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, + 0x73F2, 0xE7F5, 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, + 0xAB9F, 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, 0x73FF, + 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, 0x7403, 0xC7F2, + 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, 0x7407, 0xAC4C, 0x7408, + 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, 0x740B, 0xAC4E, 0x740C, 0xAC4F, + 0x740D, 0xAC50, 0x740E, 0xAC51, 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, + 0xAC52, 0x7412, 0xAC53, 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, + 0x7416, 0xAC57, 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, + 0xE8A2, 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, + 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, 0x7423, + 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, 0x7427, 0xAC63, + 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, 0x742B, 0xAC65, 0x742C, + 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, 0x742F, 0xAC67, 0x7430, 0xE7FC, + 0x7431, 0xAC68, 0x7432, 0xAC69, 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, + 0xC5FD, 0x7436, 0xC5C3, 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, + 0x743A, 0xAC6D, 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, + 0xAC70, 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, 0x7447, + 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, 0x744B, 0xAC7C, + 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, 0x744F, 0xAC81, 0x7450, + 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, 0x7453, 0xAC85, 0x7454, 0xAC86, + 0x7455, 0xE8A6, 0x7456, 0xAC87, 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, + 0xE8A7, 0x745A, 0xBAF7, 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, + 0x745E, 0xC8F0, 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, + 0xAC8C, 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, + 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, 0x746B, + 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, 0x746F, 0xAC98, + 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, 0x7473, 0xAC9B, 0x7474, + 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, 0x7477, 0xE8A8, 0x7478, 0xAC9E, + 0x7479, 0xAC9F, 0x747A, 0xACA0, 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, + 0xAD42, 0x747E, 0xE8AA, 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, + 0x7482, 0xAD44, 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, + 0xAD47, 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, 0x748F, + 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, 0x7493, 0xAD50, + 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, 0x7497, 0xAD54, 0x7498, + 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, 0x749B, 0xAD58, 0x749C, 0xE8AB, + 0x749D, 0xAD59, 0x749E, 0xE8B1, 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, + 0xAD5C, 0x74A2, 0xAD5D, 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, + 0x74A6, 0xAD61, 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, + 0xAD62, 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, + 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, 0x74B3, + 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, 0x74B7, 0xAD6F, + 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, 0x74BB, 0xAD72, 0x74BC, + 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, 0x74BF, 0xAD76, 0x74C0, 0xAD77, + 0x74C1, 0xAD78, 0x74C2, 0xAD79, 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, + 0xAD7C, 0x74C6, 0xAD7D, 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, + 0x74CA, 0xAD82, 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, + 0xAD86, 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, 0x74D7, + 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, 0x74DB, 0xAD92, + 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, 0x74DF, 0xAD94, 0x74E0, + 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, + 0x74E5, 0xAD96, 0x74E6, 0xCDDF, 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, + 0xAD99, 0x74EA, 0xAD9A, 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, + 0x74EE, 0xCECD, 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, + 0xADA0, 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, 0x74FB, + 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, 0x74FF, 0xEAB3, + 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, 0x7503, 0xAE4C, 0x7504, + 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, 0x7507, 0xAE4F, 0x7508, 0xAE50, + 0x7509, 0xAE51, 0x750A, 0xAE52, 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, + 0xDDF9, 0x750E, 0xAE55, 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, + 0x7512, 0xAE57, 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, + 0xAE5A, 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, 0x751F, + 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, 0x7523, 0xAE62, + 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, 0x7527, 0xAE65, 0x7528, + 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, 0x752B, 0xB8A6, 0x752C, 0xF0AE, + 0x752D, 0xB1C2, 0x752E, 0xAE67, 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, + 0xD3C9, 0x7532, 0xBCD7, 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, + 0x7536, 0xAE69, 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, + 0xEEAE, 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, + 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, 0x7543, + 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, 0x7547, 0xAE73, + 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, 0x754B, 0xEEB1, 0x754C, + 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, 0x754F, 0xCEB7, 0x7550, 0xAE77, + 0x7551, 0xAE78, 0x7552, 0xAE79, 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, + 0xAE7B, 0x7556, 0xAE7C, 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, + 0x755A, 0xDBCE, 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, + 0xAE81, 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, 0x7567, + 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, 0x756B, 0xAE8B, + 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, 0x756F, 0xAE8F, 0x7570, + 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, 0x7573, 0xAE92, 0x7574, 0xB3EB, + 0x7575, 0xAE93, 0x7576, 0xAE94, 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, + 0xEEB5, 0x757A, 0xAE96, 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, + 0x757E, 0xAE9A, 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, + 0xAE9D, 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, + 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, 0x758B, + 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, 0x758F, 0xCAE8, + 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, 0x7593, 0xAF47, 0x7594, + 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, 0x7597, 0xC1C6, 0x7598, 0xAF49, + 0x7599, 0xB8ED, 0x759A, 0xBECE, 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, + 0xF0DE, 0x759E, 0xAF4C, 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, + 0x75A2, 0xAF4D, 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, + 0xAF4E, 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, 0x75AF, + 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, 0x75B3, 0xF0E1, + 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, 0x75B7, 0xAF55, 0x75B8, + 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, 0x75BB, 0xAF57, 0x75BC, 0xCCDB, + 0x75BD, 0xBED2, 0x75BE, 0xBCB2, 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, + 0xAF5A, 0x75C2, 0xF0E8, 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, + 0x75C6, 0xAF5B, 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, + 0xC8AC, 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, + 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, 0x75D3, + 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, 0x75D7, 0xAF63, + 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, 0x75DB, 0xCDB4, 0x75DC, + 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, 0x75DF, 0xAF68, 0x75E0, 0xAF69, + 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, + 0xAF6B, 0x75E6, 0xF0ED, 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, + 0x75EA, 0xBBBE, 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, + 0xAF6F, 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, 0x75F7, + 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, 0x75FB, 0xAF78, + 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, 0x75FF, 0xF0F4, 0x7600, + 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, 0x7603, 0xF0F1, 0x7604, 0xAF7C, + 0x7605, 0xF0F7, 0x7606, 0xAF7D, 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, + 0xAF81, 0x760A, 0xF0FA, 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, + 0x760E, 0xAF84, 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, + 0xAF87, 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, + 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, 0x761B, + 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, 0x761F, 0xCEC1, + 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, 0x7623, 0xAF90, 0x7624, + 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, 0x7627, 0xAF91, 0x7628, 0xAF92, + 0x7629, 0xB4F1, 0x762A, 0xB1F1, 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, + 0xF1A6, 0x762E, 0xAF94, 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, + 0x7632, 0xAF97, 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, + 0xAF98, 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, 0x763F, + 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, 0x7643, 0xF1AA, + 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, 0x7647, 0xB042, 0x7648, + 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, 0x764B, 0xB046, 0x764C, 0xB0A9, + 0x764D, 0xF1AD, 0x764E, 0xB047, 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, + 0xB04A, 0x7652, 0xB04B, 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, + 0x7656, 0xF1B1, 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, + 0xB051, 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, + 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, 0x7663, + 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, 0x7667, 0xB05B, + 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, 0x766B, 0xF1B2, 0x766C, + 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, 0x766F, 0xF1B3, 0x7670, 0xB062, + 0x7671, 0xB063, 0x7672, 0xB064, 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, + 0xB067, 0x7676, 0xB068, 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, + 0x767A, 0xB06B, 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, + 0xB0D9, 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, 0x7687, + 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, 0x768B, 0xB8DE, + 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, 0x768F, 0xB076, 0x7690, + 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, 0x7693, 0xF0A9, 0x7694, 0xB079, + 0x7695, 0xB07A, 0x7696, 0xCDEE, 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, + 0xF0AA, 0x769A, 0xB07D, 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, + 0x769E, 0xB082, 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, + 0xB086, 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, + 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, 0x76AB, + 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, 0x76AF, 0xB091, + 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, 0x76B3, 0xB093, 0x76B4, + 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, 0x76B7, 0xB096, 0x76B8, 0xB097, + 0x76B9, 0xB098, 0x76BA, 0xB099, 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, + 0xB09C, 0x76BE, 0xB09D, 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, + 0x76C2, 0xD3DB, 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, + 0xC5E8, 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, 0x76CF, + 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, 0x76D3, 0xB145, + 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, 0x76D7, 0xB5C1, 0x76D8, + 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, 0x76DB, 0xCAA2, 0x76DC, 0xB149, + 0x76DD, 0xB14A, 0x76DE, 0xB14B, 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, + 0xB14D, 0x76E2, 0xB14E, 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, + 0x76E6, 0xB151, 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, + 0xB155, 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, 0x76F3, + 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, 0x76F7, 0xB15D, + 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, 0x76FB, 0xB15F, 0x76FC, + 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, 0x76FF, 0xB161, 0x7700, 0xB162, + 0x7701, 0xCAA1, 0x7702, 0xB163, 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, + 0xB165, 0x7706, 0xB166, 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, + 0x770A, 0xB167, 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, + 0xB169, 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, 0x7717, + 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, 0x771B, 0xB174, + 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, 0x771F, 0xD5E6, 0x7720, + 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, 0x7723, 0xB179, 0x7724, 0xB17A, + 0x7725, 0xB17B, 0x7726, 0xEDF6, 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, + 0xD1A3, 0x772A, 0xB17D, 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, + 0x772E, 0xB181, 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, + 0xB184, 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, + 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, 0x773B, + 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, 0x773F, 0xB18B, + 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, 0x7743, 0xEDFC, 0x7744, + 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, 0x7747, 0xEDFB, 0x7748, 0xB190, + 0x7749, 0xB191, 0x774A, 0xB192, 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, + 0xB195, 0x774E, 0xB196, 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, + 0x7752, 0xB198, 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, + 0xB19C, 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, 0x775F, + 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, 0x7763, 0xB6BD, + 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, 0x7767, 0xB245, 0x7768, + 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, 0x776B, 0xBDDE, 0x776C, 0xB2C7, + 0x776D, 0xB248, 0x776E, 0xB249, 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, + 0xB24C, 0x7772, 0xB24D, 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, + 0x7776, 0xB251, 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, + 0xB254, 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, + 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, 0x7783, + 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, 0x7787, 0xB25B, + 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, 0x778B, 0xB25F, 0x778C, + 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, 0x778F, 0xB260, 0x7790, 0xB261, + 0x7791, 0xEEA8, 0x7792, 0xC2F7, 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, + 0xB264, 0x7796, 0xB265, 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, + 0x779A, 0xB269, 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, + 0xB26D, 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, 0x77A7, + 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, 0x77AB, 0xB273, + 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, 0x77AF, 0xB276, 0x77B0, + 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, 0x77B3, 0xCDAB, 0x77B4, 0xB279, + 0x77B5, 0xEEAC, 0x77B6, 0xB27A, 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, + 0xB27D, 0x77BA, 0xB27E, 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, + 0x77BE, 0xB281, 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, + 0xB284, 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, + 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, 0x77CB, + 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, 0x77CF, 0xB290, + 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, 0x77D3, 0xB294, 0x77D4, + 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, 0x77D7, 0xB4A3, 0x77D8, 0xB298, + 0x77D9, 0xB299, 0x77DA, 0xB29A, 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, + 0xB29B, 0x77DE, 0xB29C, 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, + 0x77E2, 0xCAB8, 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, + 0xB340, 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, 0x77EF, + 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, 0x77F3, 0xCAAF, + 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, 0x77F7, 0xB349, 0x77F8, + 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, 0x77FB, 0xB34C, 0x77FC, 0xB34D, + 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, + 0xC2EB, 0x7802, 0xC9B0, 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, + 0x7806, 0xB351, 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, + 0xB354, 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, + 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, 0x7813, + 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, 0x7817, 0xEDBA, + 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, 0x781B, 0xB35C, 0x781C, + 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, 0x781F, 0xEDC4, 0x7820, 0xB35E, + 0x7821, 0xB35F, 0x7822, 0xB360, 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, + 0xEDC6, 0x7826, 0xEDCE, 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, + 0x782A, 0xB363, 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, + 0xB365, 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, 0x7837, + 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, 0x783B, 0xEDC3, + 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, 0x783F, 0xB36D, 0x7840, + 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, 0x7843, 0xB370, 0x7844, 0xB371, + 0x7845, 0xB9E8, 0x7846, 0xB372, 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, + 0xB374, 0x784A, 0xB375, 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, + 0x784E, 0xEDCA, 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, + 0xCEF8, 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, + 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, 0x785B, + 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, 0x785F, 0xB383, + 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, 0x7863, 0xB387, 0x7864, + 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, 0x7867, 0xB38B, 0x7868, 0xB38C, + 0x7869, 0xB38D, 0x786A, 0xEDD2, 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, + 0xEDCB, 0x786E, 0xC8B7, 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, + 0x7872, 0xB391, 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, + 0xB395, 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, 0x787F, + 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, 0x7883, 0xB3A0, + 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, 0x7887, 0xEDD6, 0x7888, + 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, 0x788B, 0xB445, 0x788C, 0xC2B5, + 0x788D, 0xB0AD, 0x788E, 0xCBE9, 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, + 0xB1AE, 0x7892, 0xB448, 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, + 0x7896, 0xB44B, 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, + 0xEDD5, 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, + 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, 0x78A3, + 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, 0x78A7, 0xB1CC, + 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, 0x78AB, 0xB456, 0x78AC, + 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, 0x78AF, 0xB45A, 0x78B0, 0xC5F6, + 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, + 0xB45B, 0x78B6, 0xB45C, 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, + 0x78BA, 0xB45F, 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, + 0xC4EB, 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, 0x78C7, + 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, 0x78CB, 0xB4E8, + 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, 0x78CF, 0xB46E, 0x78D0, + 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, 0x78D3, 0xB471, 0x78D4, 0xEDDD, + 0x78D5, 0xBFC4, 0x78D6, 0xB472, 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, + 0xEDDE, 0x78DA, 0xB475, 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, + 0x78DE, 0xB479, 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, + 0xB47D, 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, + 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, 0x78EB, + 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, 0x78EF, 0xB489, + 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, 0x78F3, 0xB48C, 0x78F4, + 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, 0x78F7, 0xC1D7, 0x78F8, 0xB48F, + 0x78F9, 0xB490, 0x78FA, 0xBBC7, 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, + 0xB493, 0x78FE, 0xB494, 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, + 0x7902, 0xB497, 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, + 0xB49A, 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, 0x790F, + 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, 0x7913, 0xEDE4, + 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, 0x7917, 0xB549, 0x7918, + 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, 0x791B, 0xB54D, 0x791C, 0xB54E, + 0x791D, 0xB54F, 0x791E, 0xEDE6, 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, + 0xB552, 0x7922, 0xB553, 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, + 0x7926, 0xB556, 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, + 0xB55A, 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, + 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, 0x7933, + 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, 0x7937, 0xB566, + 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, 0x793B, 0xECEA, 0x793C, + 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, 0x793F, 0xB56A, 0x7940, 0xECEB, + 0x7941, 0xC6EE, 0x7942, 0xB56B, 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, + 0xB56E, 0x7946, 0xECEC, 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, + 0x794A, 0xB570, 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, + 0xB574, 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, 0x7957, + 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, 0x795B, 0xECEE, + 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, 0x795F, 0xCBEE, 0x7960, + 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, 0x7963, 0xB57E, 0x7964, 0xB580, + 0x7965, 0xCFE9, 0x7966, 0xB581, 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, + 0xB582, 0x796A, 0xB583, 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, + 0x796E, 0xB586, 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, + 0xB589, 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, + 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, 0x797B, + 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, 0x797F, 0xB593, + 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, 0x7983, 0xB595, 0x7984, + 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, 0x7987, 0xB597, 0x7988, 0xB598, + 0x7989, 0xB599, 0x798A, 0xECF9, 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, + 0xB59C, 0x798E, 0xB59D, 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, + 0x7992, 0xB5A0, 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, + 0xB643, 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, 0x799F, + 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, 0x79A3, 0xB64F, + 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, 0x79A7, 0xECFB, 0x79A8, + 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, 0x79AB, 0xB656, 0x79AC, 0xB657, + 0x79AD, 0xB658, 0x79AE, 0xB659, 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, + 0xB65C, 0x79B2, 0xB65D, 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, + 0x79B6, 0xB660, 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, + 0xD8AE, 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, + 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, 0x79C3, + 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, 0x79C7, 0xB668, + 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, 0x79CB, 0xC7EF, 0x79CC, + 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, 0x79CF, 0xB66D, 0x79D0, 0xB66E, + 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, + 0xEFF5, 0x79D6, 0xB671, 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, + 0x79DA, 0xB674, 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, + 0xB678, 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, 0x79E7, + 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, 0x79EB, 0xEFF8, + 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, 0x79EF, 0xBBFD, 0x79F0, + 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, 0x79F3, 0xB684, 0x79F4, 0xB685, + 0x79F5, 0xB686, 0x79F6, 0xB687, 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, + 0xB689, 0x79FA, 0xB68A, 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, + 0x79FE, 0xB68C, 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, + 0xEFFC, 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, + 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, 0x7A0B, + 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, 0x7A0F, 0xB696, + 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, 0x7A13, 0xB69A, 0x7A14, + 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, 0x7A17, 0xB0DE, 0x7A18, 0xB69D, + 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, + 0xB740, 0x7A1E, 0xEFFD, 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, + 0x7A22, 0xB743, 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, + 0xB746, 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, 0x7A2F, + 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, 0x7A33, 0xCEC8, + 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, 0x7A37, 0xF0A2, 0x7A38, + 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, + 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, + 0xB75A, 0x7A42, 0xB75B, 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, + 0x7A46, 0xC4C2, 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, + 0xB762, 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, + 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, 0x7A53, + 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, 0x7A57, 0xCBEB, + 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, 0x7A5B, 0xB771, 0x7A5C, + 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, 0x7A5F, 0xB775, 0x7A60, 0xB776, + 0x7A61, 0xB777, 0x7A62, 0xB778, 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, + 0xB77B, 0x7A66, 0xB77C, 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, + 0x7A6A, 0xB781, 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, + 0xB785, 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, 0x7A77, + 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, 0x7A7B, 0xB78B, + 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, 0x7A7F, 0xB4A9, 0x7A80, + 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, + 0x7A85, 0xB790, 0x7A86, 0xF1B9, 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, + 0xB792, 0x7A8A, 0xB793, 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, + 0x7A8E, 0xB796, 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, + 0xD6CF, 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, 0x7A9B, + 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, 0x7A9F, 0xBFDF, + 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, 0x7AA3, 0xB840, 0x7AA4, + 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, + 0x7AA9, 0xB843, 0x7AAA, 0xB844, 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, + 0xF1C0, 0x7AAE, 0xB846, 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, + 0x7AB2, 0xB84A, 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, + 0xB84D, 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, 0x7ABF, + 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, 0x7AC3, 0xB859, + 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, 0x7AC7, 0xB85D, 0x7AC8, + 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, + 0x7ACD, 0xB862, 0x7ACE, 0xB863, 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, + 0xB866, 0x7AD2, 0xB867, 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, + 0x7AD6, 0xCAFA, 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, + 0xB86D, 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, 0x7AE3, + 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, 0x7AE7, 0xB874, + 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, 0x7AEB, 0xB878, 0x7AEC, + 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, + 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, + 0xB881, 0x7AF6, 0xB882, 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, + 0x7AFA, 0xF3C3, 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, + 0xB887, 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, 0x7B07, + 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, 0x7B0B, 0xCBF1, + 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, 0x7B0F, 0xF3CB, 0x7B10, + 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, 0x7B13, 0xB893, 0x7B14, 0xB1CA, + 0x7B15, 0xF3C8, 0x7B16, 0xB894, 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, + 0xF3CF, 0x7B1A, 0xB897, 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, + 0x7B1E, 0xF3D7, 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, + 0xB89C, 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, + 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, 0x7B2B, + 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, 0x7B2F, 0xB940, + 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, 0x7B33, 0xF3D5, 0x7B34, + 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, 0x7B37, 0xB946, 0x7B38, 0xF3CD, + 0x7B39, 0xB947, 0x7B3A, 0xBCE3, 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, + 0xB949, 0x7B3E, 0xF3D6, 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, + 0x7B42, 0xB94D, 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, + 0xB950, 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, 0x7B4F, + 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, 0x7B53, 0xB955, + 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, 0x7B57, 0xB957, 0x7B58, + 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, + 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, + 0xB95C, 0x7B62, 0xF3E1, 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, + 0x7B66, 0xB960, 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, + 0xB964, 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, + 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, 0x7B73, + 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, 0x7B77, 0xBFEA, + 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, 0x7B7B, 0xF3E0, 0x7B7C, + 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, 0x7B7F, 0xB971, 0x7B80, 0xBCF2, + 0x7B81, 0xB972, 0x7B82, 0xB973, 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, + 0xF3EB, 0x7B86, 0xB976, 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, + 0x7B8A, 0xB97A, 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, + 0xB97D, 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, 0x7B97, + 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, 0x7B9B, 0xB987, + 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, 0x7B9F, 0xB989, 0x7BA0, + 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, + 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, + 0xC2E1, 0x7BAA, 0xF3EC, 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, + 0x7BAE, 0xB98E, 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, + 0xB991, 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, + 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, 0x7BBB, + 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, 0x7BBF, 0xB99C, + 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, 0x7BC3, 0xB99F, 0x7BC4, + 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, + 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, + 0xBA45, 0x7BCE, 0xBA46, 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, + 0x7BD2, 0xBA49, 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, + 0xBA4C, 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, 0x7BDF, + 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, 0x7BE3, 0xBA55, + 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, 0x7BE7, 0xBA57, 0x7BE8, + 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, + 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, + 0xC0E9, 0x7BF2, 0xBA5F, 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, + 0x7BF6, 0xBA63, 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, + 0xBA66, 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, + 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, 0x7C03, + 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, 0x7C07, 0xB4D8, + 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, 0x7C0B, 0xF3FE, 0x7C0C, + 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, + 0x7C11, 0xBA77, 0x7C12, 0xBA78, 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, + 0xBA7B, 0x7C16, 0xF3FD, 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, + 0x7C1A, 0xBA80, 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, + 0xBA84, 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, 0x7C27, + 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, 0x7C2B, 0xBA8D, + 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, 0x7C2F, 0xBA91, 0x7C30, + 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, 0x7C33, 0xBA95, 0x7C34, 0xBA96, + 0x7C35, 0xBA97, 0x7C36, 0xBA98, 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, + 0xBA9A, 0x7C3A, 0xBA9B, 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, + 0x7C3E, 0xBA9F, 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, + 0xBAA0, 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, + 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, 0x7C4B, + 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, 0x7C4F, 0xBB4B, + 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, 0x7C53, 0xBB4F, 0x7C54, + 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, 0x7C57, 0xBB53, 0x7C58, 0xBB54, + 0x7C59, 0xBB55, 0x7C5A, 0xBB56, 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, + 0xBB59, 0x7C5E, 0xBB5A, 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, + 0x7C62, 0xBB5E, 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, + 0xBB62, 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, 0x7C6F, + 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, 0x7C73, 0xC3D7, + 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, 0x7C77, 0xBB71, 0x7C78, + 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, + 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, + 0xBB78, 0x7C82, 0xBB79, 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, + 0x7C86, 0xBB7D, 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, + 0xBB81, 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, + 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, 0x7C93, + 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, 0x7C97, 0xB4D6, + 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, 0x7C9B, 0xBB8D, 0x7C9C, + 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, + 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, + 0xD6E0, 0x7CA6, 0xBB91, 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, + 0x7CAA, 0xB7E0, 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, + 0xC1B8, 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, 0x7CB7, + 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, 0x7CBB, 0xBBA0, + 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, 0x7CBF, 0xBC40, 0x7CC0, + 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, + 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, + 0xBC46, 0x7CCA, 0xBAFD, 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, + 0x7CCE, 0xBC48, 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, + 0xBC4C, 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, 0x7CDB, + 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, 0x7CDF, 0xD4E3, + 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, 0x7CE3, 0xBC56, 0x7CE4, + 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, + 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, + 0xBC5F, 0x7CEE, 0xBC60, 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, + 0x7CF2, 0xBC63, 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, + 0xBC67, 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, 0x7CFF, + 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, 0x7D03, 0xBC72, + 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, 0x7D07, 0xBC76, 0x7D08, + 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, + 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, + 0xBC80, 0x7D12, 0xBC81, 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, + 0x7D16, 0xBC85, 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, + 0xBC89, 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, + 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, 0x7D23, + 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, 0x7D27, 0xBDF4, + 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, 0x7D2B, 0xD7CF, 0x7D2C, + 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, + 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, + 0xBC9F, 0x7D36, 0xBCA0, 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, + 0x7D3A, 0xBD43, 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, + 0xBD47, 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, 0x7D47, + 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, 0x7D4B, 0xBD54, + 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, 0x7D4F, 0xBD58, 0x7D50, + 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, + 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, + 0xBD62, 0x7D5A, 0xBD63, 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, + 0x7D5E, 0xBD67, 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, + 0xBD6B, 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, + 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, 0x7D6B, + 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, 0x7D6F, 0xBD77, + 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, 0x7D73, 0xBD7B, 0x7D74, + 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, 0x7D77, 0xF4EA, 0x7D78, 0xBD80, + 0x7D79, 0xBD81, 0x7D7A, 0xBD82, 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, + 0xBD85, 0x7D7E, 0xBD86, 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, + 0x7D82, 0xBD8A, 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, + 0xBD8E, 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, 0x7D8F, + 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, 0x7D93, 0xBD9B, + 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, 0x7D97, 0xBD9F, 0x7D98, + 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, + 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, + 0xBE48, 0x7DA2, 0xBE49, 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, + 0x7DA6, 0xF4EB, 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, + 0xBE50, 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, + 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, 0x7DB3, + 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, 0x7DB7, 0xBE5C, + 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, 0x7DBB, 0xBE60, 0x7DBC, + 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, + 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, + 0xBE6A, 0x7DC6, 0xBE6B, 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, + 0x7DCA, 0xBE6F, 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, + 0xBE73, 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, 0x7DD7, + 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, 0x7DDB, 0xBE81, + 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, 0x7DDF, 0xBE85, 0x7DE0, + 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, + 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, + 0xBE8F, 0x7DEA, 0xBE90, 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, + 0x7DEE, 0xBE94, 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, + 0xBE98, 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, + 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, 0x7DFB, + 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, 0x7DFF, 0xBF44, + 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, 0x7E03, 0xBF48, 0x7E04, + 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, + 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, + 0xBF52, 0x7E0E, 0xBF53, 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, + 0x7E12, 0xBF57, 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, + 0xBF5B, 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, 0x7E1F, + 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, 0x7E23, 0xBF68, + 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, 0x7E27, 0xBF6C, 0x7E28, + 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, + 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, + 0xBF76, 0x7E32, 0xBF77, 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, + 0x7E36, 0xBF7B, 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, + 0xBF80, 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, + 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, 0x7E43, + 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, 0x7E47, 0xF4ED, + 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, 0x7E4B, 0xBF8E, 0x7E4C, + 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, 0x7E4F, 0xBF92, 0x7E50, 0xBF93, + 0x7E51, 0xBF94, 0x7E52, 0xBF95, 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, + 0xBF98, 0x7E56, 0xBF99, 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, + 0x7E5A, 0xBF9D, 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, + 0xC040, 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, 0x7E67, + 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, 0x7E6B, 0xC04D, + 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, 0x7E6F, 0xC051, 0x7E70, + 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, 0x7E73, 0xC055, 0x7E74, 0xC056, + 0x7E75, 0xC057, 0x7E76, 0xC058, 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, + 0xC05B, 0x7E7A, 0xC05C, 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, + 0x7E7E, 0xC060, 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, + 0xD7EB, 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, + 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, 0x7E8B, + 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, 0x7E8F, 0xC070, + 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, 0x7E93, 0xC074, 0x7E94, + 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, 0x7E97, 0xC078, 0x7E98, 0xC079, + 0x7E99, 0xC07A, 0x7E9A, 0xC07B, 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, + 0xC07D, 0x7E9E, 0xC07E, 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, + 0x7EA2, 0xBAEC, 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, + 0xD4BC, 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, 0x7EAF, + 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, 0x7EB3, 0xC4C9, + 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, 0x7EB7, 0xB7D7, 0x7EB8, + 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, 0x7EBB, 0xC082, 0x7EBC, 0xC083, + 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, + 0xE7A5, 0x7EC2, 0xE7A6, 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, + 0x7EC6, 0xCFB8, 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, + 0xB0ED, 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, 0x7ED3, + 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, 0x7ED7, 0xE7AC, + 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, 0x7EDB, 0xE7AD, 0x7EDC, + 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, + 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, + 0xCBE7, 0x7EE6, 0xCCD0, 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, + 0x7EEA, 0xD0F7, 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, + 0xE7B2, 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, 0x7EF7, + 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, 0x7EFB, 0xE7B9, + 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, 0x7EFF, 0xC2CC, 0x7F00, + 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, + 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, + 0xBCA9, 0x7F0A, 0xC088, 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, + 0x7F0E, 0xB6D0, 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, + 0xE7C4, 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, 0x7F1B, + 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, 0x7F1F, 0xE7C9, + 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, 0x7F23, 0xE7CC, 0x7F24, + 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, + 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, + 0xE7D4, 0x7F2E, 0xC9C9, 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, + 0x7F32, 0xE7D8, 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, + 0xF3BE, 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, 0x7F3F, + 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, 0x7F43, 0xC094, + 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, 0x7F47, 0xC096, 0x7F48, + 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, + 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, + 0xCDF8, 0x7F52, 0xC09F, 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, + 0x7F56, 0xC140, 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, + 0xB7A3, 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, + 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, 0x7F63, + 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, 0x7F67, 0xC14B, + 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, 0x7F6B, 0xC14C, 0x7F6C, + 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, 0x7F6F, 0xC14F, 0x7F70, 0xC150, + 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, + 0xC152, 0x7F76, 0xC153, 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, + 0x7F7A, 0xC156, 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, + 0xEEC0, 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, 0x7F87, + 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, 0x7F8B, 0xC164, + 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, 0x7F8F, 0xC166, 0x7F90, + 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, 0x7F93, 0xC16A, 0x7F94, 0xB8E1, + 0x7F95, 0xC16B, 0x7F96, 0xC16C, 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, + 0xC16F, 0x7F9A, 0xC1E7, 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, + 0x7F9E, 0xD0DF, 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, + 0xC173, 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, + 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, 0x7FAB, + 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, 0x7FAF, 0xF4C9, + 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, 0x7FB3, 0xC180, 0x7FB4, + 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, + 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, + 0xD3F0, 0x7FBE, 0xC187, 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, + 0x7FC2, 0xC189, 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, + 0xC18C, 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, 0x7FCF, + 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, 0x7FD3, 0xC196, + 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, 0x7FD7, 0xC198, 0x7FD8, + 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, + 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, + 0xF4E4, 0x7FE2, 0xC19F, 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, + 0x7FE6, 0xF4E5, 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, + 0xC243, 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, + 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, 0x7FF3, + 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, 0x7FF7, 0xC24C, + 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, 0x7FFB, 0xB7AD, 0x7FFC, + 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, 0x7FFF, 0xC252, 0x8000, 0xD2AB, + 0x8001, 0xC0CF, 0x8002, 0xC253, 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, + 0xD5DF, 0x8006, 0xEAC8, 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, + 0x800A, 0xC257, 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, + 0xC258, 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, 0x8017, + 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, 0x801B, 0xC25D, + 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, 0x801F, 0xC260, 0x8020, + 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, 0x8023, 0xC262, 0x8024, 0xC263, + 0x8025, 0xF1ED, 0x8026, 0xF1EE, 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, + 0xF1F0, 0x802A, 0xC5D5, 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, + 0x802E, 0xC267, 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, + 0xC26A, 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, + 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, 0x803B, + 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, 0x803F, 0xB9A2, + 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, 0x8043, 0xF1F5, 0x8044, + 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, 0x8047, 0xC274, 0x8048, 0xC275, + 0x8049, 0xC276, 0x804A, 0xC1C4, 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, + 0xF1F7, 0x804E, 0xC277, 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, + 0x8052, 0xF1F8, 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, + 0xC27D, 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, 0x805F, + 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, 0x8063, 0xC289, + 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, 0x8067, 0xC28D, 0x8068, + 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, 0x806B, 0xC28F, 0x806C, 0xC290, + 0x806D, 0xC291, 0x806E, 0xC292, 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, + 0xF1FA, 0x8072, 0xC295, 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, + 0x8076, 0xC299, 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, + 0xC29D, 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, + 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, 0x8083, + 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, 0x8087, 0xD5D8, + 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, 0x808B, 0xC0DF, 0x808C, + 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, 0x808F, 0xC348, 0x8090, 0xC349, + 0x8091, 0xC34A, 0x8092, 0xC34B, 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, + 0xC34D, 0x8096, 0xD0A4, 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, + 0x809A, 0xB6C7, 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, + 0xC350, 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, 0x80A7, + 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, 0x80AB, 0xEBC6, + 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, 0x80AF, 0xBFCF, 0x80B0, + 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, 0x80B3, 0xC357, 0x80B4, 0xEBC8, + 0x80B5, 0xC358, 0x80B6, 0xC359, 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, + 0xC35B, 0x80BA, 0xB7CE, 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, + 0x80BE, 0xC9F6, 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, + 0xEBCF, 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, + 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, 0x80CB, + 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, 0x80CF, 0xC363, + 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, 0x80D3, 0xC367, 0x80D4, + 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, 0x80D7, 0xEBD3, 0x80D8, 0xC36A, + 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, + 0xEBD5, 0x80DE, 0xB0FB, 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, + 0x80E2, 0xC36D, 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, + 0xC36F, 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, 0x80EF, + 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, 0x80F3, 0xB8EC, + 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, 0x80F7, 0xC372, 0x80F8, + 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, 0x80FB, 0xC374, 0x80FC, 0xEBDD, + 0x80FD, 0xC4DC, 0x80FE, 0xC375, 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, + 0xC378, 0x8102, 0xD6AC, 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, + 0x8106, 0xB4E0, 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, + 0xBCB9, 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, + 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, 0x8113, + 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, 0x8117, 0xC382, + 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, 0x811B, 0xC384, 0x811C, + 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, 0x811F, 0xC387, 0x8120, 0xC388, + 0x8121, 0xC389, 0x8122, 0xC38A, 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, + 0xC38D, 0x8126, 0xC38E, 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, + 0x812A, 0xC392, 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, + 0xC395, 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, 0x8137, + 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, 0x813B, 0xC39D, + 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, 0x813F, 0xC3A0, 0x8140, + 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, 0x8143, 0xC443, 0x8144, 0xC444, + 0x8145, 0xC445, 0x8146, 0xCCF3, 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, + 0xC447, 0x814A, 0xC0B0, 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, + 0x814E, 0xC449, 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, + 0xC44B, 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, + 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, 0x815B, + 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, 0x815F, 0xC453, + 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, 0x8163, 0xC456, 0x8164, + 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, 0x8167, 0xEBF2, 0x8168, 0xC459, + 0x8169, 0xEBEE, 0x816A, 0xC45A, 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, + 0xEBF1, 0x816E, 0xC8F9, 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, + 0x8172, 0xC45E, 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, + 0xC461, 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, 0x817F, + 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, 0x8183, 0xC465, + 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, 0x8187, 0xC469, 0x8188, + 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, 0x818B, 0xC46B, 0x818C, 0xC46C, + 0x818D, 0xC46D, 0x818E, 0xC46E, 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, + 0xEBF7, 0x8192, 0xC470, 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, + 0x8196, 0xC474, 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, + 0xC477, 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, + 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, 0x81A3, + 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, 0x81A7, 0xC480, + 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, 0x81AB, 0xC482, 0x81AC, + 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, 0x81AF, 0xC486, 0x81B0, 0xC487, + 0x81B1, 0xC488, 0x81B2, 0xC489, 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, + 0xC48B, 0x81B6, 0xC48C, 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, + 0x81BA, 0xE2DF, 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, + 0xC492, 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, 0x81C7, + 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, 0x81CB, 0xC499, + 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, 0x81CF, 0xC49C, 0x81D0, + 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, 0x81D3, 0xC4A0, 0x81D4, 0xC540, + 0x81D5, 0xC541, 0x81D6, 0xC542, 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, + 0xC545, 0x81DA, 0xC546, 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, + 0x81DE, 0xC54A, 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, + 0xC54E, 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, + 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, 0x81EB, + 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, 0x81EF, 0xC556, + 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, 0x81F3, 0xD6C1, 0x81F4, + 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, 0x81F7, 0xC55C, 0x81F8, 0xC55D, + 0x81F9, 0xC55E, 0x81FA, 0xC55F, 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, + 0xC560, 0x81FE, 0xF4A7, 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, + 0x8202, 0xF4A9, 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, + 0xD3DF, 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, 0x820F, + 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, 0x8213, 0xC56B, + 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, 0x8217, 0xC56E, 0x8218, + 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, 0x821B, 0xE2B6, 0x821C, 0xCBB4, + 0x821D, 0xC572, 0x821E, 0xCEE8, 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, + 0xF4AD, 0x8222, 0xF4AE, 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, + 0x8226, 0xC576, 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, + 0xBABD, 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, + 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, 0x8233, + 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, 0x8237, 0xCFCF, + 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, 0x823B, 0xF4B5, 0x823C, + 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, 0x823F, 0xC57E, 0x8240, 0xC580, + 0x8241, 0xC581, 0x8242, 0xC582, 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, + 0xC584, 0x8246, 0xC585, 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, + 0x824A, 0xC587, 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, + 0xC58A, 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, 0x8257, + 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, 0x825B, 0xC594, + 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, 0x825F, 0xF4BE, 0x8260, + 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, 0x8263, 0xC59B, 0x8264, 0xC59C, + 0x8265, 0xC59D, 0x8266, 0xC59E, 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, + 0xC5A0, 0x826A, 0xC640, 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, + 0x826E, 0xF4DE, 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, + 0xC9AB, 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, + 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, 0x827B, + 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, 0x827F, 0xDCB5, + 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, 0x8283, 0xC64D, 0x8284, + 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, 0x8287, 0xC650, 0x8288, 0xD8C2, + 0x8289, 0xC651, 0x828A, 0xDCB7, 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, + 0xC9D6, 0x828E, 0xDCBA, 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, + 0x8292, 0xC3A2, 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, + 0xC657, 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, 0x829F, + 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, 0x82A3, 0xC65D, + 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, 0x82A7, 0xC65E, 0x82A8, + 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, + 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, + 0xBBA8, 0x82B2, 0xC65F, 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, + 0x82B6, 0xC661, 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, + 0xC662, 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, + 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, 0x82C3, + 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, 0x82C7, 0xCEAD, + 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, 0x82CB, 0xDCC8, 0x82CC, + 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, 0x82CF, 0xCBD5, 0x82D0, 0xC66C, + 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, + 0xDCE6, 0x82D6, 0xC66D, 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, + 0x82DA, 0xC66F, 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, + 0xB0FA, 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, 0x82E7, + 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, 0x82EB, 0xC9BB, + 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, 0x82EF, 0xB1BD, 0x82F0, + 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, 0x82F3, 0xC67B, 0x82F4, 0xDCDA, + 0x82F5, 0xC67C, 0x82F6, 0xC67D, 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, + 0xC6BB, 0x82FA, 0xC680, 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, + 0x82FE, 0xC683, 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, + 0xC3AF, 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, + 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, 0x830B, + 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, 0x830F, 0xDCD7, + 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, 0x8313, 0xC68B, 0x8314, + 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, 0x8317, 0xDCF8, 0x8318, 0xC68D, + 0x8319, 0xC68E, 0x831A, 0xDCE1, 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, + 0xC68F, 0x831E, 0xC690, 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, + 0x8322, 0xC694, 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, + 0xC698, 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, 0x832F, + 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, 0x8333, 0xDCFC, + 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, 0x8337, 0xC69E, 0x8338, + 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, 0x833B, 0xC69F, 0x833C, 0xDCED, + 0x833D, 0xC6A0, 0x833E, 0xC740, 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, + 0xC742, 0x8342, 0xC743, 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, + 0x8346, 0xBEA3, 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, + 0xC747, 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, + 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, 0x8353, + 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, 0x8357, 0xC74F, + 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, 0x835B, 0xDCE9, 0x835C, + 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, 0x835F, 0xDCF6, 0x8360, 0xDCF9, + 0x8361, 0xB5B4, 0x8362, 0xC753, 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, + 0xDCFE, 0x8366, 0xDCFD, 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, + 0x836A, 0xDDA5, 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, + 0xDDA7, 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, 0x8377, + 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, 0x837B, 0xDDB6, + 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, 0x837F, 0xC75E, 0x8380, + 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, 0x8383, 0xC762, 0x8384, 0xC763, + 0x8385, 0xDDB0, 0x8386, 0xC6CE, 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, + 0xC0F2, 0x838A, 0xC766, 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, + 0x838E, 0xC9AF, 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, + 0xDCEC, 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, + 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, 0x839B, + 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, 0x839F, 0xC774, + 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, 0x83A3, 0xC777, 0x83A4, + 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, 0x83A7, 0xC77B, 0x83A8, 0xDDB9, + 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, + 0xC77D, 0x83AE, 0xC77E, 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, + 0x83B2, 0xC1AB, 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, + 0xDDB2, 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, 0x83BF, + 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, 0x83C3, 0xC786, + 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, 0x83C7, 0xB9BD, 0x83C8, + 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, 0x83CB, 0xC78B, 0x83CC, 0xBEFA, + 0x83CD, 0xC78C, 0x83CE, 0xC78D, 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, + 0xC78F, 0x83D2, 0xC790, 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, + 0x83D6, 0xDDC5, 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, + 0xC795, 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, + 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, 0x83E3, + 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, 0x83E7, 0xC79C, + 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, 0x83EB, 0xC79E, 0x83EC, + 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, 0x83EF, 0xC841, 0x83F0, 0xDDD4, + 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, + 0xC844, 0x83F6, 0xC845, 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, + 0x83FA, 0xC847, 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, + 0xC84A, 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, 0x8407, + 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, 0x840B, 0xDDC2, + 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, 0x840F, 0xDDCC, 0x8410, + 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, 0x8413, 0xC855, 0x8414, 0xC856, + 0x8415, 0xC857, 0x8416, 0xC858, 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, + 0xC85A, 0x841A, 0xC85B, 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, + 0x841E, 0xC85D, 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, + 0xC861, 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, + 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, 0x842B, + 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, 0x842F, 0xC869, + 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, 0x8433, 0xC86C, 0x8434, + 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, 0x8437, 0xC870, 0x8438, 0xDDC7, + 0x8439, 0xC871, 0x843A, 0xC872, 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, + 0xC2E4, 0x843E, 0xC874, 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, + 0x8442, 0xC878, 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, + 0xDDE1, 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, 0x844F, + 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, 0x8453, 0xC888, + 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, 0x8457, 0xD6F8, 0x8458, + 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, 0x845B, 0xB8F0, 0x845C, 0xDDD6, + 0x845D, 0xC88D, 0x845E, 0xC88E, 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, + 0xC6CF, 0x8462, 0xC891, 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, + 0x8466, 0xC894, 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, + 0xC897, 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, + 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, 0x8473, + 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, 0x8477, 0xC89D, + 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, 0x847B, 0xC89F, 0x847C, + 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, 0x847F, 0xC942, 0x8480, 0xC943, + 0x8481, 0xC944, 0x8482, 0xB5D9, 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, + 0xC947, 0x8486, 0xC948, 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, + 0x848A, 0xC949, 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, + 0xDDE5, 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, 0x8497, + 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, 0x849B, 0xC955, + 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, 0x849F, 0xC958, 0x84A0, + 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, 0x84A3, 0xC95B, 0x84A4, 0xC95C, + 0x84A5, 0xC95D, 0x84A6, 0xC95E, 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, + 0xC961, 0x84AA, 0xC962, 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, + 0x84AE, 0xC966, 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, + 0xC6D1, 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, + 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, 0x84BB, + 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, 0x84BF, 0xDDEF, + 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, 0x84C3, 0xC972, 0x84C4, + 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, 0x84C7, 0xC975, 0x84C8, 0xC976, + 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, + 0xDDE9, 0x84CE, 0xC979, 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, + 0x84D2, 0xC97B, 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, + 0xB1CD, 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, 0x84DF, + 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, 0x84E3, 0xDDF7, + 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, 0x84E7, 0xC989, 0x84E8, + 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, 0x84EB, 0xC98D, 0x84EC, 0xC5EE, + 0x84ED, 0xC98E, 0x84EE, 0xC98F, 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, + 0xC991, 0x84F2, 0xC992, 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, + 0x84F6, 0xC996, 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, + 0xC99A, 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, + 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, 0x8503, + 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, 0x8507, 0xCA44, + 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, 0x850B, 0xCA48, 0x850C, + 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, 0x850F, 0xCA4B, 0x8510, 0xCA4C, + 0x8511, 0xC3EF, 0x8512, 0xCA4D, 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, + 0xCA4F, 0x8516, 0xCA50, 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, + 0x851A, 0xCEB5, 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, + 0xCA56, 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, 0x8527, + 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, 0x852B, 0xC4E8, + 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, 0x852F, 0xCA63, 0x8530, + 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, 0x8533, 0xCA67, 0x8534, 0xCA68, + 0x8535, 0xCA69, 0x8536, 0xCA6A, 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, + 0xDDFC, 0x853A, 0xDDFE, 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, + 0x853E, 0xCA6B, 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, + 0xCA6F, 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, + 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, 0x854B, + 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, 0x854F, 0xCA78, + 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, 0x8553, 0xCA7C, 0x8554, + 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, 0x8557, 0xCA80, 0x8558, 0xCA81, + 0x8559, 0xDEA5, 0x855A, 0xCA82, 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, + 0xCA85, 0x855E, 0xDEA9, 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, + 0x8562, 0xCA89, 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, + 0xCA8C, 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, 0x856F, + 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, 0x8573, 0xCA97, + 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, 0x8577, 0xCA9A, 0x8578, + 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, 0x857B, 0xDEAE, 0x857C, 0xCA9C, + 0x857D, 0xCA9D, 0x857E, 0xC0D9, 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, + 0xCAA0, 0x8582, 0xCB40, 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, + 0x8586, 0xCB42, 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, + 0xCB45, 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, + 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, 0x8593, + 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, 0x8597, 0xCB51, + 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, 0x859B, 0xD1A6, 0x859C, + 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, 0x859F, 0xCB57, 0x85A0, 0xCB58, + 0x85A1, 0xCB59, 0x85A2, 0xCB5A, 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, + 0xCB5C, 0x85A6, 0xCB5D, 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, + 0x85AA, 0xD0BD, 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, + 0xDEB4, 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, 0x85B7, + 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, 0x85BB, 0xCB6B, + 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, 0x85BF, 0xCB6F, 0x85C0, + 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, 0x85C3, 0xCB72, 0x85C4, 0xCB73, + 0x85C5, 0xCB74, 0x85C6, 0xCB75, 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, + 0xBDE5, 0x85CA, 0xCB78, 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, + 0x85CE, 0xCB7C, 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, + 0xCB7E, 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, + 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, 0x85DB, + 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, 0x85DF, 0xCB89, + 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, 0x85E3, 0xCB8D, 0x85E4, + 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, 0x85E7, 0xCB90, 0x85E8, 0xCB91, + 0x85E9, 0xB7AA, 0x85EA, 0xCB92, 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, + 0xCB95, 0x85EE, 0xCB96, 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, + 0x85F2, 0xCB9A, 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, + 0xCB9E, 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, 0x85FF, + 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, 0x8603, 0xCC48, + 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, 0x8607, 0xCC4B, 0x8608, + 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, 0x860B, 0xCC4F, 0x860C, 0xCC50, + 0x860D, 0xCC51, 0x860E, 0xCC52, 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, + 0xC4A2, 0x8612, 0xCC55, 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, + 0x8616, 0xDEC1, 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, + 0xCC5C, 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, + 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, 0x8623, + 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, 0x8627, 0xDEBE, + 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, 0x862B, 0xCC6B, 0x862C, + 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, 0x862F, 0xCC6F, 0x8630, 0xCC70, + 0x8631, 0xCC71, 0x8632, 0xCC72, 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, + 0xCC75, 0x8636, 0xCC76, 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, + 0x863A, 0xCC79, 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, + 0xCC7C, 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, 0x8647, + 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, 0x864B, 0xCC8A, + 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, 0x864F, 0xC2B2, 0x8650, + 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, 0x8653, 0xCC8D, 0x8654, 0xF2AF, + 0x8655, 0xCC8E, 0x8656, 0xCC8F, 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, + 0xCC92, 0x865A, 0xD0E9, 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, + 0x865E, 0xD3DD, 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, + 0xEBBD, 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, + 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, 0x866B, + 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, 0x866F, 0xCD41, + 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, 0x8673, 0xCD44, 0x8674, + 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, 0x8677, 0xCD48, 0x8678, 0xCD49, + 0x8679, 0xBAE7, 0x867A, 0xF2B3, 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, + 0xCBE4, 0x867E, 0xCFBA, 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, + 0x8682, 0xC2EC, 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, + 0xCD4D, 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, 0x868F, + 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, 0x8693, 0xF2BE, + 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, 0x8697, 0xCD58, 0x8698, + 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, 0x869B, 0xCD5C, 0x869C, 0xD1C1, + 0x869D, 0xF2BA, 0x869E, 0xCD5D, 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, + 0xCD60, 0x86A2, 0xCD61, 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, + 0x86A6, 0xCD63, 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, + 0xF2BD, 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, + 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, 0x86B3, + 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, 0x86B7, 0xCD69, + 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, 0x86BB, 0xCD6C, 0x86BC, + 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, 0x86BF, 0xCD70, 0x86C0, 0xD6FB, + 0x86C1, 0xCD71, 0x86C2, 0xCD72, 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, + 0xCD74, 0x86C6, 0xC7F9, 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, + 0x86CA, 0xB9C6, 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, + 0xF2C3, 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, 0x86D7, + 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, 0x86DB, 0xD6EB, + 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, 0x86DF, 0xF2D4, 0x86E0, + 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, 0x86E3, 0xCD84, 0x86E4, 0xB8F2, + 0x86E5, 0xCD85, 0x86E6, 0xCD86, 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, + 0xF2CB, 0x86EA, 0xCD89, 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, + 0x86EE, 0xC2F9, 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, + 0xF2CD, 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, + 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, 0x86FB, + 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, 0x86FF, 0xCD94, + 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, 0x8703, 0xF2D7, 0x8704, + 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, 0x8707, 0xF2D8, 0x8708, 0xF2DA, + 0x8709, 0xF2DD, 0x870A, 0xF2DB, 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, + 0xF2DC, 0x870E, 0xCD9B, 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, + 0x8712, 0xD1D1, 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, + 0xCDA0, 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, 0x871F, + 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, 0x8723, 0xF2DE, + 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, 0x8727, 0xCE47, 0x8728, + 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, 0x872B, 0xCE4A, 0x872C, 0xCE4B, + 0x872D, 0xCE4C, 0x872E, 0xF2E2, 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, + 0xF2E7, 0x8732, 0xCE4F, 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, + 0x8736, 0xCE52, 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, + 0xCE55, 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, + 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, 0x8743, + 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, 0x8747, 0xD3AC, + 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, 0x874B, 0xCE60, 0x874C, + 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, 0x874F, 0xCE62, 0x8750, 0xCE63, + 0x8751, 0xCE64, 0x8752, 0xCE65, 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, + 0xCE67, 0x8756, 0xCE68, 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, + 0x875A, 0xCE6A, 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, + 0xCE6E, 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, 0x8767, + 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, 0x876B, 0xCE77, + 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, 0x876F, 0xCE7A, 0x8770, + 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, 0x8773, 0xCE7D, 0x8774, 0xBAFB, + 0x8775, 0xCE7E, 0x8776, 0xB5FB, 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, + 0xCE82, 0x877A, 0xCE83, 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, + 0x877E, 0xF2EE, 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, + 0xF2EB, 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, + 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, 0x878B, + 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, 0x878F, 0xCE8E, + 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, 0x8793, 0xF2FB, 0x8794, + 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, 0x8797, 0xF3A5, 0x8798, 0xCE95, + 0x8799, 0xCE96, 0x879A, 0xCE97, 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, + 0xCE9A, 0x879E, 0xCE9B, 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, + 0x87A2, 0xCE9E, 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, + 0xCF41, 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, 0x87AF, + 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, 0x87B3, 0xF3AB, + 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, 0x87B7, 0xCF4B, 0x87B8, + 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, + 0x87BD, 0xF3AE, 0x87BE, 0xCF50, 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, + 0xCF52, 0x87C2, 0xCF53, 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, + 0x87C6, 0xF3A1, 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, + 0xF3B1, 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, + 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, 0x87D3, + 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, 0x87D7, 0xCF62, + 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, 0x87DB, 0xF3B2, 0x87DC, + 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, 0x87DF, 0xCF69, 0x87E0, 0xF3B4, + 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, + 0xF3A8, 0x87E6, 0xCF6E, 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, + 0x87EA, 0xF3B3, 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, + 0xF3B5, 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, 0x87F7, + 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, 0x87FB, 0xCF81, + 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, 0x87FF, 0xCF84, 0x8800, + 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, 0x8803, 0xD9F9, 0x8804, 0xCF88, + 0x8805, 0xCF89, 0x8806, 0xCF8A, 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, + 0xCF8D, 0x880A, 0xF3B9, 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, + 0x880E, 0xCF91, 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, + 0xCF95, 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, + 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, 0x881B, + 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, 0x881F, 0xCF9E, + 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, 0x8823, 0xCFA0, 0x8824, + 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, 0x8827, 0xD043, 0x8828, 0xD044, + 0x8829, 0xD045, 0x882A, 0xD046, 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, + 0xD049, 0x882E, 0xD04A, 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, + 0x8832, 0xEEC3, 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, + 0xD051, 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, 0x883F, + 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, 0x8843, 0xD05B, + 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, 0x8847, 0xD05D, 0x8848, + 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, 0x884B, 0xD061, 0x884C, 0xD0D0, + 0x884D, 0xD1DC, 0x884E, 0xD062, 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, + 0xD065, 0x8852, 0xD066, 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, + 0x8856, 0xD069, 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, + 0xD06B, 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, + 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, 0x8863, + 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, 0x8867, 0xD073, + 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, 0x886B, 0xC9C0, 0x886C, + 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, 0x886F, 0xD076, 0x8870, 0xCBA5, + 0x8871, 0xD077, 0x8872, 0xF1C4, 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, + 0xD07A, 0x8876, 0xD07B, 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, + 0x887A, 0xD07E, 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, + 0xF4C0, 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, 0x8887, + 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, 0x888B, 0xB4FC, + 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, 0x888F, 0xD08A, 0x8890, + 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, 0x8893, 0xD08D, 0x8894, 0xD08E, + 0x8895, 0xD08F, 0x8896, 0xD0E4, 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, + 0xD092, 0x889A, 0xD093, 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, + 0x889E, 0xD096, 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, + 0xF1C8, 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, + 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, 0x88AB, + 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, 0x88AF, 0xD142, + 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, 0x88B3, 0xD145, 0x88B4, + 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, 0x88B7, 0xF1CA, 0x88B8, 0xD149, + 0x88B9, 0xD14A, 0x88BA, 0xD14B, 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, + 0xD14D, 0x88BE, 0xD14E, 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, + 0x88C2, 0xC1D1, 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, + 0xF1C9, 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, 0x88CF, + 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, 0x88D3, 0xD15C, + 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, 0x88D7, 0xD15E, 0x88D8, + 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, 0x88DB, 0xD160, 0x88DC, 0xD161, + 0x88DD, 0xD162, 0x88DE, 0xD163, 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, + 0xD165, 0x88E2, 0xF1CD, 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, + 0x88E6, 0xD166, 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, + 0xD169, 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, + 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, 0x88F3, + 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, 0x88F7, 0xD172, + 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, 0x88FB, 0xD174, 0x88FC, + 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, 0x88FF, 0xD176, 0x8900, 0xD177, + 0x8901, 0xD178, 0x8902, 0xB9D3, 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, + 0xD17B, 0x8906, 0xD17C, 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, + 0x890A, 0xF1DB, 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, + 0xD184, 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, 0x8917, + 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, 0x891B, 0xF1DA, + 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, 0x891F, 0xD18F, 0x8920, + 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, 0x8923, 0xD192, 0x8924, 0xD193, + 0x8925, 0xC8EC, 0x8926, 0xD194, 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, + 0xD197, 0x892A, 0xCDCA, 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, + 0x892E, 0xD19A, 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, + 0xD19D, 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, + 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, 0x893B, + 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, 0x893F, 0xD247, + 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, 0x8943, 0xD24A, 0x8944, + 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, 0x8947, 0xD24D, 0x8948, 0xD24E, + 0x8949, 0xD24F, 0x894A, 0xD250, 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, + 0xD253, 0x894E, 0xD254, 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, + 0x8952, 0xD258, 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, + 0xD25C, 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, 0x895F, + 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, 0x8963, 0xD267, + 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, 0x8967, 0xD26A, 0x8968, + 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, 0x896B, 0xD26E, 0x896C, 0xD26F, + 0x896D, 0xD270, 0x896E, 0xD271, 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, + 0xD274, 0x8972, 0xD275, 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, + 0x8976, 0xD279, 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, + 0xD27D, 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, + 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, 0x8983, + 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, 0x8987, 0xD286, + 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, 0x898B, 0xD28A, 0x898C, + 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, 0x898F, 0xD28E, 0x8990, 0xD28F, + 0x8991, 0xD290, 0x8992, 0xD291, 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, + 0xD294, 0x8996, 0xD295, 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, + 0x899A, 0xD299, 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, + 0xD29D, 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, 0x89A7, + 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, 0x89AB, 0xD349, + 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, 0x89AF, 0xD34D, 0x89B0, + 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, 0x89B3, 0xD351, 0x89B4, 0xD352, + 0x89B5, 0xD353, 0x89B6, 0xD354, 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, + 0xD357, 0x89BA, 0xD358, 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, + 0x89BE, 0xD35C, 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, + 0xB9DB, 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, 0x89CB, + 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, 0x89CF, 0xEAED, + 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, 0x89D3, 0xD361, 0x89D4, + 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, 0x89D7, 0xD364, 0x89D8, 0xD365, + 0x89D9, 0xD366, 0x89DA, 0xF5FD, 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, + 0xD368, 0x89DE, 0xF5FC, 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, + 0x89E2, 0xD36C, 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, + 0xB4A5, 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, 0x89EF, + 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, 0x89F3, 0xECB2, + 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, 0x89F7, 0xD37B, 0x89F8, + 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, 0x89FB, 0xD380, 0x89FC, 0xD381, + 0x89FD, 0xD382, 0x89FE, 0xD383, 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, + 0xD385, 0x8A02, 0xD386, 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, + 0x8A06, 0xD38A, 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, + 0xD38D, 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, + 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, 0x8A13, + 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, 0x8A17, 0xD39A, + 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, 0x8A1B, 0xD39E, 0x8A1C, + 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, 0x8A1F, 0xD441, 0x8A20, 0xD442, + 0x8A21, 0xD443, 0x8A22, 0xD444, 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, + 0xD447, 0x8A26, 0xD448, 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, + 0x8A2A, 0xD44C, 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, + 0xD450, 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, 0x8A37, + 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, 0x8A3B, 0xD45D, + 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, 0x8A3F, 0xD460, 0x8A40, + 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, 0x8A43, 0xD464, 0x8A44, 0xD465, + 0x8A45, 0xD466, 0x8A46, 0xD467, 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, + 0xD469, 0x8A4A, 0xD46A, 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, + 0x8A4E, 0xD46E, 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, + 0xD472, 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, + 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, 0x8A5B, + 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, 0x8A5F, 0xD480, + 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, 0x8A63, 0xD484, 0x8A64, + 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, 0x8A67, 0xD488, 0x8A68, 0xD489, + 0x8A69, 0xD48A, 0x8A6A, 0xD48B, 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, + 0xD48E, 0x8A6E, 0xD48F, 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, + 0x8A72, 0xD493, 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, + 0xD497, 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, 0x8A7F, + 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, 0x8A83, 0xD542, + 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, 0x8A87, 0xD546, 0x8A88, + 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, 0x8A8B, 0xD548, 0x8A8C, 0xD549, + 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, + 0xD54E, 0x8A92, 0xD54F, 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, + 0x8A96, 0xD552, 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, + 0xD556, 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, + 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, 0x8AA3, + 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, 0x8AA7, 0xD563, + 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, 0x8AAB, 0xD567, 0x8AAC, + 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, + 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, + 0xD571, 0x8AB6, 0xD572, 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, + 0x8ABA, 0xD576, 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, + 0xD57A, 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, 0x8AC7, + 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, 0x8ACB, 0xD588, + 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, 0x8ACF, 0xD58C, 0x8AD0, + 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, 0x8AD3, 0xD590, 0x8AD4, 0xD591, + 0x8AD5, 0xD592, 0x8AD6, 0xD593, 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, + 0xD596, 0x8ADA, 0xD597, 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, + 0x8ADE, 0xD59B, 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, + 0xD59F, 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, + 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, 0x8AEB, + 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, 0x8AEF, 0xD64B, + 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, 0x8AF3, 0xD64F, 0x8AF4, + 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, 0x8AF7, 0xD653, 0x8AF8, 0xD654, + 0x8AF9, 0xD655, 0x8AFA, 0xD656, 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, + 0xD659, 0x8AFE, 0xD65A, 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, + 0x8B02, 0xD65E, 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, + 0xD662, 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, 0x8B0F, + 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, 0x8B13, 0xD66E, + 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, 0x8B17, 0xD672, 0x8B18, + 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, 0x8B1B, 0xD676, 0x8B1C, 0xD677, + 0x8B1D, 0xD678, 0x8B1E, 0xD679, 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, + 0xD67C, 0x8B22, 0xD67D, 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, + 0x8B26, 0xF6A5, 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, + 0xD685, 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, + 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, 0x8B33, + 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, 0x8B37, 0xD692, + 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, 0x8B3B, 0xD696, 0x8B3C, + 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, 0x8B3F, 0xD69A, 0x8B40, 0xD69B, + 0x8B41, 0xD69C, 0x8B42, 0xD69D, 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, + 0xD6A0, 0x8B46, 0xD740, 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, + 0x8B4A, 0xD744, 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, + 0xD748, 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, 0x8B57, + 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, 0x8B5B, 0xD755, + 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, 0x8B5F, 0xD759, 0x8B60, + 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, 0x8B63, 0xD75D, 0x8B64, 0xD75E, + 0x8B65, 0xD75F, 0x8B66, 0xBEAF, 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, + 0xD762, 0x8B6A, 0xD763, 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, + 0x8B6E, 0xD766, 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, + 0xD76A, 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, + 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, 0x8B7B, + 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, 0x8B7F, 0xD777, + 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, 0x8B83, 0xD77B, 0x8B84, + 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, 0x8B87, 0xD780, 0x8B88, 0xD781, + 0x8B89, 0xD782, 0x8B8A, 0xD783, 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, + 0xD786, 0x8B8E, 0xD787, 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, + 0x8B92, 0xD78B, 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, + 0xD78F, 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, 0x8B9F, + 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, 0x8BA3, 0xB8BC, + 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, 0x8BA7, 0xDAA7, 0x8BA8, + 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, + 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, + 0xD79A, 0x8BB2, 0xBDB2, 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, + 0x8BB6, 0xD1C8, 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, + 0xC2DB, 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, 0x8BC3, + 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, 0x8BC7, 0xD79C, + 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, 0x8BCB, 0xDAAE, 0x8BCC, + 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, + 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, + 0xCAD4, 0x8BD6, 0xDAB4, 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, + 0x8BDA, 0xB3CF, 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, + 0xB5AE, 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, 0x8BE7, + 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, 0x8BEB, 0xBDEB, + 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, 0x8BEF, 0xCEF3, 0x8BF0, + 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, + 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, + 0xDAC1, 0x8BFA, 0xC5B5, 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, + 0x8BFE, 0xBFCE, 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, + 0xDAC5, 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, 0x8C0B, + 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, 0x8C0F, 0xDAC9, + 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, 0x8C13, 0xCEBD, 0x8C14, + 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, + 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, + 0xDAD2, 0x8C1E, 0xD7A0, 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, + 0x8C22, 0xD0BB, 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, + 0xC7AB, 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, 0x8C2F, + 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, 0x8C33, 0xDADD, + 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, 0x8C37, 0xB9C8, 0x8C38, + 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, 0x8C3B, 0xD843, 0x8C3C, 0xD844, + 0x8C3D, 0xD845, 0x8C3E, 0xD846, 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, + 0xBBED, 0x8C42, 0xD849, 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, + 0x8C46, 0xB6B9, 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, + 0xD84E, 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, + 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, 0x8C53, + 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, 0x8C57, 0xD859, + 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, 0x8C5B, 0xD85C, 0x8C5C, + 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, 0x8C5F, 0xD860, 0x8C60, 0xD861, + 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, + 0xD864, 0x8C66, 0xD865, 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, + 0x8C6A, 0xBAC0, 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, + 0xD86B, 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, 0x8C77, + 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, 0x8C7B, 0xD874, + 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, 0x8C7F, 0xD878, 0x8C80, + 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, 0x8C83, 0xD87B, 0x8C84, 0xD87C, + 0x8C85, 0xF5F7, 0x8C86, 0xD87D, 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, + 0xBAD1, 0x8C8A, 0xF5F6, 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, + 0x8C8E, 0xD883, 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, + 0xD887, 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, + 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, 0x8C9B, + 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, 0x8C9F, 0xD892, + 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, 0x8CA3, 0xD896, 0x8CA4, + 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, + 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, + 0xD8A0, 0x8CAE, 0xD940, 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, + 0x8CB2, 0xD944, 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, + 0xD948, 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, 0x8CBF, + 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, 0x8CC3, 0xD955, + 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, 0x8CC7, 0xD959, 0x8CC8, + 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, + 0x8CCD, 0xD95F, 0x8CCE, 0xD960, 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, + 0xD963, 0x8CD2, 0xD964, 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, + 0x8CD6, 0xD968, 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, + 0xD96C, 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, + 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, 0x8CE3, + 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, 0x8CE7, 0xD979, + 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, 0x8CEB, 0xD97D, 0x8CEC, + 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, 0x8CEF, 0xD982, 0x8CF0, 0xD983, + 0x8CF1, 0xD984, 0x8CF2, 0xD985, 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, + 0xD988, 0x8CF6, 0xD989, 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, + 0x8CFA, 0xD98D, 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, + 0xD991, 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, 0x8D07, + 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, 0x8D0B, 0xD99E, + 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, 0x8D0F, 0xDA41, 0x8D10, + 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, 0x8D13, 0xDA45, 0x8D14, 0xDA46, + 0x8D15, 0xDA47, 0x8D16, 0xDA48, 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, + 0xDA4B, 0x8D1A, 0xDA4C, 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, + 0x8D1E, 0xD5EA, 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, + 0xB2C6, 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, 0x8D2B, + 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, 0x8D2F, 0xB9E1, + 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, 0x8D33, 0xEADB, 0x8D34, + 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, + 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, + 0xEADE, 0x8D3E, 0xBCD6, 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, + 0x8D42, 0xC2B8, 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, + 0xEAE1, 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, 0x8D4F, + 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, 0x8D53, 0xE2D9, + 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, 0x8D57, 0xDA52, 0x8D58, + 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, + 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, + 0xC9C4, 0x8D62, 0xD3AE, 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, + 0x8D66, 0xC9E2, 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, + 0xDA57, 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, + 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, 0x8D73, + 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, 0x8D77, 0xC6F0, + 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, 0x8D7B, 0xDA60, 0x8D7C, + 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, 0x8D7F, 0xDA64, 0x8D80, 0xDA65, + 0x8D81, 0xB3C3, 0x8D82, 0xDA66, 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, + 0xB3AC, 0x8D86, 0xDA68, 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, + 0x8D8A, 0xD4BD, 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, + 0xDA6E, 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, 0x8D97, + 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, 0x8D9B, 0xDA79, + 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, 0x8D9F, 0xCCCB, 0x8DA0, + 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, + 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, + 0xDA86, 0x8DAA, 0xDA87, 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, + 0x8DAE, 0xDA8B, 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, + 0xDA8E, 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, + 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, 0x8DBB, + 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, 0x8DBF, 0xF5C1, + 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, 0x8DC3, 0xD4BE, 0x8DC4, + 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, + 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, + 0xDA9C, 0x8DCE, 0xF5C9, 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, + 0x8DD2, 0xDA9E, 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, + 0xF5C5, 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, 0x8DDF, + 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, 0x8DE3, 0xF5D0, + 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, 0x8DE7, 0xDB49, 0x8DE8, + 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, + 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, + 0xDB4E, 0x8DF2, 0xDB4F, 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, + 0x8DF6, 0xDB51, 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, + 0xB6E5, 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, + 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, 0x8E03, + 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, 0x8E07, 0xDB5B, + 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, 0x8E0B, 0xDB5D, 0x8E0C, + 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, + 0x8E11, 0xDB61, 0x8E12, 0xDB62, 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, + 0xDB64, 0x8E16, 0xDB65, 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, + 0x8E1A, 0xDB69, 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, + 0xBEE1, 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, 0x8E27, + 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, 0x8E2B, 0xDB73, + 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, 0x8E2F, 0xF5DC, 0x8E30, + 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, 0x8E33, 0xDB77, 0x8E34, 0xDB78, + 0x8E35, 0xF5E0, 0x8E36, 0xDB79, 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, + 0xF5DF, 0x8E3A, 0xF5DD, 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, + 0x8E3E, 0xDB7E, 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, + 0xF5E5, 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, + 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, 0x8E4B, + 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, 0x8E4F, 0xDB87, + 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, 0x8E53, 0xDB89, 0x8E54, + 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, + 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, + 0xDB92, 0x8E5E, 0xDB93, 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, + 0x8E62, 0xDB97, 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, + 0xB1C4, 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, 0x8E6F, + 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, 0x8E73, 0xDC40, + 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, 0x8E77, 0xDC42, 0x8E78, + 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, + 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, + 0xD4EA, 0x8E82, 0xDC4A, 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, + 0x8E86, 0xDC4D, 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, + 0xDC50, 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, + 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, 0x8E93, + 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, 0x8E97, 0xDC5A, + 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, 0x8E9B, 0xDC5E, 0x8E9C, + 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, + 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, + 0xDC66, 0x8EA6, 0xDC67, 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, + 0x8EAA, 0xDC6B, 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, + 0xDC6D, 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, 0x8EB7, + 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, 0x8EBB, 0xDC77, + 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, 0x8EBF, 0xDC7B, 0x8EC0, + 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, + 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, + 0xDC86, 0x8ECA, 0xDC87, 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, + 0x8ECE, 0xEAA6, 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, + 0xDC8E, 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, + 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, 0x8EDB, + 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, 0x8EDF, 0xDC9B, + 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, 0x8EE3, 0xDC9F, 0x8EE4, + 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, + 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, + 0xDD48, 0x8EEE, 0xDD49, 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, + 0x8EF2, 0xDD4D, 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, + 0xDD51, 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, 0x8EFF, + 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, 0x8F03, 0xDD5E, + 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, 0x8F07, 0xDD62, 0x8F08, + 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, + 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, + 0xDD6C, 0x8F12, 0xDD6D, 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, + 0x8F16, 0xDD71, 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, + 0xDD75, 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, + 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, 0x8F23, + 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, 0x8F27, 0xDD83, + 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, 0x8F2B, 0xDD87, 0x8F2C, + 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, + 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, + 0xDD91, 0x8F36, 0xDD92, 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, + 0x8F3A, 0xDD96, 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, + 0xDD9A, 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, 0x8F47, + 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, 0x8F4B, 0xDE46, + 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, 0x8F4F, 0xDE4A, 0x8F50, + 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, + 0x8F55, 0xDE50, 0x8F56, 0xDE51, 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, + 0xDE54, 0x8F5A, 0xDE55, 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, + 0x8F5E, 0xDE59, 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, + 0xDE5D, 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, 0x8F6B, + 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, 0x8F6F, 0xC8ED, + 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, 0x8F73, 0xE9F1, 0x8F74, + 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, + 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, + 0xD4D8, 0x8F7E, 0xE9F9, 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, + 0x8F82, 0xE9FB, 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, + 0xC1BE, 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, 0x8F8F, + 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, 0x8F93, 0xCAE4, + 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, 0x8F97, 0xD5B7, 0x8F98, + 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, + 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, + 0xDE67, 0x8FA2, 0xDE68, 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, + 0x8FA6, 0xDE6B, 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, + 0xDE6D, 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, + 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, 0x8FB3, + 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, 0x8FB7, 0xDE76, + 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, 0x8FBB, 0xDE79, 0x8FBC, + 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, + 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, + 0xD1B8, 0x8FC6, 0xDE7E, 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, + 0x8FCA, 0xDE81, 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, + 0xD3AD, 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, 0x8FD7, + 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, 0x8FDB, 0xBDF8, + 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, 0x8FDF, 0xB3D9, 0x8FE0, + 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, + 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, + 0xE5C7, 0x8FEA, 0xB5CF, 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, + 0x8FEE, 0xE5C5, 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, + 0xDE91, 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, + 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, 0x8FFB, + 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, 0x8FFF, 0xDE99, + 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, 0x9003, 0xCCD3, 0x9004, + 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, 0x9007, 0xDE9A, 0x9008, 0xDE9B, + 0x9009, 0xD1A1, 0x900A, 0xD1B7, 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, + 0xE5D0, 0x900E, 0xDE9D, 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, + 0x9012, 0xB5DD, 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, + 0xE5D1, 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, 0x901F, + 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, 0x9023, 0xDF42, + 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, 0x9027, 0xDF45, 0x9028, + 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, 0x902B, 0xDF49, 0x902C, 0xDF4A, + 0x902D, 0xE5D5, 0x902E, 0xB4FE, 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, + 0xDF4C, 0x9032, 0xDF4D, 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, + 0x9036, 0xE5D4, 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, + 0xDF52, 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, + 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, 0x9043, + 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, 0x9047, 0xD3F6, + 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, 0x904B, 0xDF5C, 0x904C, + 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, 0x904F, 0xB6F4, 0x9050, 0xE5DA, + 0x9051, 0xE5D8, 0x9052, 0xE5D9, 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, + 0xDF60, 0x9056, 0xDF61, 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, + 0x905A, 0xDF63, 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, + 0xDF66, 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, 0x9067, + 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, 0x906B, 0xDF6F, + 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, 0x906F, 0xDF71, 0x9070, + 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, 0x9073, 0xDF75, 0x9074, 0xE5E0, + 0x9075, 0xD7F1, 0x9076, 0xDF76, 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, + 0xDF79, 0x907A, 0xDF7A, 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, + 0x907E, 0xDF7D, 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, + 0xE5E2, 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, + 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, 0x908B, + 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, 0x908F, 0xDF89, + 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, 0x9093, 0xB5CB, 0x9094, + 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, 0x9097, 0xDAF5, 0x9098, 0xDF8E, + 0x9099, 0xDAF8, 0x909A, 0xDF8F, 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, + 0xDAF7, 0x909E, 0xDF91, 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, + 0x90A2, 0xD0CF, 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, + 0xB0EE, 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, 0x90AF, + 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, 0x90B3, 0xDAFC, + 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, 0x90B7, 0xDF9C, 0x90B8, + 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, + 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, + 0xD3F4, 0x90C2, 0xE040, 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, + 0x90C6, 0xE042, 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, + 0xBDBC, 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, 0x90D3, + 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, 0x90D7, 0xDBAD, + 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, 0x90DB, 0xDBAE, 0x90DC, + 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, 0x90DF, 0xE050, 0x90E0, 0xE051, + 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, + 0xE054, 0x90E6, 0xDBAA, 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, + 0x90EA, 0xE056, 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, + 0xE058, 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, 0x90F7, + 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, 0x90FB, 0xE062, + 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, 0x90FF, 0xE064, 0x9100, + 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, 0x9103, 0xE067, 0x9104, 0xDBB2, + 0x9105, 0xE068, 0x9106, 0xE069, 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, + 0xE06C, 0x910A, 0xE06D, 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, + 0x910E, 0xE071, 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, + 0xE075, 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, + 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, 0x911B, + 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, 0x911F, 0xE081, + 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, 0x9123, 0xDBB5, 0x9124, + 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, 0x9127, 0xE087, 0x9128, 0xE088, + 0x9129, 0xE089, 0x912A, 0xE08A, 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, + 0xE08D, 0x912E, 0xE08E, 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, + 0x9132, 0xE090, 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, + 0xE094, 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, 0x913F, + 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, 0x9143, 0xDBB9, + 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, 0x9147, 0xE141, 0x9148, + 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, 0x914B, 0xC7F5, 0x914C, 0xD7C3, + 0x914D, 0xC5E4, 0x914E, 0xF4FC, 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, + 0xE143, 0x9152, 0xBEC6, 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, + 0x9156, 0xE147, 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, + 0xB7D3, 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, + 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, 0x9163, + 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, 0x9167, 0xE14F, + 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, 0x916B, 0xE151, 0x916C, + 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, 0x916F, 0xF5A5, 0x9170, 0xF5A3, + 0x9171, 0xBDB4, 0x9172, 0xF5A8, 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, + 0xBDCD, 0x9176, 0xC3B8, 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, + 0x917A, 0xE154, 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, + 0xF5A7, 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, 0x9187, + 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, 0x918B, 0xB4D7, + 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, 0x918F, 0xE160, 0x9190, + 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, 0x9193, 0xE161, 0x9194, 0xE162, + 0x9195, 0xE163, 0x9196, 0xE164, 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, + 0xE167, 0x919A, 0xC3D1, 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, + 0x919E, 0xE16A, 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, + 0xF5B0, 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, + 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, 0x91AB, + 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, 0x91AF, 0xF5B5, + 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, 0x91B3, 0xE179, 0x91B4, + 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, 0x91B7, 0xE17B, 0x91B8, 0xE17C, + 0x91B9, 0xE17D, 0x91BA, 0xF5B8, 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, + 0xE181, 0x91BE, 0xE182, 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, + 0x91C2, 0xE186, 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, + 0xE18A, 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, 0x91CF, + 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, 0x91D3, 0xE18F, + 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, 0x91D7, 0xE193, 0x91D8, + 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, 0x91DB, 0xE197, 0x91DC, 0xB8AA, + 0x91DD, 0xE198, 0x91DE, 0xE199, 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, + 0xE19C, 0x91E2, 0xE19D, 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, + 0x91E6, 0xE240, 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, + 0xE244, 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, + 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, 0x91F3, + 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, 0x91F7, 0xE251, + 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, 0x91FB, 0xE255, 0x91FC, + 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, 0x91FF, 0xE259, 0x9200, 0xE25A, + 0x9201, 0xE25B, 0x9202, 0xE25C, 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, + 0xE25F, 0x9206, 0xE260, 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, + 0x920A, 0xE264, 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, + 0xE268, 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, 0x9217, + 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, 0x921B, 0xE275, + 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, 0x921F, 0xE279, 0x9220, + 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, 0x9223, 0xE27D, 0x9224, 0xE27E, + 0x9225, 0xE280, 0x9226, 0xE281, 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, + 0xE284, 0x922A, 0xE285, 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, + 0x922E, 0xE289, 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, + 0xE28D, 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, + 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, 0x923B, + 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, 0x923F, 0xE29A, + 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, 0x9243, 0xE29E, 0x9244, + 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, 0x9247, 0xE341, 0x9248, 0xE342, + 0x9249, 0xE343, 0x924A, 0xE344, 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, + 0xE347, 0x924E, 0xE348, 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, + 0x9252, 0xE34C, 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, + 0xE350, 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, 0x925F, + 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, 0x9263, 0xE35D, + 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, 0x9267, 0xE361, 0x9268, + 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, 0x926B, 0xE365, 0x926C, 0xE366, + 0x926D, 0xE367, 0x926E, 0xE368, 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, + 0xE36B, 0x9272, 0xE36C, 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, + 0x9276, 0xE36F, 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, + 0xE373, 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, + 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, 0x9283, + 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, 0x9287, 0xE381, + 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, 0x928B, 0xE385, 0x928C, + 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, 0x928F, 0xE388, 0x9290, 0xE389, + 0x9291, 0xE38A, 0x9292, 0xE38B, 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, + 0xE38E, 0x9296, 0xE38F, 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, + 0x929A, 0xE393, 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, + 0xE397, 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, 0x92A7, + 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, 0x92AB, 0xE443, + 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, 0x92AF, 0xE446, 0x92B0, + 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, 0x92B3, 0xE44A, 0x92B4, 0xE44B, + 0x92B5, 0xE44C, 0x92B6, 0xE44D, 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, + 0xE450, 0x92BA, 0xE451, 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, + 0x92BE, 0xE455, 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, + 0xE459, 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, + 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, 0x92CB, + 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, 0x92CF, 0xE465, + 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, 0x92D3, 0xE469, 0x92D4, + 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, 0x92D7, 0xE46D, 0x92D8, 0xE46E, + 0x92D9, 0xE46F, 0x92DA, 0xE470, 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, + 0xE473, 0x92DE, 0xE474, 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, + 0x92E2, 0xE478, 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, + 0xE47C, 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, 0x92EF, + 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, 0x92F3, 0xE48A, + 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, 0x92F7, 0xE48E, 0x92F8, + 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, 0x92FB, 0xE492, 0x92FC, 0xE493, + 0x92FD, 0xE494, 0x92FE, 0xE495, 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, + 0xE498, 0x9302, 0xE499, 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, + 0x9306, 0xE49D, 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, + 0xE540, 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, + 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, 0x9313, + 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, 0x9317, 0xE54D, + 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, 0x931B, 0xE551, 0x931C, + 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, 0x931F, 0xE555, 0x9320, 0xE556, + 0x9321, 0xE557, 0x9322, 0xE558, 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, + 0xE55B, 0x9326, 0xE55C, 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, + 0x932A, 0xE560, 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, + 0xE564, 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, 0x9337, + 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, 0x933B, 0xE571, + 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, 0x933F, 0xE574, 0x9340, + 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, 0x9343, 0xE578, 0x9344, 0xE579, + 0x9345, 0xE57A, 0x9346, 0xE57B, 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, + 0xE57E, 0x934A, 0xE580, 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, + 0x934E, 0xE584, 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, + 0xE588, 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, + 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, 0x935B, + 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, 0x935F, 0xE595, + 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, 0x9363, 0xE599, 0x9364, + 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, 0x9367, 0xE59D, 0x9368, 0xE59E, + 0x9369, 0xE59F, 0x936A, 0xF6CA, 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, + 0xE641, 0x936E, 0xE642, 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, + 0x9372, 0xE646, 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, + 0xE64A, 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, 0x937F, + 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, 0x9383, 0xE657, + 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, 0x9387, 0xE65B, 0x9388, + 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, 0x938B, 0xE65F, 0x938C, 0xE660, + 0x938D, 0xE661, 0x938E, 0xE662, 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, + 0xE664, 0x9392, 0xE665, 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, + 0x9396, 0xE669, 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, + 0xE66D, 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, + 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, 0x93A3, + 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, 0x93A7, 0xE67A, + 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, 0x93AB, 0xE67E, 0x93AC, + 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, 0x93AF, 0xE683, 0x93B0, 0xE684, + 0x93B1, 0xE685, 0x93B2, 0xE686, 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, + 0xE689, 0x93B6, 0xE68A, 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, + 0x93BA, 0xE68E, 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, + 0xE692, 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, 0x93C7, + 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, 0x93CB, 0xE69E, + 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, 0x93CF, 0xE741, 0x93D0, + 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, 0x93D3, 0xE745, 0x93D4, 0xE746, + 0x93D5, 0xE747, 0x93D6, 0xF7E9, 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, + 0xE74A, 0x93DA, 0xE74B, 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, + 0x93DE, 0xE74F, 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, + 0xE753, 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, + 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, 0x93EB, + 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, 0x93EF, 0xE760, + 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, 0x93F3, 0xE764, 0x93F4, + 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, 0x93F7, 0xE768, 0x93F8, 0xE769, + 0x93F9, 0xE76A, 0x93FA, 0xE76B, 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, + 0xE76E, 0x93FE, 0xE76F, 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, + 0x9402, 0xE773, 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, + 0xE777, 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, 0x940F, + 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, 0x9413, 0xE785, + 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, 0x9417, 0xE789, 0x9418, + 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, 0x941B, 0xE78D, 0x941C, 0xE78E, + 0x941D, 0xE78F, 0x941E, 0xE790, 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, + 0xE793, 0x9422, 0xE794, 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, + 0x9426, 0xE798, 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, + 0xE79C, 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, + 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, 0x9433, + 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, 0x9437, 0xE848, + 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, 0x943B, 0xE84C, 0x943C, + 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, 0x943F, 0xE84F, 0x9440, 0xE850, + 0x9441, 0xE851, 0x9442, 0xE852, 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, + 0xE855, 0x9446, 0xE856, 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, + 0x944A, 0xE85A, 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, + 0xE85E, 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, 0x9457, + 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, 0x945B, 0xE86B, + 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, 0x945F, 0xE86F, 0x9460, + 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, 0x9463, 0xE873, 0x9464, 0xE874, + 0x9465, 0xE875, 0x9466, 0xE876, 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, + 0xE879, 0x946A, 0xE87A, 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, + 0x946E, 0xE87D, 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, + 0xE882, 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, + 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, 0x947B, + 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, 0x947F, 0xE88F, + 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, 0x9483, 0xE893, 0x9484, + 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, 0x9487, 0xEEC6, 0x9488, 0xD5EB, + 0x9489, 0xB6A4, 0x948A, 0xEEC8, 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, + 0xEECA, 0x948E, 0xC7A5, 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, + 0x9492, 0xB7B0, 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, + 0xE896, 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, 0x949F, + 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, 0x94A3, 0xEED3, + 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, 0x94A7, 0xBEFB, 0x94A8, + 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, 0x94AB, 0xEED5, 0x94AC, 0xEED8, + 0x94AD, 0xEED7, 0x94AE, 0xC5A5, 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, + 0xC7AE, 0x94B2, 0xEEDB, 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, + 0x94B6, 0xEEDD, 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, + 0xEEE1, 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, 0x94C3, + 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, 0x94C7, 0xE898, + 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, 0x94CB, 0xEEE9, 0x94CC, + 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, 0x94CF, 0xE899, 0x94D0, 0xEEED, + 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, + 0xEEF0, 0x94D6, 0xEEF1, 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, + 0x94DA, 0xE89C, 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, + 0xEEF6, 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, 0x94E7, + 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, 0x94EB, 0xEFA2, + 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, 0x94EF, 0xEFA4, 0x94F0, + 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, + 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, + 0xEFA9, 0x94FA, 0xC6CC, 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, + 0x94FE, 0xC1B4, 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, + 0xEFAE, 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, + 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, 0x950B, + 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, 0x950F, 0xEFB5, + 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, 0x9513, 0xEFB7, 0x9514, + 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, 0x9517, 0xD5E0, 0x9518, 0xEFBB, + 0x9519, 0xB4ED, 0x951A, 0xC3AA, 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, + 0xEFBD, 0x951E, 0xEFBE, 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, + 0x9522, 0xEFC0, 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, + 0xBDF5, 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, 0x952F, + 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, 0x9533, 0xE941, + 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, 0x9537, 0xEFC9, 0x9538, + 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, 0x953B, 0xB6CD, 0x953C, 0xEFCB, + 0x953D, 0xE942, 0x953E, 0xEFCC, 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, + 0xC3BE, 0x9542, 0xEFCE, 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, + 0x9546, 0xEFD2, 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, + 0xC4F7, 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, + 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, 0x9553, + 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, 0x9557, 0xEFDB, + 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, 0x955B, 0xEFDE, 0x955C, + 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, 0x955F, 0xEFE0, 0x9560, 0xE948, + 0x9561, 0xEFE2, 0x9562, 0xEFE3, 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, + 0xEFE5, 0x9566, 0xEFE6, 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, + 0x956A, 0xEFEA, 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, + 0xE949, 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, 0x9577, + 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, 0x957B, 0xE950, + 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, 0x957F, 0xB3A4, 0x9580, + 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, 0x9583, 0xE957, 0x9584, 0xE958, + 0x9585, 0xE959, 0x9586, 0xE95A, 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, + 0xE95D, 0x958A, 0xE95E, 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, + 0x958E, 0xE962, 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, + 0xE966, 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, + 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, 0x959B, + 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, 0x959F, 0xE973, + 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, 0x95A3, 0xE977, 0x95A4, + 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, 0x95A7, 0xE97B, 0x95A8, 0xE97C, + 0x95A9, 0xE97D, 0x95AA, 0xE97E, 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, + 0xE982, 0x95AE, 0xE983, 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, + 0x95B2, 0xE987, 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, + 0xE98B, 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, 0x95BF, + 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, 0x95C3, 0xE998, + 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, 0x95C7, 0xE99C, 0x95C8, + 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, 0x95CB, 0xE9A0, 0x95CC, 0xEA40, + 0x95CD, 0xEA41, 0x95CE, 0xEA42, 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, + 0xEA45, 0x95D2, 0xEA46, 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, + 0x95D6, 0xEA4A, 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, + 0xEA4E, 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, + 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, 0x95E3, + 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, 0x95E7, 0xEA5B, + 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, 0x95EB, 0xE3C6, 0x95EC, + 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, + 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, + 0xE3C9, 0x95F6, 0xE3CA, 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, + 0x95FA, 0xB9EB, 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, + 0xE3CC, 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, 0x9607, + 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, 0x960B, 0xE3D2, + 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, 0x960F, 0xE3D5, 0x9610, + 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, 0x9613, 0xEA5F, 0x9614, 0xC0AB, + 0x9615, 0xE3D7, 0x9616, 0xE3D8, 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, + 0xE3DA, 0x961A, 0xE3DB, 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, + 0x961E, 0xEA62, 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, + 0xDAE3, 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, + 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, 0x962B, + 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, 0x962F, 0xEA6E, + 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, 0x9633, 0xD1F4, 0x9634, + 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, 0x9637, 0xEA70, 0x9638, 0xEA71, + 0x9639, 0xEA72, 0x963A, 0xEA73, 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, + 0xDAE7, 0x963E, 0xEA74, 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, + 0x9642, 0xDAE9, 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, + 0xC2BD, 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, 0x964F, + 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, 0x9653, 0xEA7C, + 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, 0x9657, 0xEA7E, 0x9658, + 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, 0x965B, 0xB1DD, 0x965C, 0xEA83, + 0x965D, 0xEA84, 0x965E, 0xEA85, 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, + 0xB6B8, 0x9662, 0xD4BA, 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, + 0x9666, 0xEA89, 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, + 0xC5E3, 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, + 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, 0x9673, + 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, 0x9677, 0xCFDD, + 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, 0x967B, 0xEA94, 0x967C, + 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, 0x967F, 0xEA98, 0x9680, 0xEA99, + 0x9681, 0xEA9A, 0x9682, 0xEA9B, 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, + 0xD3E7, 0x9686, 0xC2A1, 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, + 0x968A, 0xEAA0, 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, + 0xEB41, 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, 0x9697, + 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, 0x969B, 0xEB48, + 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, 0x969F, 0xEB4B, 0x96A0, + 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, 0x96A3, 0xEB4F, 0x96A4, 0xEB50, + 0x96A5, 0xEB51, 0x96A6, 0xEB52, 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, + 0xEB54, 0x96AA, 0xEB55, 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, + 0x96AE, 0xEB59, 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, + 0xEB5C, 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, + 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, 0x96BB, + 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, 0x96BF, 0xEB63, + 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, 0x96C3, 0xEB65, 0x96C4, + 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, 0x96C7, 0xB9CD, 0x96C8, 0xEB66, + 0x96C9, 0xEFF4, 0x96CA, 0xEB67, 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, + 0xD3BA, 0x96CE, 0xF6C2, 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, + 0x96D2, 0xF6C3, 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, + 0xEB6D, 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, 0x96DF, + 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, 0x96E3, 0xEB79, + 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, 0x96E7, 0xEB7D, 0x96E8, + 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, 0x96EB, 0xEB7E, 0x96EC, 0xEB80, + 0x96ED, 0xEB81, 0x96EE, 0xEB82, 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, + 0xEB84, 0x96F2, 0xEB85, 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, + 0x96F6, 0xC1E3, 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, + 0xEB89, 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, + 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, 0x9703, + 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, 0x9707, 0xD5F0, + 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, 0x970B, 0xEB92, 0x970C, + 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, 0x970F, 0xF6AD, 0x9710, 0xEB94, + 0x9711, 0xEB95, 0x9712, 0xEB96, 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, + 0xEB98, 0x9716, 0xC1D8, 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, + 0x971A, 0xEB9C, 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, + 0xCFBC, 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, 0x9727, + 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, 0x972B, 0xEC49, + 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, 0x972F, 0xEC4C, 0x9730, + 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, 0x9733, 0xEC4E, 0x9734, 0xEC4F, + 0x9735, 0xEC50, 0x9736, 0xEC51, 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, + 0xC5F9, 0x973A, 0xEC53, 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, + 0x973E, 0xF6B2, 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, + 0xEC5A, 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, + 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, 0x974B, + 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, 0x974F, 0xEC67, + 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, 0x9753, 0xF6A6, 0x9754, + 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, 0x9757, 0xEC6C, 0x9758, 0xEC6D, + 0x9759, 0xBEB2, 0x975A, 0xEC6E, 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, + 0xEC70, 0x975E, 0xB7C7, 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, + 0x9762, 0xC3E6, 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, + 0xEC74, 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, 0x976F, + 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, 0x9773, 0xBDF9, + 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, 0x9777, 0xEC82, 0x9778, + 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, 0x977B, 0xEC86, 0x977C, 0xF7B0, + 0x977D, 0xEC87, 0x977E, 0xEC88, 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, + 0xEC8B, 0x9782, 0xEC8C, 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, + 0x9786, 0xEC8F, 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, + 0xEC93, 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, + 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, 0x9793, + 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, 0x9797, 0xEC9B, + 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, 0x979B, 0xEC9E, 0x979C, + 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, 0x979F, 0xED41, 0x97A0, 0xBECF, + 0x97A1, 0xED42, 0x97A2, 0xED43, 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, + 0xED45, 0x97A6, 0xED46, 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, + 0x97AA, 0xED4A, 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, + 0xED4C, 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, 0x97B7, + 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, 0x97BB, 0xED56, + 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, 0x97BF, 0xED5A, 0x97C0, + 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, 0x97C3, 0xED5E, 0x97C4, 0xED5F, + 0x97C5, 0xED60, 0x97C6, 0xED61, 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, + 0xED64, 0x97CA, 0xED65, 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, + 0x97CE, 0xED69, 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, + 0xED6D, 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, + 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, 0x97DB, + 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, 0x97DF, 0xED7A, + 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, 0x97E3, 0xED7E, 0x97E4, + 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, 0x97E7, 0xC8CD, 0x97E8, 0xED82, + 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, + 0xBEC2, 0x97EE, 0xED83, 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, + 0x97F2, 0xED87, 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, + 0xC9D8, 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, 0x97FF, + 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, 0x9803, 0xED95, + 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, 0x9807, 0xED99, 0x9808, + 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, 0x980B, 0xED9D, 0x980C, 0xED9E, + 0x980D, 0xED9F, 0x980E, 0xEDA0, 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, + 0xEE42, 0x9812, 0xEE43, 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, + 0x9816, 0xEE47, 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, + 0xEE4B, 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, + 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, 0x9823, + 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, 0x9827, 0xEE58, + 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, 0x982B, 0xEE5C, 0x982C, + 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, 0x982F, 0xEE60, 0x9830, 0xEE61, + 0x9831, 0xEE62, 0x9832, 0xEE63, 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, + 0xEE66, 0x9836, 0xEE67, 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, + 0x983A, 0xEE6B, 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, + 0xEE6F, 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, 0x9847, + 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, 0x984B, 0xEE7C, + 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, 0x984F, 0xEE81, 0x9850, + 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, 0x9853, 0xEE85, 0x9854, 0xEE86, + 0x9855, 0xEE87, 0x9856, 0xEE88, 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, + 0xEE8B, 0x985A, 0xEE8C, 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, + 0x985E, 0xEE90, 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, + 0xEE94, 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, + 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, 0x986B, + 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, 0x986F, 0xEF40, + 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, 0x9873, 0xEF44, 0x9874, + 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, 0x9877, 0xC7EA, 0x9878, 0xF1FC, + 0x9879, 0xCFEE, 0x987A, 0xCBB3, 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, + 0xCDE7, 0x987E, 0xB9CB, 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, + 0x9882, 0xCBCC, 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, + 0xC1EC, 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, 0x988F, + 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, 0x9893, 0xCDC7, + 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, 0x9897, 0xBFC5, 0x9898, + 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, 0x989B, 0xF2A7, 0x989C, 0xD1D5, + 0x989D, 0xB6EE, 0x989E, 0xF2A8, 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, + 0xF2AA, 0x98A2, 0xF2AB, 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, + 0x98A6, 0xF2AD, 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, + 0xEF4E, 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, + 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, 0x98B3, + 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, 0x98B7, 0xEF5B, + 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, 0x98BB, 0xEF5F, 0x98BC, + 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, 0x98BF, 0xEF63, 0x98C0, 0xEF64, + 0x98C1, 0xEF65, 0x98C2, 0xEF66, 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, + 0xEF69, 0x98C6, 0xEF6A, 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, + 0x98CA, 0xEF6E, 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, + 0xB7E7, 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, 0x98D7, + 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, 0x98DB, 0xEF77, + 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, 0x98DF, 0xCAB3, 0x98E0, + 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, + 0x98E5, 0xEF80, 0x98E6, 0xEF81, 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, + 0xEF82, 0x98EA, 0xEF83, 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, + 0x98EE, 0xEF87, 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, + 0xEF8B, 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, + 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, 0x98FB, + 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, 0x98FF, 0xEF98, + 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, 0x9903, 0xEF9C, 0x9904, + 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, 0x9907, 0xEFA0, 0x9908, 0xF040, + 0x9909, 0xF041, 0x990A, 0xF042, 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, + 0xF7D0, 0x990E, 0xF045, 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, + 0x9912, 0xF048, 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, + 0xF04C, 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, 0x991F, + 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, 0x9923, 0xF059, + 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, 0x9927, 0xF05D, 0x9928, + 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, 0x992B, 0xF061, 0x992C, 0xF062, + 0x992D, 0xF063, 0x992E, 0xF7D1, 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, + 0xF066, 0x9932, 0xF067, 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, + 0x9936, 0xF06B, 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, + 0xF06F, 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, + 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, 0x9943, + 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, 0x9947, 0xF07C, + 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, 0x994B, 0xF081, 0x994C, + 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, 0x994F, 0xF085, 0x9950, 0xF086, + 0x9951, 0xF087, 0x9952, 0xF088, 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, + 0xF7D2, 0x9956, 0xF08A, 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, + 0x995A, 0xF08E, 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, + 0xF092, 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, 0x9967, + 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, 0x996B, 0xE2C0, + 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, 0x996F, 0xBDA4, 0x9970, + 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, 0x9973, 0xF099, 0x9974, 0xE2C2, + 0x9975, 0xB6FC, 0x9976, 0xC8C4, 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, + 0xF09B, 0x997A, 0xBDC8, 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, + 0x997E, 0xF09D, 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, + 0xF09E, 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, + 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, 0x998B, + 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, 0x998F, 0xC1F3, + 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, 0x9993, 0xE2CC, 0x9994, + 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, 0x9997, 0xD8B8, 0x9998, 0xD9E5, + 0x9999, 0xCFE3, 0x999A, 0xF142, 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, + 0xF145, 0x999E, 0xF146, 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, + 0x99A2, 0xF14A, 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, + 0xF14D, 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, 0x99AF, + 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, 0x99B3, 0xF159, + 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, 0x99B7, 0xF15D, 0x99B8, + 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, 0x99BB, 0xF161, 0x99BC, 0xF162, + 0x99BD, 0xF163, 0x99BE, 0xF164, 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, + 0xF167, 0x99C2, 0xF168, 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, + 0x99C6, 0xF16C, 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, + 0xF170, 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, + 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, 0x99D3, + 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, 0x99D7, 0xF17D, + 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, 0x99DB, 0xF182, 0x99DC, + 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, 0x99DF, 0xF186, 0x99E0, 0xF187, + 0x99E1, 0xF188, 0x99E2, 0xF189, 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, + 0xF18C, 0x99E6, 0xF18D, 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, + 0x99EA, 0xF191, 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, + 0xF195, 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, 0x99F7, + 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, 0x99FB, 0xF241, + 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, 0x99FF, 0xF245, 0x9A00, + 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, 0x9A03, 0xF249, 0x9A04, 0xF24A, + 0x9A05, 0xF24B, 0x9A06, 0xF24C, 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, + 0xF24F, 0x9A0A, 0xF250, 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, + 0x9A0E, 0xF254, 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, + 0xF258, 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, + 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, 0x9A1B, + 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, 0x9A1F, 0xF265, + 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, 0x9A23, 0xF269, 0x9A24, + 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, 0x9A27, 0xF26D, 0x9A28, 0xF26E, + 0x9A29, 0xF26F, 0x9A2A, 0xF270, 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, + 0xF273, 0x9A2E, 0xF274, 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, + 0x9A32, 0xF278, 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, + 0xF27C, 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, 0x9A3F, + 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, 0x9A43, 0xF28A, + 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, 0x9A47, 0xF28E, 0x9A48, + 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, 0x9A4B, 0xF292, 0x9A4C, 0xF293, + 0x9A4D, 0xF294, 0x9A4E, 0xF295, 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, + 0xF298, 0x9A52, 0xF299, 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, + 0x9A56, 0xF29D, 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, + 0xF340, 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, + 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, 0x9A63, + 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, 0x9A67, 0xF34D, + 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, 0x9A6B, 0xF351, 0x9A6C, + 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, + 0x9A71, 0xC7FD, 0x9A72, 0xF352, 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, + 0xE6E0, 0x9A76, 0xCABB, 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, + 0x9A7A, 0xE6E3, 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, + 0xBCDD, 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, 0x9A87, + 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, 0x9A8B, 0xB3D2, + 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, 0x9A8F, 0xBFA5, 0x9A90, + 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, 0x9A93, 0xE6ED, 0x9A94, 0xF357, + 0x9A95, 0xF358, 0x9A96, 0xE6EE, 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, + 0xF359, 0x9A9A, 0xC9A7, 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, + 0x9A9E, 0xE5B9, 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, + 0xE6F5, 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, + 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, 0x9AAB, + 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, 0x9AAF, 0xF361, + 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, 0x9AB3, 0xF363, 0x9AB4, + 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, + 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, + 0xF368, 0x9ABE, 0xF369, 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, + 0x9AC2, 0xF7C4, 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, + 0xF36D, 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, 0x9ACF, + 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, 0x9AD3, 0xCBE8, + 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, 0x9AD7, 0xF37A, 0x9AD8, + 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, + 0x9ADD, 0xF380, 0x9ADE, 0xF381, 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, + 0xF7D5, 0x9AE2, 0xF383, 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, + 0x9AE6, 0xF7D6, 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, + 0xF38A, 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, + 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, 0x9AF3, + 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, 0x9AF7, 0xF394, + 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, 0x9AFB, 0xF7D9, 0x9AFC, + 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, 0x9AFF, 0xF39A, 0x9B00, 0xF39B, + 0x9B01, 0xF39C, 0x9B02, 0xF39D, 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, + 0xF39F, 0x9B06, 0xF3A0, 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, + 0x9B0A, 0xF442, 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, + 0xF446, 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, 0x9B17, + 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, 0x9B1B, 0xF451, + 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, 0x9B1F, 0xF7DF, 0x9B20, + 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, 0x9B23, 0xF7E0, 0x9B24, 0xF458, + 0x9B25, 0xF459, 0x9B26, 0xF45A, 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, + 0xF45D, 0x9B2A, 0xF45E, 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, + 0x9B2E, 0xF462, 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, + 0xD8AA, 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, + 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, 0x9B3B, + 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, 0x9B3F, 0xF46F, + 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, 0x9B43, 0xF7C9, 0x9B44, + 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, + 0x9B49, 0xF7CB, 0x9B4A, 0xF472, 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, + 0xF7CD, 0x9B4E, 0xF475, 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, + 0x9B52, 0xF477, 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, + 0xF47A, 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, 0x9B5F, + 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, 0x9B63, 0xF488, + 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, 0x9B67, 0xF48C, 0x9B68, + 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, 0x9B6B, 0xF490, 0x9B6C, 0xF491, + 0x9B6D, 0xF492, 0x9B6E, 0xF493, 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, + 0xF496, 0x9B72, 0xF497, 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, + 0x9B76, 0xF49B, 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, + 0xF49F, 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, + 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, 0x9B83, + 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, 0x9B87, 0xF54B, + 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, 0x9B8B, 0xF54F, 0x9B8C, + 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, 0x9B8F, 0xF553, 0x9B90, 0xF554, + 0x9B91, 0xF555, 0x9B92, 0xF556, 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, + 0xF559, 0x9B96, 0xF55A, 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, + 0x9B9A, 0xF55E, 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, + 0xF562, 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, 0x9BA7, + 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, 0x9BAB, 0xF56F, + 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, 0x9BAF, 0xF573, 0x9BB0, + 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, 0x9BB3, 0xF577, 0x9BB4, 0xF578, + 0x9BB5, 0xF579, 0x9BB6, 0xF57A, 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, + 0xF57D, 0x9BBA, 0xF57E, 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, + 0x9BBE, 0xF583, 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, + 0xF587, 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, + 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, 0x9BCB, + 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, 0x9BCF, 0xF594, + 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, 0x9BD3, 0xF598, 0x9BD4, + 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, + 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, + 0xF641, 0x9BDE, 0xF642, 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, + 0x9BE2, 0xF646, 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, + 0xF64A, 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, 0x9BEF, + 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, 0x9BF3, 0xF657, + 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, 0x9BF7, 0xF65B, 0x9BF8, + 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, 0x9BFB, 0xF65F, 0x9BFC, 0xF660, + 0x9BFD, 0xF661, 0x9BFE, 0xF662, 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, + 0xF665, 0x9C02, 0xF666, 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, + 0x9C06, 0xF66A, 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, + 0xF66E, 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, + 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, 0x9C13, + 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, 0x9C17, 0xF67B, + 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, 0x9C1B, 0xF680, 0x9C1C, + 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, 0x9C1F, 0xF684, 0x9C20, 0xF685, + 0x9C21, 0xF686, 0x9C22, 0xF687, 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, + 0xF68A, 0x9C26, 0xF68B, 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, + 0x9C2A, 0xF68F, 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, + 0xF693, 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, 0x9C37, + 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, 0x9C3B, 0xF6A0, + 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, 0x9C3F, 0xF743, 0x9C40, + 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, 0x9C43, 0xF747, 0x9C44, 0xF748, + 0x9C45, 0xF749, 0x9C46, 0xF74A, 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, + 0xF74D, 0x9C4A, 0xF74E, 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, + 0x9C4E, 0xF752, 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, + 0xF756, 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, + 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, 0x9C5B, + 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, 0x9C5F, 0xF763, + 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, 0x9C63, 0xF767, 0x9C64, + 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, 0x9C67, 0xF76B, 0x9C68, 0xF76C, + 0x9C69, 0xF76D, 0x9C6A, 0xF76E, 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, + 0xF771, 0x9C6E, 0xF772, 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, + 0x9C72, 0xF776, 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, + 0xF77A, 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, 0x9C7F, + 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, 0x9C83, 0xF784, + 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, 0x9C87, 0xF6D3, 0x9C88, + 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, + 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, + 0xF6D9, 0x9C92, 0xF6DA, 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, + 0x9C96, 0xF78B, 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, + 0xF6DD, 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, 0x9CA3, + 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, 0x9CA7, 0xF6E7, + 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, 0x9CAB, 0xF6EA, 0x9CAC, + 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, + 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, + 0xF6F2, 0x9CB6, 0xF6F3, 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, + 0x9CBA, 0xF6F5, 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, + 0xF794, 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, 0x9CC7, + 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, 0x9CCB, 0xF6FE, + 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, 0x9CCF, 0xF7A4, 0x9CD0, + 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, + 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, + 0xF7AB, 0x9CDA, 0xF79D, 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, + 0x9CDE, 0xC1DB, 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, + 0xF7AF, 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, + 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, 0x9CEB, + 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, 0x9CEF, 0xF84C, + 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, 0x9CF3, 0xF850, 0x9CF4, + 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, 0x9CF7, 0xF854, 0x9CF8, 0xF855, + 0x9CF9, 0xF856, 0x9CFA, 0xF857, 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, + 0xF85A, 0x9CFE, 0xF85B, 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, + 0x9D02, 0xF85F, 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, + 0xF863, 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, 0x9D0F, + 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, 0x9D13, 0xF870, + 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, 0x9D17, 0xF874, 0x9D18, + 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, 0x9D1B, 0xF878, 0x9D1C, 0xF879, + 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, + 0xF87E, 0x9D22, 0xF880, 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, + 0x9D26, 0xF884, 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, + 0xF888, 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, + 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, 0x9D33, + 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, 0x9D37, 0xF895, + 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, 0x9D3B, 0xF899, 0x9D3C, + 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, 0x9D3F, 0xF89D, 0x9D40, 0xF89E, + 0x9D41, 0xF89F, 0x9D42, 0xF8A0, 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, + 0xF942, 0x9D46, 0xF943, 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, + 0x9D4A, 0xF947, 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, + 0xF94B, 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, 0x9D57, + 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, 0x9D5B, 0xF958, + 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, 0x9D5F, 0xF95C, 0x9D60, + 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, 0x9D63, 0xF960, 0x9D64, 0xF961, + 0x9D65, 0xF962, 0x9D66, 0xF963, 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, + 0xF966, 0x9D6A, 0xF967, 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, + 0x9D6E, 0xF96B, 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, + 0xF96F, 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, + 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, 0x9D7B, + 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, 0x9D7F, 0xF97C, + 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, 0x9D83, 0xF981, 0x9D84, + 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, 0x9D87, 0xF985, 0x9D88, 0xF986, + 0x9D89, 0xF987, 0x9D8A, 0xF988, 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, + 0xF98B, 0x9D8E, 0xF98C, 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, + 0x9D92, 0xF990, 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, + 0xF994, 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, 0x9D9F, + 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, 0x9DA3, 0xFA40, + 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, 0x9DA7, 0xFA44, 0x9DA8, + 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, + 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, + 0xFA4E, 0x9DB2, 0xFA4F, 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, + 0x9DB6, 0xFA53, 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, + 0xFA57, 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, + 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, 0x9DC3, + 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, 0x9DC7, 0xFA64, + 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, 0x9DCB, 0xFA68, 0x9DCC, + 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, + 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, + 0xFA72, 0x9DD6, 0xFA73, 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, + 0x9DDA, 0xFA77, 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, + 0xFA7B, 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, 0x9DE7, + 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, 0x9DEB, 0xFA89, + 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, 0x9DEF, 0xFA8D, 0x9DF0, + 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, + 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, + 0xFA97, 0x9DFA, 0xFA98, 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, + 0x9DFE, 0xFA9C, 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, + 0xFAA0, 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, + 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, 0x9E0B, + 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, 0x9E0F, 0xFB4C, + 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, 0x9E13, 0xFB50, 0x9E14, + 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, 0x9E17, 0xFB54, 0x9E18, 0xFB55, + 0x9E19, 0xFB56, 0x9E1A, 0xFB57, 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, + 0xFB5A, 0x9E1E, 0xFB5B, 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, + 0x9E22, 0xF0B0, 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, + 0xD1BB, 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, 0x9E2F, + 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, 0x9E33, 0xD4A7, + 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, 0x9E37, 0xF0BA, 0x9E38, + 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, + 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, + 0xF0BE, 0x9E42, 0xF0BF, 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, + 0x9E46, 0xF0C1, 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, + 0xC8B5, 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, 0x9E53, + 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, 0x9E57, 0xF0CA, + 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, 0x9E5B, 0xF0CC, 0x9E5C, + 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, + 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, + 0xFB70, 0x9E66, 0xF0D0, 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, + 0x9E6A, 0xF0D4, 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, + 0xFB71, 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, 0x9E77, + 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, 0x9E7B, 0xFB7B, + 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, 0x9E7F, 0xC2B9, 0x9E80, + 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, 0x9E83, 0xFB81, 0x9E84, 0xFB82, + 0x9E85, 0xFB83, 0x9E86, 0xFB84, 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, + 0xFB85, 0x9E8A, 0xFB86, 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, + 0x9E8E, 0xFB89, 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, + 0xF7E8, 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, + 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, 0x9E9B, + 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, 0x9E9F, 0xF7EB, + 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, 0x9EA3, 0xFB9A, 0x9EA4, + 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, + 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, + 0xFC42, 0x9EAE, 0xFC43, 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, + 0x9EB2, 0xFC47, 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, + 0xFC4A, 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, 0x9EBF, + 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, 0x9EC3, 0xFC53, + 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, 0x9EC7, 0xFC56, 0x9EC8, + 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, + 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, + 0xBADA, 0x9ED2, 0xFC5C, 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, + 0x9ED6, 0xFC5F, 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, + 0xFC62, 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, + 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, 0x9EE3, + 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, 0x9EE7, 0xF7F3, + 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, 0x9EEB, 0xFC69, 0x9EEC, + 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, + 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, + 0xFC72, 0x9EF6, 0xFC73, 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, + 0x9EFA, 0xFC76, 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, + 0xF6BC, 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, 0x9F07, + 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, 0x9F0B, 0xF6BD, + 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, 0x9F0F, 0xFC86, 0x9F10, + 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, 0x9F13, 0xB9C4, 0x9F14, 0xFC89, + 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, + 0xDCB1, 0x9F1A, 0xFC8D, 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, + 0x9F1E, 0xFC91, 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, + 0xF7F7, 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, + 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, 0x9F2B, + 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, 0x9F2F, 0xF7F9, + 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, 0x9F33, 0xFD41, 0x9F34, + 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, 0x9F37, 0xF7FB, 0x9F38, 0xFD45, + 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, + 0xF7FC, 0x9F3E, 0xF7FD, 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, + 0x9F42, 0xFD4B, 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, + 0xFD4E, 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, 0x9F4F, + 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, 0x9F53, 0xFD59, + 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, 0x9F57, 0xFD5D, 0x9F58, + 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, + 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, + 0xFD67, 0x9F62, 0xFD68, 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, + 0x9F66, 0xFD6C, 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, + 0xFD70, 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, + 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, 0x9F73, + 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, 0x9F77, 0xFD7D, + 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, 0x9F7B, 0xFD82, 0x9F7C, + 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, + 0x9F81, 0xFD86, 0x9F82, 0xFD87, 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, + 0xF6B5, 0x9F86, 0xF6B6, 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, + 0x9F8A, 0xF6BA, 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, + 0xFD89, 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, 0x9F97, + 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, 0x9F9B, 0xEDE8, + 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, 0x9F9F, 0xB9EA, 0x9FA0, + 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, + 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, + 0xFD9F, 0xF9F1, 0xFDA0, 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, + 0xFA0F, 0xFE43, 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, + 0xFE47, 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, + 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, 0xFE30, + 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, 0xFE35, 0xA6E0, + 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, 0xFE39, 0xA6E2, 0xFE3A, + 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, + 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, + 0xA6EA, 0xFE44, 0xA6EB, 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, + 0xFE4C, 0xA96B, 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, + 0xA96F, 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, 0xFE5B, + 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, 0xFE5F, 0xA97C, + 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, 0xFE63, 0xA981, 0xFE64, + 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, 0xFE68, 0xA985, 0xFE69, 0xA986, + 0xFE6A, 0xA987, 0xFE6B, 0xA988, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, + 0xA3A3, 0xFF04, 0xA1E7, 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, + 0xFF08, 0xA3A8, 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, + 0xA3AC, 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, 0xFF15, + 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, + 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, 0xFF1D, 0xA3BD, 0xFF1E, + 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, + 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, + 0xA3C7, 0xFF28, 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, + 0xFF2C, 0xA3CC, 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, + 0xA3D0, 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, + 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, 0xFF3D, 0xA3DD, + 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, + 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, + 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, + 0xA3EB, 0xFF4C, 0xA3EC, 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, + 0xFF50, 0xA3F0, 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, + 0xA3F4, 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, 0xFF5D, + 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, 0xFFE2, 0xA956, + 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, 0, 0 }; + +/// GBK --> Unicode pairs +static const WCHAR oem2uni936[] + = { 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, 0x8143, + 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, 0x8147, 0x4E1F, + 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, 0x814B, 0x4E26, 0x814C, + 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, 0x814F, 0x4E31, 0x8150, 0x4E33, + 0x8151, 0x4E35, 0x8152, 0x4E37, 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, + 0x4E41, 0x8156, 0x4E42, 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, + 0x815A, 0x4E51, 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, + 0x4E5B, 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, + 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, 0x8167, + 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, 0x816B, 0x4E72, + 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, 0x816F, 0x4E77, 0x8170, + 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, 0x8173, 0x4E7B, 0x8174, 0x4E7C, + 0x8175, 0x4E7D, 0x8176, 0x4E7F, 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, + 0x4E82, 0x817A, 0x4E83, 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, + 0x817E, 0x4E8A, 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, + 0x4E99, 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, 0x818C, + 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, 0x8190, 0x4EB9, + 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, 0x8194, 0x4EC8, 0x8195, + 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, 0x8198, 0x4ED2, 0x8199, 0x4EDA, + 0x819A, 0x4EDB, 0x819B, 0x4EDC, 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, + 0x4EE6, 0x819F, 0x4EE7, 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, + 0x81A3, 0x4EEF, 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, + 0x4EF9, 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, + 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, 0x81B0, + 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, 0x81B4, 0x4F0C, + 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, 0x81B8, 0x4F15, 0x81B9, + 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, 0x81BC, 0x4F21, 0x81BD, 0x4F23, + 0x81BE, 0x4F28, 0x81BF, 0x4F29, 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, + 0x4F2E, 0x81C3, 0x4F31, 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, + 0x81C7, 0x4F39, 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, + 0x4F40, 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, 0x81D4, + 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, 0x81D8, 0x4F56, + 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, 0x81DC, 0x4F68, 0x81DD, + 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, 0x81E0, 0x4F6E, 0x81E1, 0x4F71, + 0x81E2, 0x4F72, 0x81E3, 0x4F75, 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, + 0x4F79, 0x81E7, 0x4F7A, 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, + 0x81EB, 0x4F82, 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, + 0x4F8A, 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, + 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, 0x81F8, + 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, 0x81FC, 0x4F9F, + 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, 0x8241, 0x4FAB, 0x8242, + 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, 0x8245, 0x4FB2, 0x8246, 0x4FB3, + 0x8247, 0x4FB4, 0x8248, 0x4FB6, 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, + 0x4FB9, 0x824C, 0x4FBA, 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, + 0x8250, 0x4FBE, 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, + 0x4FC6, 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, 0x825D, + 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, 0x8261, 0x4FDB, + 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, 0x8265, 0x4FE5, 0x8266, + 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, 0x8269, 0x4FF0, 0x826A, 0x4FF2, + 0x826B, 0x4FF4, 0x826C, 0x4FF5, 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, + 0x4FF9, 0x8270, 0x4FFB, 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, + 0x8274, 0x5000, 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, + 0x5004, 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, + 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, 0x8282, + 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, 0x8286, 0x5016, + 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, 0x828A, 0x501E, 0x828B, + 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, 0x828E, 0x5024, 0x828F, 0x5027, + 0x8290, 0x502B, 0x8291, 0x502F, 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, + 0x5032, 0x8295, 0x5033, 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, + 0x8299, 0x5037, 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, + 0x503D, 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, 0x82A6, + 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, 0x82AA, 0x5051, + 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, 0x82AE, 0x5056, 0x82AF, + 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, 0x82B2, 0x505B, 0x82B3, 0x505D, + 0x82B4, 0x505E, 0x82B5, 0x505F, 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, + 0x5062, 0x82B9, 0x5063, 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, + 0x82BD, 0x5068, 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, + 0x506D, 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, + 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, 0x82CA, + 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, 0x82CE, 0x507D, + 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, 0x82D2, 0x5084, 0x82D3, + 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, 0x82D6, 0x508A, 0x82D7, 0x508B, + 0x82D8, 0x508C, 0x82D9, 0x508E, 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, + 0x5091, 0x82DD, 0x5092, 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, + 0x82E1, 0x5096, 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, + 0x509A, 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, 0x82EE, + 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, 0x82F2, 0x50AD, + 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, 0x82F6, 0x50B1, 0x82F7, + 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, 0x82FA, 0x50B6, 0x82FB, 0x50B7, + 0x82FC, 0x50B8, 0x82FD, 0x50B9, 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, + 0x50BE, 0x8342, 0x50BF, 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, + 0x8346, 0x50C3, 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, + 0x50C7, 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, + 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, 0x8353, + 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, 0x8357, 0x50D5, + 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, 0x835B, 0x50DB, 0x835C, + 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, 0x835F, 0x50DF, 0x8360, 0x50E0, + 0x8361, 0x50E1, 0x8362, 0x50E2, 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, + 0x50E5, 0x8366, 0x50E8, 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, + 0x836A, 0x50EF, 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, + 0x50F4, 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, 0x8377, + 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, 0x837B, 0x5103, + 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, 0x8380, 0x5109, 0x8381, + 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, 0x8384, 0x510E, 0x8385, 0x510F, + 0x8386, 0x5110, 0x8387, 0x5111, 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, + 0x5115, 0x838B, 0x5116, 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, + 0x838F, 0x511A, 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, + 0x511E, 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, + 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, 0x839C, + 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, 0x83A0, 0x512C, + 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, 0x83A4, 0x5130, 0x83A5, + 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, 0x83A8, 0x5134, 0x83A9, 0x5135, + 0x83AA, 0x5136, 0x83AB, 0x5137, 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, + 0x513A, 0x83AF, 0x513B, 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, + 0x83B3, 0x5142, 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, + 0x514E, 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, 0x83C0, + 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, 0x83C4, 0x5161, + 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, 0x83C8, 0x5167, 0x83C9, + 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, 0x83CC, 0x5172, 0x83CD, 0x517A, + 0x83CE, 0x517E, 0x83CF, 0x517F, 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, + 0x5186, 0x83D3, 0x5187, 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, + 0x83D7, 0x518F, 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, + 0x5194, 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, + 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, 0x83E4, + 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, 0x83E8, 0x51AD, + 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, 0x83EC, 0x51B9, 0x83ED, + 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, 0x83F0, 0x51C1, 0x83F1, 0x51C2, + 0x83F2, 0x51C3, 0x83F3, 0x51C5, 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, + 0x51CD, 0x83F7, 0x51CE, 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, + 0x83FB, 0x51D4, 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, + 0x51D8, 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, 0x8449, + 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, 0x844D, 0x51EA, + 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, 0x8451, 0x51F2, 0x8452, + 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, 0x8455, 0x5204, 0x8456, 0x5205, + 0x8457, 0x5209, 0x8458, 0x520B, 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, + 0x5210, 0x845C, 0x5213, 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, + 0x8460, 0x521E, 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, + 0x5223, 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, + 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, 0x846D, + 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, 0x8471, 0x5244, + 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, 0x8475, 0x5248, 0x8476, + 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, 0x8479, 0x524F, 0x847A, 0x5252, + 0x847B, 0x5253, 0x847C, 0x5255, 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, + 0x5259, 0x8481, 0x525A, 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, + 0x8485, 0x5260, 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, + 0x5266, 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, 0x8492, + 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, 0x8496, 0x5278, + 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, 0x849A, 0x527C, 0x849B, + 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, 0x849E, 0x5284, 0x849F, 0x5285, + 0x84A0, 0x5286, 0x84A1, 0x5287, 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, + 0x528B, 0x84A5, 0x528C, 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, + 0x84A9, 0x5291, 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, + 0x5296, 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, + 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, 0x84B6, + 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, 0x84BA, 0x52B4, + 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, 0x84BE, 0x52B8, 0x84BF, + 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, 0x84C2, 0x52BC, 0x84C3, 0x52BD, + 0x84C4, 0x52C0, 0x84C5, 0x52C1, 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, + 0x52C5, 0x84C9, 0x52C6, 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, + 0x84CD, 0x52CD, 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, + 0x52D3, 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, 0x84DA, + 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, 0x84DE, 0x52E3, + 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, 0x84E2, 0x52E8, 0x84E3, + 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, 0x84E6, 0x52EC, 0x84E7, 0x52ED, + 0x84E8, 0x52EE, 0x84E9, 0x52EF, 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, + 0x52F3, 0x84ED, 0x52F4, 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, + 0x84F1, 0x52F8, 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, + 0x5301, 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, + 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, 0x84FE, + 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, 0x8543, 0x5314, + 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, 0x8547, 0x531E, 0x8548, + 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, 0x854B, 0x5325, 0x854C, 0x5327, + 0x854D, 0x5328, 0x854E, 0x5329, 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, + 0x532D, 0x8552, 0x532F, 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, + 0x8556, 0x5333, 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, + 0x5337, 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, 0x8563, + 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, 0x8567, 0x5358, + 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, 0x856B, 0x5365, 0x856C, + 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, 0x856F, 0x536D, 0x8570, 0x5372, + 0x8571, 0x5376, 0x8572, 0x5379, 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, + 0x537D, 0x8576, 0x537E, 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, + 0x857A, 0x5387, 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, + 0x538F, 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, + 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, 0x8588, + 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, 0x858C, 0x53A1, + 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, 0x8590, 0x53AB, 0x8591, + 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, 0x8594, 0x53B0, 0x8595, 0x53B1, + 0x8596, 0x53B2, 0x8597, 0x53B3, 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, + 0x53B7, 0x859B, 0x53B8, 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, + 0x859F, 0x53BD, 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, + 0x53C4, 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, 0x85AC, + 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, 0x85B0, 0x53DE, + 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, 0x85B4, 0x53F4, 0x85B5, + 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, 0x85B8, 0x5400, 0x85B9, 0x5402, + 0x85BA, 0x5405, 0x85BB, 0x5407, 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, + 0x5418, 0x85BF, 0x5419, 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, + 0x85C3, 0x5424, 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, + 0x5433, 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, + 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, 0x85D0, + 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, 0x85D4, 0x544D, + 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, 0x85D8, 0x545A, 0x85D9, + 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, 0x85DC, 0x5460, 0x85DD, 0x5461, + 0x85DE, 0x5463, 0x85DF, 0x5465, 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, + 0x546A, 0x85E3, 0x546B, 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, + 0x85E7, 0x546F, 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, + 0x547A, 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, 0x85F4, + 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, 0x85F8, 0x5497, + 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, 0x85FC, 0x549F, 0x85FD, + 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, 0x8641, 0x54A5, 0x8642, 0x54AE, + 0x8643, 0x54B0, 0x8644, 0x54B2, 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, + 0x54B7, 0x8648, 0x54B9, 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, + 0x864C, 0x54C3, 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, + 0x54D6, 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, + 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, 0x8659, + 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, 0x865D, 0x54F4, + 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, 0x8661, 0x54F8, 0x8662, + 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, 0x8665, 0x5500, 0x8666, 0x5502, + 0x8667, 0x5503, 0x8668, 0x5504, 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, + 0x550A, 0x866C, 0x550B, 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, + 0x8670, 0x5512, 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, + 0x5517, 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, 0x867D, + 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, 0x8682, 0x552B, + 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, 0x8686, 0x5535, 0x8687, + 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, 0x868A, 0x553A, 0x868B, 0x553B, + 0x868C, 0x553D, 0x868D, 0x5540, 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, + 0x5547, 0x8691, 0x5548, 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, + 0x8695, 0x554E, 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, + 0x5553, 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, + 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, 0x86A2, + 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, 0x86A6, 0x5568, + 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, 0x86AA, 0x5570, 0x86AB, + 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, 0x86AE, 0x5574, 0x86AF, 0x5579, + 0x86B0, 0x557A, 0x86B1, 0x557D, 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, + 0x5586, 0x86B5, 0x558C, 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, + 0x86B9, 0x5592, 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, + 0x5597, 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, 0x86C6, + 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, 0x86CA, 0x55AA, + 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, 0x86CE, 0x55AE, 0x86CF, + 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, 0x86D2, 0x55B4, 0x86D3, 0x55B6, + 0x86D4, 0x55B8, 0x86D5, 0x55BA, 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, + 0x55C0, 0x86D9, 0x55C1, 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, + 0x86DD, 0x55C7, 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, + 0x55CE, 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, + 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, 0x86EA, + 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, 0x86EE, 0x55E9, + 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, 0x86F2, 0x55F1, 0x86F3, + 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, 0x86F6, 0x55F9, 0x86F7, 0x55FA, + 0x86F8, 0x55FB, 0x86F9, 0x55FC, 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, + 0x5603, 0x86FD, 0x5604, 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, + 0x8742, 0x560A, 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, + 0x5611, 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, 0x874F, + 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, 0x8753, 0x5622, + 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, 0x8757, 0x5629, 0x8758, + 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, 0x875B, 0x562F, 0x875C, 0x5630, + 0x875D, 0x5633, 0x875E, 0x5635, 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, + 0x563A, 0x8762, 0x563C, 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, + 0x8766, 0x5641, 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, + 0x5645, 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, + 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, 0x8773, + 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, 0x8777, 0x5656, + 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, 0x877B, 0x565E, 0x877C, + 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, 0x8780, 0x5663, 0x8781, 0x5665, + 0x8782, 0x5666, 0x8783, 0x5667, 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, + 0x566F, 0x8787, 0x5670, 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, + 0x878B, 0x5675, 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, + 0x567A, 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, 0x8798, + 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, 0x879C, 0x568B, + 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, 0x87A0, 0x5691, 0x87A1, + 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, 0x87A4, 0x5696, 0x87A5, 0x5697, + 0x87A6, 0x5698, 0x87A7, 0x5699, 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, + 0x569C, 0x87AB, 0x569D, 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, + 0x87AF, 0x56A1, 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, + 0x56A6, 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, + 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, 0x87BC, + 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, 0x87C0, 0x56B4, + 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, 0x87C4, 0x56B9, 0x87C5, + 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, 0x87C8, 0x56BE, 0x87C9, 0x56BF, + 0x87CA, 0x56C0, 0x87CB, 0x56C1, 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, + 0x56C4, 0x87CF, 0x56C5, 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, + 0x87D3, 0x56C9, 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, + 0x56CE, 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, 0x87E0, + 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, 0x87E4, 0x56E6, + 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, 0x87E8, 0x56EA, 0x87E9, + 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, 0x87EC, 0x56F2, 0x87ED, 0x56F3, + 0x87EE, 0x56F6, 0x87EF, 0x56F7, 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, + 0x56FC, 0x87F3, 0x5700, 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, + 0x87F7, 0x5707, 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, + 0x570E, 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, + 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, 0x8845, + 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, 0x8849, 0x571B, + 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, 0x884D, 0x5721, 0x884E, + 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, 0x8851, 0x5726, 0x8852, 0x5727, + 0x8853, 0x572B, 0x8854, 0x5731, 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, + 0x5735, 0x8858, 0x5736, 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, + 0x885C, 0x573D, 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, + 0x5744, 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, 0x8869, + 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, 0x886D, 0x5762, + 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, 0x8871, 0x576C, 0x8872, + 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, 0x8875, 0x5772, 0x8876, 0x5774, + 0x8877, 0x5775, 0x8878, 0x5778, 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, + 0x577D, 0x887C, 0x577E, 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, + 0x8881, 0x5787, 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, + 0x578D, 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, + 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, 0x888E, + 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, 0x8892, 0x579D, + 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, 0x8896, 0x57A8, 0x8897, + 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, 0x889A, 0x57B0, 0x889B, 0x57B1, + 0x889C, 0x57B3, 0x889D, 0x57B5, 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, + 0x57B9, 0x88A1, 0x57BA, 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, + 0x88A5, 0x57BE, 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, + 0x57C4, 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, 0x88B2, + 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, 0x88B6, 0x57D7, + 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, 0x88BA, 0x57E1, 0x88BB, + 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, 0x88BE, 0x57E6, 0x88BF, 0x57E7, + 0x88C0, 0x57E8, 0x88C1, 0x57E9, 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, + 0x57EC, 0x88C5, 0x57EE, 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, + 0x88C9, 0x57F3, 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, + 0x57FB, 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, + 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, 0x88D6, + 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, 0x88DA, 0x580F, + 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, 0x88DE, 0x5814, 0x88DF, + 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, 0x88E2, 0x581A, 0x88E3, 0x581B, + 0x88E4, 0x581C, 0x88E5, 0x581D, 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, + 0x5823, 0x88E9, 0x5825, 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, + 0x88ED, 0x5829, 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, + 0x582E, 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, 0x88FA, + 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, 0x88FE, 0x583D, + 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, 0x8943, 0x5841, 0x8944, + 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, 0x8947, 0x5846, 0x8948, 0x5847, + 0x8949, 0x5848, 0x894A, 0x5849, 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, + 0x584E, 0x894E, 0x584F, 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, + 0x8952, 0x5855, 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, + 0x585A, 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, + 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, 0x895F, + 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, 0x8963, 0x5869, + 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, 0x8967, 0x586F, 0x8968, + 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, 0x896B, 0x5873, 0x896C, 0x5874, + 0x896D, 0x5875, 0x896E, 0x5876, 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, + 0x5879, 0x8972, 0x587A, 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, + 0x8976, 0x587F, 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, + 0x5887, 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, 0x8984, + 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, 0x8988, 0x5897, + 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, 0x898C, 0x589D, 0x898D, + 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, 0x8990, 0x58A3, 0x8991, 0x58A4, + 0x8992, 0x58A5, 0x8993, 0x58A6, 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, + 0x58AB, 0x8997, 0x58AC, 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, + 0x899B, 0x58B0, 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, + 0x58B4, 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, + 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, 0x89A8, + 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, 0x89AC, 0x58C3, + 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, 0x89B0, 0x58C8, 0x89B1, + 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, 0x89B4, 0x58CC, 0x89B5, 0x58CD, + 0x89B6, 0x58CE, 0x89B7, 0x58CF, 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, + 0x58D3, 0x89BB, 0x58D4, 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, + 0x89BF, 0x58D9, 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, + 0x58DD, 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, 0x89CC, + 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, 0x89D0, 0x58ED, + 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, 0x89D4, 0x58F4, 0x89D5, + 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, 0x89D8, 0x58FA, 0x89D9, 0x58FB, + 0x89DA, 0x58FC, 0x89DB, 0x58FD, 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, + 0x5900, 0x89DF, 0x5901, 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, + 0x89E3, 0x5908, 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, + 0x590C, 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, + 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, 0x89F0, + 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, 0x89F4, 0x5922, + 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, 0x89F8, 0x592C, 0x89F9, + 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, 0x89FC, 0x5935, 0x89FD, 0x5936, + 0x89FE, 0x593B, 0x8A40, 0x593D, 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, + 0x5940, 0x8A44, 0x5943, 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, + 0x8A48, 0x594C, 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, + 0x5953, 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, 0x8A55, + 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, 0x8A59, 0x5969, + 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, 0x8A5D, 0x596D, 0x8A5E, + 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, 0x8A61, 0x5971, 0x8A62, 0x5972, + 0x8A63, 0x5975, 0x8A64, 0x5977, 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, + 0x597C, 0x8A68, 0x597E, 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, + 0x8A6C, 0x5989, 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, + 0x598F, 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, + 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, 0x8A79, + 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, 0x8A7D, 0x59A2, + 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, 0x8A82, 0x59AD, 0x8A83, + 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, 0x8A86, 0x59B4, 0x8A87, 0x59B5, + 0x8A88, 0x59B6, 0x8A89, 0x59B7, 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, + 0x59BC, 0x8A8D, 0x59BD, 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, + 0x8A91, 0x59C2, 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, + 0x59C7, 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, 0x8A9E, + 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, 0x8AA2, 0x59E0, + 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, 0x8AA6, 0x59E6, 0x8AA7, + 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, + 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, + 0x59F2, 0x8AB1, 0x59F3, 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, + 0x8AB5, 0x59F7, 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, + 0x59FD, 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, + 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, 0x8AC2, + 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, 0x8AC6, 0x5A16, + 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, 0x8ACA, 0x5A1B, 0x8ACB, + 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, + 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, + 0x5A2B, 0x8AD5, 0x5A2C, 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, + 0x8AD9, 0x5A30, 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, + 0x5A38, 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, 0x8AE6, + 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, 0x8AEA, 0x5A48, + 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, 0x8AEE, 0x5A4E, 0x8AEF, + 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, + 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, + 0x5A59, 0x8AF9, 0x5A5B, 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, + 0x8AFD, 0x5A5F, 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, + 0x5A64, 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, + 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, 0x8B4B, + 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, 0x8B4F, 0x5A73, + 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, 0x8B53, 0x5A7C, 0x8B54, + 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, 0x8B57, 0x5A81, 0x8B58, 0x5A82, + 0x8B59, 0x5A83, 0x8B5A, 0x5A84, 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, + 0x5A87, 0x8B5E, 0x5A88, 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, + 0x8B62, 0x5A8C, 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, + 0x5A90, 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, 0x8B6F, + 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, 0x8B73, 0x5AA0, + 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, 0x8B77, 0x5AA4, 0x8B78, + 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, + 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, + 0x5AAF, 0x8B83, 0x5AB0, 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, + 0x8B87, 0x5AB7, 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, + 0x5ABC, 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, + 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, 0x8B94, + 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, 0x8B98, 0x5ACE, + 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, 0x8B9C, 0x5AD3, 0x8B9D, + 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, + 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, + 0x5AE4, 0x8BA7, 0x5AE5, 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, + 0x8BAB, 0x5AEC, 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, + 0x5AF0, 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, 0x8BB8, + 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, 0x8BBC, 0x5AFE, + 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, 0x8BC0, 0x5B02, 0x8BC1, + 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, + 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, + 0x5B0D, 0x8BCB, 0x5B0E, 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, + 0x8BCF, 0x5B12, 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, + 0x5B18, 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, + 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, 0x8BDC, + 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, 0x8BE0, 0x5B25, + 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, 0x8BE4, 0x5B29, 0x8BE5, + 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, + 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, + 0x5B35, 0x8BEF, 0x5B36, 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, + 0x8BF3, 0x5B3B, 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, + 0x5B3F, 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, 0x8C41, + 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, 0x8C45, 0x5B4D, + 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, 0x8C49, 0x5B56, 0x8C4A, + 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, + 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, + 0x5B72, 0x8C54, 0x5B74, 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, + 0x8C58, 0x5B79, 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, + 0x5B7F, 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, + 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, 0x8C65, + 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, 0x8C69, 0x5BA8, + 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, 0x8C6D, 0x5BAE, 0x8C6E, + 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, + 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, + 0x5BC3, 0x8C78, 0x5BC8, 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, + 0x8C7C, 0x5BCD, 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, + 0x5BD4, 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, 0x8C8A, + 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, 0x8C8E, 0x5BE7, + 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, 0x8C92, 0x5BEC, 0x8C93, + 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, + 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, + 0x5BFD, 0x8C9D, 0x5BFE, 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, + 0x8CA1, 0x5C05, 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, + 0x5C0C, 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, + 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, 0x8CAE, + 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, 0x8CB2, 0x5C23, + 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, 0x8CB6, 0x5C2A, 0x8CB7, + 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, + 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, + 0x5C37, 0x8CC1, 0x5C43, 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, + 0x8CC5, 0x5C4C, 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, + 0x5C54, 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, 0x8CD2, + 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, 0x8CD6, 0x5C69, + 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, 0x8CDA, 0x5C6D, 0x8CDB, + 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, + 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, + 0x5C7C, 0x8CE5, 0x5C7D, 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, + 0x8CE9, 0x5C84, 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, + 0x5C89, 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, + 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, 0x8CF6, + 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, 0x8CFA, 0x5CA4, + 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, 0x8CFE, 0x5CA8, 0x8D40, + 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, + 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, + 0x5CBB, 0x8D4A, 0x5CBC, 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, + 0x8D4E, 0x5CC3, 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, + 0x5CC8, 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, 0x8D5B, + 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, 0x8D5F, 0x5CD7, + 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, 0x8D63, 0x5CDC, 0x8D64, + 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, + 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, + 0x5CEC, 0x8D6E, 0x5CEE, 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, + 0x8D72, 0x5CF3, 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, + 0x5CF7, 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, + 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, 0x8D80, + 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, 0x8D84, 0x5D09, + 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, 0x8D88, 0x5D0D, 0x8D89, + 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, + 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, + 0x5D1A, 0x8D93, 0x5D1C, 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, + 0x8D97, 0x5D21, 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, + 0x5D28, 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, 0x8DA4, + 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, 0x8DA8, 0x5D39, + 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, 0x8DAC, 0x5D3F, 0x8DAD, + 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, + 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, + 0x5D4D, 0x8DB7, 0x5D4E, 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, + 0x8DBB, 0x5D52, 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, + 0x5D56, 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, + 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, 0x8DC8, + 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, 0x8DCC, 0x5D66, + 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, 0x8DD0, 0x5D6D, 0x8DD1, + 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, + 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, + 0x5D79, 0x8DDB, 0x5D7A, 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, + 0x8DDF, 0x5D7E, 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, + 0x5D83, 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, 0x8DEC, + 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, 0x8DF0, 0x5D90, + 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, 0x8DF4, 0x5D94, 0x8DF5, + 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, + 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, + 0x5DA0, 0x8E40, 0x5DA1, 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, + 0x8E44, 0x5DA5, 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, + 0x5DA9, 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, + 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, 0x8E51, + 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, 0x8E55, 0x5DB6, + 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, 0x8E59, 0x5DBB, 0x8E5A, + 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, + 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, + 0x5DC6, 0x8E64, 0x5DC7, 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, + 0x8E68, 0x5DCB, 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, + 0x5DD0, 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, 0x8E75, + 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, 0x8E79, 0x5DE0, + 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, 0x8E7D, 0x5DEC, 0x8E7E, + 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, + 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, + 0x5DFF, 0x8E89, 0x5E00, 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, + 0x8E8D, 0x5E0A, 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, + 0x5E12, 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, + 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, 0x8E9A, + 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, 0x8E9E, 0x5E2A, + 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, 0x8EA2, 0x5E30, 0x8EA3, + 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, + 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, + 0x5E40, 0x8EAD, 0x5E41, 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, + 0x8EB1, 0x5E48, 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, + 0x5E4D, 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, 0x8EBE, + 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, 0x8EC2, 0x5E5D, + 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, 0x8EC6, 0x5E64, 0x8EC7, + 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, + 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, + 0x5E6E, 0x8ED1, 0x5E6F, 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, + 0x8ED5, 0x5E77, 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, + 0x5E82, 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, + 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, 0x8EE2, + 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, 0x8EE6, 0x5EA2, + 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, 0x8EEA, 0x5EA9, 0x8EEB, + 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, + 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, + 0x5EBA, 0x8EF5, 0x5EBB, 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, + 0x8EF9, 0x5EC0, 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, + 0x5EC4, 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, 0x8F47, + 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, 0x8F4B, 0x5ED7, + 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, 0x8F4F, 0x5EDC, 0x8F50, + 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, + 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, + 0x5EE6, 0x8F5A, 0x5EE7, 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, + 0x8F5E, 0x5EED, 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, + 0x5EF1, 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, + 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, 0x8F6B, + 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, 0x8F6F, 0x5F0C, + 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, 0x8F73, 0x5F12, 0x8F74, + 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, + 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, + 0x5F23, 0x8F7E, 0x5F24, 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, + 0x8F83, 0x5F2E, 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, + 0x5F34, 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, 0x8F90, + 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, 0x8F94, 0x5F45, + 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, 0x8F98, 0x5F49, 0x8F99, + 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, + 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, + 0x5F5A, 0x8FA3, 0x5F5B, 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, + 0x8FA7, 0x5F60, 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, + 0x5F68, 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, + 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, 0x8FB4, + 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, 0x8FB8, 0x5F83, + 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, 0x8FBC, 0x5F8F, 0x8FBD, + 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, + 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, + 0x5FA0, 0x8FC7, 0x5FA2, 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, + 0x8FCB, 0x5FA6, 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, + 0x5FAC, 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, 0x8FD8, + 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, 0x8FDC, 0x5FBF, + 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, 0x8FE0, 0x5FC7, 0x8FE1, + 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, + 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, + 0x5FDC, 0x8FEB, 0x5FDE, 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, + 0x8FEF, 0x5FE5, 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, + 0x5FEC, 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, + 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, 0x8FFC, + 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, 0x9041, 0x6009, + 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, 0x9045, 0x6011, 0x9046, + 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, 0x9049, 0x601A, 0x904A, 0x601E, + 0x904B, 0x601F, 0x904C, 0x6022, 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, + 0x602C, 0x9050, 0x602D, 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, + 0x9054, 0x6032, 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, + 0x6037, 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, 0x9061, + 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, 0x9065, 0x604A, + 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, 0x9069, 0x6051, 0x906A, + 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, 0x906D, 0x6057, 0x906E, 0x6058, + 0x906F, 0x605B, 0x9070, 0x605C, 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, + 0x6060, 0x9074, 0x6061, 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, + 0x9078, 0x6071, 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, + 0x6077, 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, + 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, 0x9086, + 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, 0x908A, 0x6090, + 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, 0x908E, 0x6097, 0x908F, + 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, 0x9092, 0x609E, 0x9093, 0x60A1, + 0x9094, 0x60A2, 0x9095, 0x60A4, 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, + 0x60A9, 0x9099, 0x60AA, 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, + 0x909D, 0x60B5, 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, + 0x60BA, 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, 0x90AA, + 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, 0x90AE, 0x60CD, + 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, 0x90B2, 0x60D2, 0x90B3, + 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, 0x90B6, 0x60D7, 0x90B7, 0x60D9, + 0x90B8, 0x60DB, 0x90B9, 0x60DE, 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, + 0x60E3, 0x90BD, 0x60E4, 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, + 0x90C1, 0x60F2, 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, + 0x60FB, 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, + 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, 0x90CE, + 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, 0x90D2, 0x6110, + 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, 0x90D6, 0x6114, 0x90D7, + 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, 0x90DA, 0x6119, 0x90DB, 0x611B, + 0x90DC, 0x611C, 0x90DD, 0x611D, 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, + 0x6122, 0x90E1, 0x6125, 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, + 0x90E5, 0x612C, 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, + 0x6130, 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, 0x90F2, + 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, 0x90F6, 0x613D, + 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, 0x90FA, 0x6142, 0x90FB, + 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, 0x90FE, 0x6146, 0x9140, 0x6147, + 0x9141, 0x6149, 0x9142, 0x614B, 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, + 0x6150, 0x9146, 0x6152, 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, + 0x914A, 0x6157, 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, + 0x615B, 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, + 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, 0x9157, + 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, 0x915B, 0x616C, + 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, 0x915F, 0x6171, 0x9160, + 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, 0x9163, 0x6176, 0x9164, 0x6178, + 0x9165, 0x6179, 0x9166, 0x617A, 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, + 0x617D, 0x916A, 0x617E, 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, + 0x916E, 0x6182, 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, + 0x6186, 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, 0x917B, + 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, 0x9180, 0x6196, + 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, 0x9184, 0x619A, 0x9185, + 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, 0x9188, 0x619F, 0x9189, 0x61A0, + 0x918A, 0x61A1, 0x918B, 0x61A2, 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, + 0x61A5, 0x918F, 0x61A6, 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, + 0x9193, 0x61AE, 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, + 0x61B2, 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, + 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, 0x91A0, + 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, 0x91A4, 0x61C1, + 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, 0x91A8, 0x61C6, 0x91A9, + 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, 0x91AC, 0x61CD, 0x91AD, 0x61CE, + 0x91AE, 0x61CF, 0x91AF, 0x61D0, 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, + 0x61D6, 0x91B3, 0x61D7, 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, + 0x91B7, 0x61DB, 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, + 0x61DF, 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, 0x91C4, + 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, 0x91C8, 0x61ED, + 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, 0x91CC, 0x61F1, 0x91CD, + 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, 0x91D0, 0x61F6, 0x91D1, 0x61F7, + 0x91D2, 0x61F8, 0x91D3, 0x61F9, 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, + 0x61FC, 0x91D7, 0x61FD, 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, + 0x91DB, 0x6202, 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, + 0x6207, 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, + 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, 0x91E8, + 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, 0x91EC, 0x6229, + 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, 0x91F0, 0x6230, 0x91F1, + 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, 0x91F4, 0x6236, 0x91F5, 0x6238, + 0x91F6, 0x6239, 0x91F7, 0x623A, 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, + 0x6242, 0x91FB, 0x6244, 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, + 0x9240, 0x624F, 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, + 0x6257, 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, 0x924D, + 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, 0x9251, 0x6271, + 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, 0x9255, 0x6277, 0x9256, + 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, 0x9259, 0x627D, 0x925A, 0x6281, + 0x925B, 0x6282, 0x925C, 0x6283, 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, + 0x6287, 0x9260, 0x6288, 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, + 0x9264, 0x628E, 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, + 0x6299, 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, + 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, 0x9271, + 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, 0x9275, 0x62B2, + 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, 0x9279, 0x62B7, 0x927A, + 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, 0x927D, 0x62C0, 0x927E, 0x62C1, + 0x9280, 0x62C3, 0x9281, 0x62CB, 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, + 0x62D5, 0x9285, 0x62DD, 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, + 0x9289, 0x62E4, 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, + 0x62F2, 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, 0x9296, + 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, 0x929A, 0x630C, + 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, 0x929E, 0x6312, 0x929F, + 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, 0x92A2, 0x6317, 0x92A3, 0x6318, + 0x92A4, 0x6319, 0x92A5, 0x631C, 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, + 0x6329, 0x92A9, 0x632C, 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, + 0x92AD, 0x6331, 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, + 0x6336, 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, + 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, 0x92BA, + 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, 0x92BE, 0x6351, + 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, 0x92C2, 0x6356, 0x92C3, + 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, 0x92C6, 0x635A, 0x92C7, 0x635B, + 0x92C8, 0x635C, 0x92C9, 0x635D, 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, + 0x6365, 0x92CD, 0x6366, 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, + 0x92D1, 0x636C, 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, + 0x6373, 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, 0x92DE, + 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, 0x92E2, 0x6386, + 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, 0x92E6, 0x6393, 0x92E7, + 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, 0x92EA, 0x6399, 0x92EB, 0x639A, + 0x92EC, 0x639B, 0x92ED, 0x639C, 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, + 0x639F, 0x92F1, 0x63A1, 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, + 0x92F5, 0x63AF, 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, + 0x63B6, 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, + 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, 0x9343, + 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, 0x9347, 0x63CB, + 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, 0x934B, 0x63D4, 0x934C, + 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, 0x934F, 0x63D9, 0x9350, 0x63DA, + 0x9351, 0x63DB, 0x9352, 0x63DC, 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, + 0x63E2, 0x9356, 0x63E4, 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, + 0x935A, 0x63E8, 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, + 0x63EF, 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, 0x9367, + 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, 0x936B, 0x6406, + 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, 0x936F, 0x640A, 0x9370, + 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, 0x9373, 0x6412, 0x9374, 0x6415, + 0x9375, 0x6416, 0x9376, 0x6417, 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, + 0x641A, 0x937A, 0x641D, 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, + 0x937E, 0x6424, 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, + 0x6429, 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, + 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, 0x938C, + 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, 0x9390, 0x643B, + 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, 0x9394, 0x6442, 0x9395, + 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, 0x9398, 0x644C, 0x9399, 0x644D, + 0x939A, 0x644E, 0x939B, 0x644F, 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, + 0x6453, 0x939F, 0x6455, 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, + 0x93A3, 0x645A, 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, + 0x645F, 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, 0x93B0, + 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, 0x93B4, 0x646F, + 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, 0x93B8, 0x6473, 0x93B9, + 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, 0x93BC, 0x6477, 0x93BD, 0x647B, + 0x93BE, 0x647C, 0x93BF, 0x647D, 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, + 0x6480, 0x93C3, 0x6481, 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, + 0x93C7, 0x6489, 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, + 0x648D, 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, + 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, 0x93D4, + 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, 0x93D8, 0x64A0, + 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, 0x93DC, 0x64A5, 0x93DD, + 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, 0x93E0, 0x64AA, 0x93E1, 0x64AB, + 0x93E2, 0x64AF, 0x93E3, 0x64B1, 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, + 0x64B4, 0x93E7, 0x64B6, 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, + 0x93EB, 0x64BE, 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, + 0x64C4, 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, 0x93F8, + 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, 0x93FC, 0x64D6, + 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, 0x9441, 0x64DC, 0x9442, + 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, 0x9445, 0x64E1, 0x9446, 0x64E3, + 0x9447, 0x64E5, 0x9448, 0x64E7, 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, + 0x64EA, 0x944C, 0x64EB, 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, + 0x9450, 0x64EF, 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, + 0x64F3, 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, + 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, 0x945D, + 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, 0x9461, 0x6501, + 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, 0x9465, 0x6505, 0x9466, + 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, 0x9469, 0x650A, 0x946A, 0x650B, + 0x946B, 0x650C, 0x946C, 0x650D, 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, + 0x6510, 0x9470, 0x6511, 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, + 0x9474, 0x6516, 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, + 0x651B, 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, 0x9482, + 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, 0x9486, 0x6529, + 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, 0x948A, 0x6530, 0x948B, + 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, 0x948E, 0x6537, 0x948F, 0x653A, + 0x9490, 0x653C, 0x9491, 0x653D, 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, + 0x6542, 0x9495, 0x6543, 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, + 0x9499, 0x654A, 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, + 0x6550, 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, + 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, 0x94A6, + 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, 0x94AA, 0x6567, + 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, 0x94AE, 0x656D, 0x94AF, + 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, 0x94B2, 0x6573, 0x94B3, 0x6575, + 0x94B4, 0x6576, 0x94B5, 0x6578, 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, + 0x657B, 0x94B9, 0x657C, 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, + 0x94BD, 0x6580, 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, + 0x6584, 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, 0x94CA, + 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, 0x94CE, 0x6598, + 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, 0x94D2, 0x65A0, 0x94D3, + 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, 0x94D6, 0x65A8, 0x94D7, 0x65AA, + 0x94D8, 0x65AC, 0x94D9, 0x65AE, 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, + 0x65B3, 0x94DD, 0x65B4, 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, + 0x94E1, 0x65B8, 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, + 0x65BF, 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, + 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, 0x94EE, + 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, 0x94F2, 0x65D8, + 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, 0x94F6, 0x65DC, 0x94F7, + 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, 0x94FA, 0x65E1, 0x94FB, 0x65E3, + 0x94FC, 0x65E4, 0x94FD, 0x65EA, 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, + 0x65F3, 0x9542, 0x65F4, 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, + 0x9546, 0x65FB, 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, + 0x65FF, 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, 0x9553, + 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, 0x9557, 0x6617, + 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, 0x955B, 0x661C, 0x955C, + 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, 0x955F, 0x6623, 0x9560, 0x6624, + 0x9561, 0x6626, 0x9562, 0x6629, 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, + 0x662C, 0x9566, 0x662E, 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, + 0x956A, 0x6637, 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, + 0x663B, 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, + 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, 0x9577, + 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, 0x957B, 0x664E, + 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, 0x9580, 0x6659, 0x9581, + 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, 0x9584, 0x665E, 0x9585, 0x6660, + 0x9586, 0x6662, 0x9587, 0x6663, 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, + 0x6669, 0x958B, 0x666A, 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, + 0x958F, 0x6671, 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, + 0x6678, 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, 0x959C, + 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, 0x95A0, 0x668A, + 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, 0x95A4, 0x668F, 0x95A5, + 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, 0x95A8, 0x6694, 0x95A9, 0x6695, + 0x95AA, 0x6698, 0x95AB, 0x6699, 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, + 0x669C, 0x95AF, 0x669E, 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, + 0x95B3, 0x66A2, 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, + 0x66A6, 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, + 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, 0x95C0, + 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, 0x95C4, 0x66B7, + 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, 0x95C8, 0x66BC, 0x95C9, + 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, 0x95CC, 0x66C1, 0x95CD, 0x66C2, + 0x95CE, 0x66C3, 0x95CF, 0x66C4, 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, + 0x66C7, 0x95D3, 0x66C8, 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, + 0x95D7, 0x66CC, 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, + 0x66D0, 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, 0x95E4, + 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, 0x95E8, 0x66E1, + 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, 0x95EC, 0x66E5, 0x95ED, + 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, 0x95F0, 0x66EB, 0x95F1, 0x66EC, + 0x95F2, 0x66ED, 0x95F3, 0x66EE, 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, + 0x66F5, 0x95F7, 0x66F6, 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, + 0x95FB, 0x66FD, 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, + 0x6704, 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, + 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, 0x9649, + 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, 0x964D, 0x671A, + 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, 0x9651, 0x6721, 0x9652, + 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, 0x9655, 0x6725, 0x9656, 0x6727, + 0x9657, 0x6729, 0x9658, 0x672E, 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, + 0x6733, 0x965C, 0x6736, 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, + 0x9660, 0x673B, 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, + 0x6741, 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, 0x966D, + 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, 0x9671, 0x675A, + 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, 0x9675, 0x6763, 0x9676, + 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, 0x9679, 0x676B, 0x967A, 0x676C, + 0x967B, 0x676E, 0x967C, 0x6771, 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, + 0x6778, 0x9681, 0x6779, 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, + 0x9685, 0x6780, 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, + 0x6786, 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, + 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, 0x9692, + 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, 0x9696, 0x679B, + 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, 0x969A, 0x67A4, 0x969B, + 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, 0x969E, 0x67AE, 0x969F, 0x67B1, + 0x96A0, 0x67B2, 0x96A1, 0x67B4, 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, + 0x67BB, 0x96A5, 0x67BC, 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, + 0x96A9, 0x67C0, 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, + 0x67C7, 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, 0x96B6, + 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, 0x96BA, 0x67E1, + 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, 0x96BE, 0x67E7, 0x96BF, + 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, 0x96C2, 0x67ED, 0x96C3, 0x67EE, + 0x96C4, 0x67F2, 0x96C5, 0x67F5, 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, + 0x67F8, 0x96C9, 0x67F9, 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, + 0x96CD, 0x67FE, 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, + 0x6804, 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, + 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, 0x96DA, + 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, 0x96DE, 0x681F, + 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, 0x96E2, 0x6824, 0x96E3, + 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, 0x96E6, 0x6828, 0x96E7, 0x682B, + 0x96E8, 0x682C, 0x96E9, 0x682D, 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, + 0x6830, 0x96ED, 0x6831, 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, + 0x96F1, 0x683A, 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, + 0x684B, 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, 0x96FE, + 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, 0x9743, 0x685F, + 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, 0x9747, 0x686E, 0x9748, + 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, 0x974B, 0x6872, 0x974C, 0x6873, + 0x974D, 0x6875, 0x974E, 0x6878, 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, + 0x687B, 0x9752, 0x687C, 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, + 0x9756, 0x6880, 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, + 0x6888, 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, + 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, 0x9763, + 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, 0x9767, 0x6898, + 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, 0x976B, 0x689C, 0x976C, + 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, 0x976F, 0x68A0, 0x9770, 0x68A1, + 0x9771, 0x68A3, 0x9772, 0x68A4, 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, + 0x68AA, 0x9776, 0x68AB, 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, + 0x977A, 0x68B2, 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, + 0x68B8, 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, 0x9788, + 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, 0x978C, 0x68C7, + 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, 0x9790, 0x68CE, 0x9791, + 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, 0x9794, 0x68D3, 0x9795, 0x68D4, + 0x9796, 0x68D6, 0x9797, 0x68D7, 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, + 0x68DC, 0x979B, 0x68DD, 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, + 0x979F, 0x68E2, 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, + 0x68E7, 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, + 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, 0x97AC, + 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, 0x97B0, 0x68F8, + 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, 0x97B4, 0x68FF, 0x97B5, + 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, 0x97B8, 0x6904, 0x97B9, 0x6906, + 0x97BA, 0x6907, 0x97BB, 0x6908, 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, + 0x690C, 0x97BF, 0x690F, 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, + 0x97C3, 0x6915, 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, + 0x6919, 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, 0x97D0, + 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, 0x97D4, 0x6929, + 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, 0x97D8, 0x692E, 0x97D9, + 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, 0x97DC, 0x6933, 0x97DD, 0x6935, + 0x97DE, 0x6936, 0x97DF, 0x6937, 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, + 0x693B, 0x97E3, 0x693C, 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, + 0x97E7, 0x6943, 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, + 0x6947, 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, + 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, 0x97F4, + 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, 0x97F8, 0x6955, + 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, 0x97FC, 0x695B, 0x97FD, + 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, 0x9841, 0x6962, 0x9842, 0x6964, + 0x9843, 0x6965, 0x9844, 0x6967, 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, + 0x696A, 0x9848, 0x696C, 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, + 0x984C, 0x6972, 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, + 0x6976, 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, 0x9859, + 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, 0x985D, 0x698F, + 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, 0x9861, 0x6993, 0x9862, + 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, 0x9865, 0x699A, 0x9866, 0x699D, + 0x9867, 0x699E, 0x9868, 0x699F, 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, + 0x69A2, 0x986C, 0x69A3, 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, + 0x9870, 0x69A9, 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, + 0x69AF, 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, + 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, 0x987D, + 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, 0x9882, 0x69C0, + 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, 0x9886, 0x69C5, 0x9887, + 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, 0x988A, 0x69C9, 0x988B, 0x69CB, + 0x988C, 0x69CD, 0x988D, 0x69CF, 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, + 0x69D3, 0x9891, 0x69D5, 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, + 0x9895, 0x69D9, 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, + 0x69DE, 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, 0x98A2, + 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, 0x98A6, 0x69EE, + 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, 0x98AA, 0x69F3, 0x98AB, + 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, 0x98AE, 0x69F7, 0x98AF, 0x69F8, + 0x98B0, 0x69F9, 0x98B1, 0x69FA, 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, + 0x69FE, 0x98B5, 0x6A00, 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, + 0x98B9, 0x6A04, 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, + 0x6A08, 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, + 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, 0x98C6, + 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, 0x98CA, 0x6A16, + 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, 0x98CE, 0x6A1C, 0x98CF, + 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, 0x98D2, 0x6A22, 0x98D3, 0x6A23, + 0x98D4, 0x6A24, 0x98D5, 0x6A25, 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, + 0x6A29, 0x98D9, 0x6A2B, 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, + 0x98DD, 0x6A30, 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, + 0x6A36, 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, 0x98EA, + 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, 0x98EE, 0x6A46, + 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, 0x98F2, 0x6A4B, 0x98F3, + 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, 0x98F6, 0x6A4F, 0x98F7, 0x6A51, + 0x98F8, 0x6A52, 0x98F9, 0x6A53, 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, + 0x6A56, 0x98FD, 0x6A57, 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, + 0x9942, 0x6A5E, 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, + 0x6A63, 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, + 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, 0x994F, + 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, 0x9953, 0x6A72, + 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, 0x9957, 0x6A76, 0x9958, + 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, 0x995B, 0x6A7B, 0x995C, 0x6A7D, + 0x995D, 0x6A7E, 0x995E, 0x6A7F, 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, + 0x6A83, 0x9962, 0x6A85, 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, + 0x9966, 0x6A89, 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, + 0x6A8D, 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, 0x9973, + 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, 0x9977, 0x6A9E, + 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, 0x997B, 0x6AA3, 0x997C, + 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, 0x9980, 0x6AA7, 0x9981, 0x6AA8, + 0x9982, 0x6AAA, 0x9983, 0x6AAD, 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, + 0x6AB0, 0x9987, 0x6AB1, 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, + 0x998B, 0x6AB5, 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, + 0x6AB9, 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, + 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, 0x9998, + 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, 0x999C, 0x6AC6, + 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, 0x99A0, 0x6ACA, 0x99A1, + 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, + 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, + 0x6AD4, 0x99AB, 0x6AD5, 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, + 0x99AF, 0x6AD9, 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, + 0x6ADD, 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, 0x99BC, + 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, 0x99C0, 0x6AEA, + 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, 0x99C4, 0x6AEE, 0x99C5, + 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, + 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, + 0x6AF8, 0x99CF, 0x6AF9, 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, + 0x99D3, 0x6AFD, 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, + 0x6B01, 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, + 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, 0x99E0, + 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, 0x99E4, 0x6B0E, + 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, 0x99E8, 0x6B12, 0x99E9, + 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, 0x99EC, 0x6B16, 0x99ED, 0x6B17, + 0x99EE, 0x6B18, 0x99EF, 0x6B19, 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, + 0x6B1C, 0x99F3, 0x6B1D, 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, + 0x99F7, 0x6B26, 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, + 0x6B2B, 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, 0x9A45, + 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, 0x9A49, 0x6B3C, + 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, 0x9A4D, 0x6B41, 0x9A4E, + 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, 0x9A51, 0x6B48, 0x9A52, 0x6B4A, + 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, + 0x6B50, 0x9A58, 0x6B51, 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, + 0x9A5C, 0x6B55, 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, + 0x6B5A, 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, + 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, 0x9A69, + 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, 0x9A6D, 0x6B6E, + 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, 0x9A71, 0x6B72, 0x9A72, + 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, 0x9A75, 0x6B76, 0x9A76, 0x6B77, + 0x9A77, 0x6B78, 0x9A78, 0x6B7A, 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, + 0x6B7F, 0x9A7C, 0x6B80, 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, + 0x9A81, 0x6B8E, 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, + 0x6B94, 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, 0x9A8E, + 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, 0x9A92, 0x6BA5, + 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, 0x9A96, 0x6BA9, 0x9A97, + 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, + 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, + 0x6BB8, 0x9AA1, 0x6BB9, 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, + 0x9AA5, 0x6BBD, 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, + 0x6BC4, 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, + 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, 0x9AB2, + 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, 0x9AB6, 0x6BDD, + 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, 0x9ABA, 0x6BE2, 0x9ABB, + 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, + 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, + 0x6BEE, 0x9AC5, 0x6BF0, 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, + 0x9AC9, 0x6BF6, 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, + 0x6BFB, 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, 0x9AD6, + 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, 0x9ADA, 0x6C0C, + 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, 0x9ADE, 0x6C1C, 0x9ADF, + 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, + 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, + 0x6C33, 0x9AE9, 0x6C36, 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, + 0x9AED, 0x6C3B, 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, + 0x6C43, 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, + 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, 0x9AFA, + 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, 0x9AFE, 0x6C58, + 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, 0x9B43, 0x6C63, 0x9B44, + 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, + 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, + 0x6C73, 0x9B4E, 0x6C75, 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, + 0x9B52, 0x6C7B, 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, + 0x6C84, 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, 0x9B5F, + 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, 0x9B63, 0x6C9C, + 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, 0x9B67, 0x6CA2, 0x9B68, + 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, + 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, + 0x6CC0, 0x9B72, 0x6CC1, 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, + 0x9B76, 0x6CC7, 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, + 0x6CCE, 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, + 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, 0x9B84, + 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, 0x9B88, 0x6CE9, + 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, 0x9B8C, 0x6CF4, 0x9B8D, + 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, 0x9B90, 0x6D02, 0x9B91, 0x6D03, + 0x9B92, 0x6D05, 0x9B93, 0x6D06, 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, + 0x6D0A, 0x9B97, 0x6D0D, 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, + 0x9B9B, 0x6D13, 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, + 0x6D18, 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, 0x9BA8, + 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, 0x9BAC, 0x6D2D, + 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, 0x9BB0, 0x6D36, 0x9BB1, + 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, + 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, + 0x6D50, 0x9BBB, 0x6D55, 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, + 0x9BBF, 0x6D5B, 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, + 0x6D62, 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, + 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, 0x9BCC, + 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, 0x9BD0, 0x6D76, + 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, 0x9BD4, 0x6D7D, 0x9BD5, + 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, + 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, + 0x6D8B, 0x9BDF, 0x6D8D, 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, + 0x9BE3, 0x6D96, 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, + 0x6D9A, 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, 0x9BF0, + 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, 0x9BF4, 0x6DBA, + 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, 0x9BF8, 0x6DBE, 0x9BF9, + 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, + 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, + 0x6DD0, 0x9C44, 0x6DD2, 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, + 0x9C48, 0x6DD7, 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, + 0x6DDF, 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, + 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, 0x9C55, + 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, 0x9C59, 0x6DF5, + 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, 0x9C5D, 0x6DFD, 0x9C5E, + 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, 0x9C61, 0x6E01, 0x9C62, 0x6E02, + 0x9C63, 0x6E03, 0x9C64, 0x6E04, 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, + 0x6E08, 0x9C68, 0x6E09, 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, + 0x9C6C, 0x6E13, 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, + 0x6E1B, 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, 0x9C79, + 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, 0x9C7D, 0x6E33, + 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, 0x9C82, 0x6E39, 0x9C83, + 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, + 0x9C88, 0x6E40, 0x9C89, 0x6E41, 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, + 0x6E46, 0x9C8D, 0x6E47, 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, + 0x9C91, 0x6E4B, 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, + 0x6E51, 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, + 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, 0x9C9E, + 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, 0x9CA2, 0x6E64, + 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, 0x9CA6, 0x6E68, 0x9CA7, + 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, + 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, + 0x6E74, 0x9CB1, 0x6E75, 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, + 0x9CB5, 0x6E79, 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, + 0x6E7D, 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, 0x9CC2, + 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, 0x9CC6, 0x6E92, + 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, 0x9CCA, 0x6E96, 0x9CCB, + 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, + 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, + 0x6EA4, 0x9CD5, 0x6EA6, 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, + 0x9CD9, 0x6EAC, 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, + 0x6EB3, 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, + 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, 0x9CE6, + 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, 0x9CEA, 0x6EC9, + 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, 0x9CEE, 0x6ECE, 0x9CEF, + 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, + 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, + 0x6EE7, 0x9CF9, 0x6EEA, 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, + 0x9CFD, 0x6EEE, 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, + 0x6EF2, 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, 0x9D4B, + 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, 0x9D4F, 0x6F01, + 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, 0x9D53, 0x6F07, 0x9D54, + 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, + 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, + 0x6F16, 0x9D5E, 0x6F17, 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, + 0x9D62, 0x6F1B, 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, + 0x6F1F, 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, + 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, 0x9D6F, + 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, 0x9D73, 0x6F35, + 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, 0x9D77, 0x6F3A, 0x9D78, + 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, + 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, + 0x6F45, 0x9D83, 0x6F48, 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, + 0x9D87, 0x6F4E, 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, + 0x6F52, 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, 0x9D94, + 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, 0x9D98, 0x6F63, + 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, 0x9D9C, 0x6F68, 0x9D9D, + 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, + 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, + 0x6F76, 0x9DA7, 0x6F77, 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, + 0x9DAB, 0x6F7E, 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, + 0x6F82, 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, + 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, 0x9DB8, + 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, 0x9DBC, 0x6F95, + 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, 0x9DC0, 0x6F99, 0x9DC1, + 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, + 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, + 0x6FA5, 0x9DCB, 0x6FA6, 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, + 0x9DCF, 0x6FAB, 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, + 0x6FAF, 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, 0x9DDC, + 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, 0x9DE0, 0x6FBF, + 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, 0x9DE4, 0x6FC5, 0x9DE5, + 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, + 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, + 0x6FD0, 0x9DEF, 0x6FD3, 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, + 0x9DF3, 0x6FD7, 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, + 0x6FDB, 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, + 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, 0x9E41, + 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, 0x9E45, 0x6FEB, + 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, 0x9E49, 0x6FF1, 0x9E4A, + 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, + 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, + 0x6FFB, 0x9E54, 0x6FFC, 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, + 0x9E58, 0x7000, 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, + 0x7004, 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, 0x9E65, + 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, 0x9E69, 0x7012, + 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, 0x9E6D, 0x7016, 0x9E6E, + 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, 0x9E71, 0x701C, 0x9E72, 0x701D, + 0x9E73, 0x701E, 0x9E74, 0x701F, 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, + 0x7022, 0x9E78, 0x7024, 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, + 0x9E7C, 0x7028, 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, + 0x702C, 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, + 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, 0x9E8A, + 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, 0x9E8E, 0x703B, + 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, 0x9E92, 0x703F, 0x9E93, + 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, 0x9E96, 0x7043, 0x9E97, 0x7044, + 0x9E98, 0x7045, 0x9E99, 0x7046, 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, + 0x7049, 0x9E9D, 0x704A, 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, + 0x9EA1, 0x7050, 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, + 0x7054, 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, 0x9EAE, + 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, 0x9EB2, 0x7062, + 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, 0x9EB6, 0x7066, 0x9EB7, + 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, 0x9EBA, 0x706A, 0x9EBB, 0x706E, + 0x9EBC, 0x7071, 0x9EBD, 0x7072, 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, + 0x7077, 0x9EC1, 0x7079, 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, + 0x9EC5, 0x7081, 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, + 0x7086, 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, + 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, 0x9ED2, + 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, 0x9ED6, 0x709B, + 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, 0x9EDA, 0x70A1, 0x9EDB, + 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, + 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, + 0x70B0, 0x9EE5, 0x70B2, 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, + 0x9EE9, 0x70BA, 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, + 0x70C5, 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, 0x9EF6, + 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, 0x9EFA, 0x70D4, + 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, 0x9EFE, 0x70DA, 0x9F40, + 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, 0x9F43, 0x70E0, 0x9F44, 0x70E1, + 0x9F45, 0x70E2, 0x9F46, 0x70E3, 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, + 0x70EE, 0x9F4A, 0x70F0, 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, + 0x9F4E, 0x70F4, 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, + 0x70FA, 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, + 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, 0x9F5B, + 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, 0x9F5F, 0x7108, + 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, 0x9F63, 0x710E, 0x9F64, + 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, 0x9F67, 0x7114, 0x9F68, 0x7117, + 0x9F69, 0x711B, 0x9F6A, 0x711C, 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, + 0x711F, 0x9F6E, 0x7120, 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, + 0x9F72, 0x7124, 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, + 0x7129, 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, 0x9F80, + 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, 0x9F84, 0x713A, + 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, 0x9F88, 0x713E, 0x9F89, + 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, 0x9F8C, 0x7142, 0x9F8D, 0x7143, + 0x9F8E, 0x7144, 0x9F8F, 0x7146, 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, + 0x7149, 0x9F93, 0x714B, 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, + 0x9F97, 0x7151, 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, + 0x7155, 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, + 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, 0x9FA4, + 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, 0x9FA8, 0x7165, + 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, 0x9FAC, 0x716C, 0x9FAD, + 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, 0x9FB0, 0x7171, 0x9FB1, 0x7174, + 0x9FB2, 0x7175, 0x9FB3, 0x7176, 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, + 0x717B, 0x9FB7, 0x717C, 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, + 0x9FBB, 0x7181, 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, + 0x7186, 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, 0x9FC8, + 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, 0x9FCC, 0x7196, + 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, 0x9FD0, 0x719C, 0x9FD1, + 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, + 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, + 0x71A9, 0x9FDB, 0x71AA, 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, + 0x9FDF, 0x71AF, 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, + 0x71B4, 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, + 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, 0x9FEC, + 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, 0x9FF0, 0x71C4, + 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, 0x9FF4, 0x71C8, 0x9FF5, + 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, + 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, + 0x71D3, 0xA040, 0x71D6, 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, + 0xA044, 0x71DA, 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, + 0x71DE, 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, 0xA051, + 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, 0xA055, 0x71EF, + 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, 0xA059, 0x71F3, 0xA05A, + 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, 0xA05D, 0x71F7, 0xA05E, 0x71F8, + 0xA05F, 0x71FA, 0xA060, 0x71FB, 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, + 0x71FE, 0xA064, 0x71FF, 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, + 0xA068, 0x7203, 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, + 0x7208, 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, + 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, 0xA075, + 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, 0xA079, 0x7215, + 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, 0xA07D, 0x7219, 0xA07E, + 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, 0xA082, 0x721E, 0xA083, 0x721F, + 0xA084, 0x7220, 0xA085, 0x7221, 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, + 0x7224, 0xA089, 0x7225, 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, + 0xA08D, 0x722B, 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, + 0x7232, 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, 0xA09A, + 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, 0xA09E, 0x7249, + 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, 0xA0A2, 0x724F, 0xA0A3, + 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, 0xA0A6, 0x7254, 0xA0A7, 0x7255, + 0xA0A8, 0x7257, 0xA0A9, 0x7258, 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, + 0x725E, 0xA0AD, 0x7260, 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, + 0xA0B1, 0x7268, 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, + 0x726D, 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, + 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, 0xA0BE, + 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, 0xA0C2, 0x7285, + 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, 0xA0C6, 0x7289, 0xA0C7, + 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, 0xA0CA, 0x7291, 0xA0CB, 0x7293, + 0xA0CC, 0x7294, 0xA0CD, 0x7295, 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, + 0x7298, 0xA0D1, 0x7299, 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, + 0xA0D5, 0x729D, 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, + 0x72A2, 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, 0xA0E2, + 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, 0xA0E6, 0x72B3, + 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, 0xA0EA, 0x72BC, 0xA0EB, + 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, + 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, + 0x72CB, 0xA0F5, 0x72CC, 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, + 0xA0F9, 0x72D4, 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, + 0x72DA, 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, + 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, 0xA1A8, + 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, 0xA1AC, 0x2016, + 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, 0xA1B1, + 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, 0xA1B5, 0x3009, + 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, + 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, + 0xA1BF, 0x3011, 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, + 0x2236, 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, 0xA1CC, + 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, 0xA1D0, 0x2312, + 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, 0xA1D4, 0x2261, 0xA1D5, + 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, 0xA1D8, 0x221D, 0xA1D9, 0x2260, + 0xA1DA, 0x226E, 0xA1DB, 0x226F, 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, + 0x221E, 0xA1DF, 0x2235, 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, + 0xA1E3, 0x00B0, 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, + 0xFF04, 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, + 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, 0xA1F0, + 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, 0xA1F4, 0x25C6, + 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, 0xA1F8, 0x25B2, 0xA1F9, + 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, 0xA1FC, 0x2191, 0xA1FD, 0x2193, + 0xA1FE, 0x3013, 0xA2A1, 0x2170, 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, + 0x2173, 0xA2A5, 0x2174, 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, + 0xA2A9, 0x2178, 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, + 0x248A, 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, 0xA2BC, + 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, 0xA2C0, 0x2497, + 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, 0xA2C4, 0x249B, 0xA2C5, + 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, 0xA2C8, 0x2477, 0xA2C9, 0x2478, + 0xA2CA, 0x2479, 0xA2CB, 0x247A, 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, + 0x247D, 0xA2CF, 0x247E, 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, + 0xA2D3, 0x2482, 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, + 0x2486, 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, + 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, 0xA2E0, + 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, 0xA2E6, 0x3221, + 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, 0xA2EA, 0x3225, 0xA2EB, + 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, 0xA2EE, 0x3229, 0xA2F1, 0x2160, + 0xA2F2, 0x2161, 0xA2F3, 0x2162, 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, + 0x2165, 0xA2F7, 0x2166, 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, + 0xA2FB, 0x216A, 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, + 0xFF03, 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, + 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, 0xA3B0, 0xFF10, + 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, + 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, + 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, + 0xFF1E, 0xA3BF, 0xFF1F, 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, + 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, + 0xFF27, 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, 0xA3D0, + 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, + 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, 0xA3D8, 0xFF38, 0xA3D9, + 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, + 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, + 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, + 0xA3E7, 0xFF47, 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, + 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, + 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, 0xA3F8, 0xFF58, + 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, + 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, 0xA4A2, 0x3042, 0xA4A3, 0x3043, + 0xA4A4, 0x3044, 0xA4A5, 0x3045, 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, + 0x3048, 0xA4A9, 0x3049, 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, + 0xA4AD, 0x304D, 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, + 0x3051, 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, + 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, 0xA4BA, + 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, 0xA4BE, 0x305E, + 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, 0xA4C2, 0x3062, 0xA4C3, + 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, 0xA4C6, 0x3066, 0xA4C7, 0x3067, + 0xA4C8, 0x3068, 0xA4C9, 0x3069, 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, + 0x306C, 0xA4CD, 0x306D, 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, + 0xA4D1, 0x3071, 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, + 0x3075, 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, 0xA4DE, + 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, 0xA4E2, 0x3082, + 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, 0xA4E6, 0x3086, 0xA4E7, + 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, 0xA4EA, 0x308A, 0xA4EB, 0x308B, + 0xA4EC, 0x308C, 0xA4ED, 0x308D, 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, + 0x3090, 0xA4F1, 0x3091, 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, + 0xA5A2, 0x30A2, 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, + 0x30A6, 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, + 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, 0xA5AF, + 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, 0xA5B3, 0x30B3, + 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, 0xA5B7, 0x30B7, 0xA5B8, + 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, + 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, + 0x30C1, 0xA5C2, 0x30C2, 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, + 0xA5C6, 0x30C6, 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, + 0x30CA, 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, 0xA5D3, + 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, 0xA5D7, 0x30D7, + 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, 0xA5DB, 0x30DB, 0xA5DC, + 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, + 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, + 0x30E5, 0xA5E6, 0x30E6, 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, + 0xA5EA, 0x30EA, 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, + 0x30EE, 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, + 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, 0xA6A1, + 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, 0xA6A5, 0x0395, + 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, 0xA6A9, 0x0399, 0xA6AA, + 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, 0xA6AD, 0x039D, 0xA6AE, 0x039E, + 0xA6AF, 0x039F, 0xA6B0, 0x03A0, 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, + 0x03A4, 0xA6B4, 0x03A5, 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, + 0xA6B8, 0x03A9, 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, + 0x03B4, 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, 0xA6CD, + 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, 0xA6D1, 0x03C1, + 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, 0xA6D5, 0x03C6, 0xA6D6, + 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, + 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, + 0xFE3D, 0xA6E7, 0xFE3E, 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, + 0xA6EB, 0xFE44, 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, + 0xFE38, 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, + 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, 0xA7A6, + 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, 0xA7AA, 0x0418, + 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, 0xA7AE, 0x041C, 0xA7AF, + 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, 0xA7B2, 0x0420, 0xA7B3, 0x0421, + 0xA7B4, 0x0422, 0xA7B5, 0x0423, 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, + 0x0426, 0xA7B9, 0x0427, 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, + 0xA7BD, 0x042B, 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, + 0x042F, 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, 0xA7D9, + 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, 0xA7DD, 0x043B, + 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, 0xA7E1, 0x043F, 0xA7E2, + 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, 0xA7E5, 0x0443, 0xA7E6, 0x0444, + 0xA7E7, 0x0445, 0xA7E8, 0x0446, 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, + 0x0449, 0xA7EC, 0x044A, 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, + 0xA7F0, 0x044E, 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, + 0x02D9, 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, + 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, 0xA84B, + 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, 0xA84F, 0x2223, + 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, 0xA853, 0x22BF, 0xA854, + 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, 0xA857, 0x2553, 0xA858, 0x2554, + 0xA859, 0x2555, 0xA85A, 0x2556, 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, + 0x2559, 0xA85E, 0x255A, 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, + 0xA862, 0x255E, 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, + 0x2562, 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, 0xA86F, + 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, 0xA873, 0x256F, + 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, 0xA877, 0x2573, 0xA878, + 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, 0xA87B, 0x2584, 0xA87C, 0x2585, + 0xA87D, 0x2586, 0xA87E, 0x2587, 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, + 0x258A, 0xA883, 0x258B, 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, + 0xA887, 0x258F, 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, + 0x25BC, 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, + 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, 0xA894, + 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, 0xA8A3, 0x01CE, + 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, 0xA8A7, 0x011B, 0xA8A8, + 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, + 0xA8AD, 0x014D, 0xA8AE, 0x00F3, 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, + 0x016B, 0xA8B2, 0x00FA, 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, + 0xA8B6, 0x01D8, 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, + 0x00EA, 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, 0xA8C9, + 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, 0xA8CD, 0x310D, + 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, 0xA8D1, 0x3111, 0xA8D2, + 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, 0xA8D5, 0x3115, 0xA8D6, 0x3116, + 0xA8D7, 0x3117, 0xA8D8, 0x3118, 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, + 0x311B, 0xA8DC, 0x311C, 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, + 0xA8E0, 0x3120, 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, + 0x3124, 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, + 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, 0xA943, + 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, 0xA947, 0x3028, + 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, 0xA94B, 0x338F, 0xA94C, + 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, 0xA94F, 0x33A1, 0xA950, 0x33C4, + 0xA951, 0x33CE, 0xA952, 0x33D1, 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, + 0xFE30, 0xA956, 0xFFE2, 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, + 0xA95C, 0x2010, 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, + 0x30FD, 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, 0xA96C, + 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, 0xA970, 0xFE51, + 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, 0xA974, 0xFE56, 0xA975, + 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, 0xA978, 0xFE5B, 0xA979, 0xFE5C, + 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, + 0xFE61, 0xA980, 0xFE62, 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, + 0xA984, 0xFE66, 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, + 0xFE6B, 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, + 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, 0xA9AB, + 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, 0xA9AF, 0x250B, + 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, 0xA9B3, 0x250F, 0xA9B4, + 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, 0xA9B7, 0x2513, 0xA9B8, 0x2514, + 0xA9B9, 0x2515, 0xA9BA, 0x2516, 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, + 0x2519, 0xA9BE, 0x251A, 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, + 0xA9C2, 0x251E, 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, + 0x2522, 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, 0xA9CF, + 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, 0xA9D3, 0x252F, + 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, 0xA9D7, 0x2533, 0xA9D8, + 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, 0xA9DB, 0x2537, 0xA9DC, 0x2538, + 0xA9DD, 0x2539, 0xA9DE, 0x253A, 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, + 0x253D, 0xA9E2, 0x253E, 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, + 0xA9E6, 0x2542, 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, + 0x2546, 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, + 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, 0xAA43, + 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, 0xAA47, 0x72E6, + 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, 0xAA4B, 0x72F5, 0xAA4C, + 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, 0xAA4F, 0x72FE, 0xAA50, 0x72FF, + 0xAA51, 0x7300, 0xAA52, 0x7302, 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, + 0x7306, 0xAA56, 0x7307, 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, + 0xAA5A, 0x730C, 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, + 0x7311, 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, 0xAA67, + 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, 0xAA6B, 0x732D, + 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, 0xAA6F, 0x7333, 0xAA70, + 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, 0xAA73, 0x733B, 0xAA74, 0x733C, + 0xAA75, 0x733D, 0xAA76, 0x7340, 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, + 0x7343, 0xAA7A, 0x7344, 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, + 0xAA7E, 0x7348, 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, + 0x734C, 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, + 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, 0xAA8C, + 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, 0xAA90, 0x735D, + 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, 0xAA94, 0x7362, 0xAA95, + 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, 0xAA98, 0x7366, 0xAA99, 0x7367, + 0xAA9A, 0x7368, 0xAA9B, 0x7369, 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, + 0x736E, 0xAA9F, 0x7370, 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, + 0xAB42, 0x7374, 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, + 0x7378, 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, 0xAB4F, + 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, 0xAB53, 0x7388, + 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, 0xAB57, 0x738F, 0xAB58, + 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, 0xAB5B, 0x7394, 0xAB5C, 0x7395, + 0xAB5D, 0x7397, 0xAB5E, 0x7398, 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, + 0x739C, 0xAB62, 0x739D, 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, + 0xAB66, 0x73A3, 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, + 0x73A7, 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, + 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, 0xAB73, + 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, 0xAB77, 0x73BE, + 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, 0xAB7B, 0x73C4, 0xAB7C, + 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, 0xAB80, 0x73CB, 0xAB81, 0x73CC, + 0xAB82, 0x73CE, 0xAB83, 0x73D2, 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, + 0x73D5, 0xAB87, 0x73D6, 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, + 0xAB8B, 0x73DB, 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, + 0x73E1, 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, 0xAB98, + 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, 0xAB9C, 0x73F3, + 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, 0xABA0, 0x73F7, 0xAC40, + 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, 0xAC43, 0x73FB, 0xAC44, 0x73FC, + 0xAC45, 0x73FD, 0xAC46, 0x73FE, 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, + 0x7401, 0xAC4A, 0x7402, 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, + 0xAC4E, 0x740B, 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, + 0x7411, 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, + 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, 0xAC5B, + 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, 0xAC5F, 0x7420, + 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, 0xAC63, 0x7427, 0xAC64, + 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, 0xAC67, 0x742F, 0xAC68, 0x7431, + 0xAC69, 0x7432, 0xAC6A, 0x7437, 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, + 0x743A, 0xAC6E, 0x743B, 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, + 0xAC72, 0x7440, 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, + 0x7445, 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, 0xAC80, + 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, 0xAC84, 0x7452, + 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, 0xAC88, 0x7458, 0xAC89, + 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, 0xAC8C, 0x7462, 0xAC8D, 0x7463, + 0xAC8E, 0x7464, 0xAC8F, 0x7465, 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, + 0x7468, 0xAC93, 0x7469, 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, + 0xAC97, 0x746E, 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, + 0x7473, 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, + 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, 0xAD43, + 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, 0xAD47, 0x7486, + 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, 0xAD4B, 0x748C, 0xAD4C, + 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, 0xAD4F, 0x7492, 0xAD50, 0x7493, + 0xAD51, 0x7494, 0xAD52, 0x7495, 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, + 0x7498, 0xAD56, 0x7499, 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, + 0xAD5A, 0x749F, 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, + 0x74A3, 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, 0xAD67, + 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, 0xAD6B, 0x74B3, + 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, 0xAD6F, 0x74B7, 0xAD70, + 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, 0xAD73, 0x74BC, 0xAD74, 0x74BD, + 0xAD75, 0x74BE, 0xAD76, 0x74BF, 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, + 0x74C2, 0xAD7A, 0x74C3, 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, + 0xAD7E, 0x74C7, 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, + 0x74CB, 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, + 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, 0xAD8C, + 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, 0xAD90, 0x74D9, + 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, 0xAD94, 0x74DF, 0xAD95, + 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, 0xAD98, 0x74E8, 0xAD99, 0x74E9, + 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, + 0x74F0, 0xAD9F, 0x74F1, 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, + 0xAE42, 0x74F8, 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, + 0x74FC, 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, 0xAE4F, + 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, 0xAE53, 0x750B, + 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, 0xAE57, 0x7512, 0xAE58, + 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, 0xAE5B, 0x7517, 0xAE5C, 0x751B, + 0xAE5D, 0x751D, 0xAE5E, 0x751E, 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, + 0x7522, 0xAE62, 0x7523, 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, + 0xAE66, 0x752A, 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, + 0x7539, 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, + 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, 0xAE73, + 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, 0xAE77, 0x7550, + 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, 0xAE7B, 0x7555, 0xAE7C, + 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, 0xAE80, 0x755D, 0xAE81, 0x755E, + 0xAE82, 0x755F, 0xAE83, 0x7560, 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, + 0x7563, 0xAE87, 0x7564, 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, + 0xAE8B, 0x756B, 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, + 0x756F, 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, 0xAE98, + 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, 0xAE9C, 0x7581, + 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, 0xAEA0, 0x7587, 0xAF40, + 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, 0xAF43, 0x758C, 0xAF44, 0x758D, + 0xAF45, 0x758E, 0xAF46, 0x7590, 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, + 0x7598, 0xAF4A, 0x759B, 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, + 0xAF4E, 0x75A6, 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, + 0x75AA, 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, + 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, 0xAF5B, + 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, 0xAF5F, 0x75CF, + 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, 0xAF63, 0x75D7, 0xAF64, + 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, 0xAF67, 0x75DD, 0xAF68, 0x75DF, + 0xAF69, 0x75E0, 0xAF6A, 0x75E1, 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, + 0x75EC, 0xAF6E, 0x75ED, 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, + 0xAF72, 0x75F3, 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, + 0x75F8, 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, 0xAF80, + 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, 0xAF84, 0x760E, + 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, 0xAF88, 0x7613, 0xAF89, + 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, 0xAF8C, 0x761C, 0xAF8D, 0x761D, + 0xAF8E, 0x761E, 0xAF8F, 0x7621, 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, + 0x7628, 0xAF93, 0x762C, 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, + 0xAF97, 0x7632, 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, + 0x763A, 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, + 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, 0xB043, + 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, 0xB047, 0x764E, + 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, 0xB04B, 0x7652, 0xB04C, + 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, 0xB04F, 0x7658, 0xB050, 0x7659, + 0xB051, 0x765A, 0xB052, 0x765B, 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, + 0x7660, 0xB056, 0x7661, 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, + 0xB05A, 0x7666, 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, + 0x766A, 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, 0xB067, + 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, 0xB06B, 0x767A, + 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, 0xB06F, 0x7681, 0xB070, + 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, 0xB073, 0x768A, 0xB074, 0x768C, + 0xB075, 0x768D, 0xB076, 0x768F, 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, + 0x7694, 0xB07A, 0x7695, 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, + 0xB07E, 0x769B, 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, + 0x769F, 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, + 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, 0xB08C, + 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, 0xB090, 0x76AD, + 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, 0xB094, 0x76B5, 0xB095, + 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, 0xB098, 0x76B9, 0xB099, 0x76BA, + 0xB09A, 0x76BB, 0xB09B, 0x76BC, 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, + 0x76C0, 0xB09F, 0x76C1, 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, + 0xB0A3, 0x57C3, 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, + 0x54C0, 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, 0xB0B0, + 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, 0xB0B4, 0x6309, + 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, 0xB0B8, 0x6848, 0xB0B9, + 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, 0xB0BC, 0x51F9, 0xB0BD, 0x6556, + 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, + 0x5965, 0xB0C3, 0x61CA, 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, + 0xB0C7, 0x6252, 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, + 0x516B, 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, + 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, 0xB0D4, + 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, 0xB0D8, 0x67CF, + 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, 0xB0DC, 0x8D25, 0xB0DD, + 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, 0xB0E0, 0x73ED, 0xB0E1, 0x642C, + 0xB0E2, 0x6273, 0xB0E3, 0x822C, 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, + 0x7248, 0xB0E7, 0x626E, 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, + 0xB0EB, 0x534A, 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, + 0x5E2E, 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, 0xB0F8, + 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, 0xB0FC, 0x5305, + 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, 0xB141, 0x76C7, 0xB142, + 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, 0xB145, 0x76D3, 0xB146, 0x76D5, + 0xB147, 0x76D9, 0xB148, 0x76DA, 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, + 0x76DE, 0xB14C, 0x76E0, 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, + 0xB150, 0x76E4, 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, + 0x76E9, 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, + 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, 0xB15D, + 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, 0xB161, 0x76FF, + 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, 0xB165, 0x7705, 0xB166, + 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, 0xB169, 0x770E, 0xB16A, 0x770F, + 0xB16B, 0x7710, 0xB16C, 0x7711, 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, + 0x7714, 0xB170, 0x7715, 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, + 0xB174, 0x771B, 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, + 0x7721, 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, 0xB182, + 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, 0xB186, 0x7734, + 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, 0xB18A, 0x773E, 0xB18B, + 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, 0xB18E, 0x7745, 0xB18F, 0x7746, + 0xB190, 0x7748, 0xB191, 0x7749, 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, + 0x774C, 0xB195, 0x774D, 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, + 0xB199, 0x7753, 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, + 0x7757, 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, + 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, 0xB1A6, + 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, 0xB1AA, 0x8C79, + 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, 0xB1AE, 0x7891, 0xB1AF, + 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, + 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, + 0x5907, 0xB1B9, 0x60EB, 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, + 0xB1BD, 0x82EF, 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, + 0x7EF7, 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, 0xB1CA, + 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, 0xB1CE, 0x853D, + 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, 0xB1D2, 0x5E01, 0xB1D3, + 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, + 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, + 0x907F, 0xB1DD, 0x965B, 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, + 0xB1E1, 0x8D2C, 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, + 0x535E, 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, + 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, 0xB1EE, + 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, 0xB1F2, 0x5F6C, + 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, 0xB1F6, 0x5BBE, 0xB1F7, + 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, + 0xB1FC, 0x79C9, 0xB1FD, 0x997C, 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, + 0x775E, 0xB242, 0x775F, 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, + 0xB246, 0x7769, 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, + 0x776F, 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, 0xB253, + 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, 0xB257, 0x7781, + 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, 0xB25B, 0x7787, 0xB25C, + 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, 0xB25F, 0x778B, 0xB260, 0x778F, + 0xB261, 0x7790, 0xB262, 0x7793, 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, + 0x7796, 0xB266, 0x7797, 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, + 0xB26A, 0x779B, 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, + 0x77A1, 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, + 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, 0xB277, + 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, 0xB27B, 0x77B7, + 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, 0xB280, 0x77BC, 0xB281, + 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, 0xB284, 0x77C2, 0xB285, 0x77C3, + 0xB286, 0x77C4, 0xB287, 0x77C5, 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, + 0x77C8, 0xB28B, 0x77C9, 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, + 0xB28F, 0x77CE, 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, + 0x77D2, 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, 0xB29C, + 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, 0xB2A0, 0x77E4, + 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, 0xB2A4, 0x83E0, 0xB2A5, + 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, + 0xB2AA, 0x52C3, 0xB2AB, 0x640F, 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, + 0x4F2F, 0xB2AF, 0x5E1B, 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, + 0xB2B3, 0x6E24, 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, + 0x535C, 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, + 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, 0xB2C0, + 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, 0xB2C4, 0x6750, + 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, 0xB2C8, 0x8E29, 0xB2C9, + 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, 0xB2CC, 0x8521, 0xB2CD, 0x9910, + 0xB2CE, 0x53C2, 0xB2CF, 0x8695, 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, + 0x60E8, 0xB2D3, 0x707F, 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, + 0xB2D7, 0x6CA7, 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, + 0x69FD, 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, 0xB2E4, + 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, 0xB2E8, 0x8336, + 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, 0xB2EC, 0x5BDF, 0xB2ED, + 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, + 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, + 0x998B, 0xB2F7, 0x8C17, 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, + 0xB2FB, 0x9610, 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, + 0x77E6, 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, + 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, 0xB349, + 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, 0xB34D, 0x77FC, + 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, 0xB351, 0x7806, 0xB352, + 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, 0xB355, 0x780B, 0xB356, 0x780E, + 0xB357, 0x780F, 0xB358, 0x7810, 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, + 0x7819, 0xB35C, 0x781B, 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, + 0xB360, 0x7822, 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, + 0x782B, 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, 0xB36D, + 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, 0xB371, 0x7844, + 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, 0xB375, 0x784A, 0xB376, + 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, 0xB379, 0x7851, 0xB37A, 0x7853, + 0xB37B, 0x7854, 0xB37C, 0x7858, 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, + 0x785B, 0xB381, 0x785C, 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, + 0xB385, 0x7861, 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, + 0x7865, 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, + 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, 0xB392, + 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, 0xB396, 0x7878, + 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, 0xB39A, 0x787D, 0xB39B, + 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, 0xB39E, 0x7881, 0xB39F, 0x7882, + 0xB3A0, 0x7883, 0xB3A1, 0x573A, 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, + 0x957F, 0xB3A5, 0x507F, 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, + 0xB3A9, 0x7545, 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, + 0x6284, 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, 0xB3B6, + 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, 0xB3BA, 0x6F88, + 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, 0xB3BE, 0x5C18, 0xB3BF, + 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, 0xB3C2, 0x9648, 0xB3C3, 0x8D81, + 0xB3C4, 0x886C, 0xB3C5, 0x6491, 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, + 0x6A59, 0xB3C9, 0x6210, 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, + 0xB3CD, 0x60E9, 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, + 0x901E, 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, + 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, 0xB3DA, + 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, 0xB3DE, 0x4F88, + 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, 0xB3E2, 0x65A5, 0xB3E3, + 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, 0xB3E6, 0x866B, 0xB3E7, 0x5D07, + 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, + 0x8E0C, 0xB3ED, 0x7A20, 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, + 0xB3F1, 0x7EF8, 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, + 0x521D, 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, 0xB3FE, + 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, 0xB443, 0x7888, + 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, 0xB447, 0x7890, 0xB448, + 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, 0xB44B, 0x7896, 0xB44C, 0x7899, + 0xB44D, 0x789D, 0xB44E, 0x789E, 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, + 0x78A4, 0xB452, 0x78A6, 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, + 0xB456, 0x78AB, 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, + 0x78AF, 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, + 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, 0xB463, + 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, 0xB467, 0x78C4, + 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, 0xB46B, 0x78CC, 0xB46C, + 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, 0xB46F, 0x78D1, 0xB470, 0x78D2, + 0xB471, 0x78D3, 0xB472, 0x78D6, 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, + 0x78DA, 0xB476, 0x78DB, 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, + 0xB47A, 0x78DF, 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, + 0x78E3, 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, 0xB488, + 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, 0xB48C, 0x78F3, + 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, 0xB490, 0x78F9, 0xB491, + 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, 0xB494, 0x78FE, 0xB495, 0x78FF, + 0xB496, 0x7900, 0xB497, 0x7902, 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, + 0x7906, 0xB49B, 0x7907, 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, + 0xB49F, 0x790B, 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, + 0x77D7, 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, + 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, 0xB4AC, + 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, 0xB4B0, 0x7A97, + 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, 0xB4B4, 0x521B, 0xB4B5, + 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, 0xB4B8, 0x9524, 0xB4B9, 0x5782, + 0xB4BA, 0x6625, 0xB4BB, 0x693F, 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, + 0x6DF3, 0xB4BF, 0x7EAF, 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, + 0xB4C3, 0x75B5, 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, + 0x8F9E, 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, 0xB4D0, + 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, 0xB4D4, 0x4E1B, + 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, 0xB4D8, 0x7C07, 0xB4D9, + 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, + 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, + 0x7CB9, 0xB4E3, 0x6DEC, 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, + 0xB4E7, 0x5BF8, 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, + 0x63AA, 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, + 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, 0xB4F4, + 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, 0xB4F8, 0x5E26, + 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, 0xB4FC, 0x888B, 0xB4FD, + 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, 0xB541, 0x790E, 0xB542, 0x790F, + 0xB543, 0x7910, 0xB544, 0x7911, 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, + 0x7915, 0xB548, 0x7916, 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, + 0xB54C, 0x791A, 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, + 0x791F, 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, 0xB559, + 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, 0xB55D, 0x792D, + 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, 0xB561, 0x7931, 0xB562, + 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, 0xB565, 0x7936, 0xB566, 0x7937, + 0xB567, 0x7938, 0xB568, 0x7939, 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, + 0x7942, 0xB56C, 0x7943, 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, + 0xB570, 0x794A, 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, + 0x794E, 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, + 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, 0xB57D, + 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, 0xB582, 0x7969, + 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, 0xB586, 0x796E, 0xB587, + 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, 0xB58A, 0x7973, 0xB58B, 0x7974, + 0xB58C, 0x7975, 0xB58D, 0x7976, 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, + 0x797C, 0xB591, 0x797D, 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, + 0xB595, 0x7983, 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, + 0x7989, 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, 0xB5A2, + 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, 0xB5A6, 0x90F8, + 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, 0xB5AA, 0x6C2E, 0xB5AB, + 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, + 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, + 0x8361, 0xB5B5, 0x6863, 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, + 0xB5B9, 0x5012, 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, + 0x5230, 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, + 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, 0xB5C6, + 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, 0xB5CA, 0x51F3, + 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, 0xB5CE, 0x6EF4, 0xB5CF, + 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, + 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, + 0x5730, 0xB5D9, 0x8482, 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, + 0xB5DD, 0x9012, 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, + 0x6EC7, 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, 0xB5EA, + 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, 0xB5EE, 0x6BBF, + 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, 0xB5F2, 0x51CB, 0xB5F3, + 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, 0xB5F6, 0x9493, 0xB5F7, 0x8C03, + 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, + 0x8FED, 0xB5FD, 0x8C0D, 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, + 0xB642, 0x7995, 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, + 0x7999, 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, + 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, 0xB64F, + 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, 0xB653, 0x79A8, + 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, 0xB657, 0x79AC, 0xB658, + 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, 0xB65B, 0x79B0, 0xB65C, 0x79B1, + 0xB65D, 0x79B2, 0xB65E, 0x79B4, 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, + 0x79B7, 0xB662, 0x79B8, 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, + 0xB666, 0x79C4, 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, + 0x79CA, 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, 0xB673, + 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, 0xB677, 0x79DD, + 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, 0xB67B, 0x79E2, 0xB67C, + 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, 0xB680, 0x79EC, 0xB681, 0x79EE, + 0xB682, 0x79F1, 0xB683, 0x79F2, 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, + 0x79F5, 0xB687, 0x79F6, 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, + 0xB68B, 0x79FC, 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, + 0x7A04, 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, + 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, 0xB698, + 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, 0xB69C, 0x7A16, + 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, 0xB6A0, 0x7A1C, 0xB6A1, + 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, 0xB6A4, 0x9489, 0xB6A5, 0x9876, + 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, + 0x4E22, 0xB6AB, 0x4E1C, 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, + 0xB6AF, 0x52A8, 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, + 0x51BB, 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, 0xB6BC, + 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, 0xB6C0, 0x72EC, + 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, 0xB6C4, 0x8D4C, 0xB6C5, + 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, + 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, + 0x6BB5, 0xB6CF, 0x65AD, 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, + 0xB6D3, 0x961F, 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, + 0x8E72, 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, + 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, 0xB6E0, + 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, 0xB6E4, 0x6735, + 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, 0xB6E8, 0x60F0, 0xB6E9, + 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, + 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, + 0x5384, 0xB6F3, 0x627C, 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, + 0xB6F7, 0x6069, 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, + 0x5C14, 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, 0xB745, + 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, 0xB749, 0x7A29, + 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, 0xB74D, 0x7A2D, 0xB74E, + 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, 0xB751, 0x7A31, 0xB752, 0x7A32, + 0xB753, 0x7A34, 0xB754, 0x7A35, 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, + 0x7A3A, 0xB758, 0x7A3E, 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, + 0xB75C, 0x7A43, 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, + 0x7A48, 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, + 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, 0xB769, + 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, 0xB76D, 0x7A56, + 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, 0xB771, 0x7A5B, 0xB772, + 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, 0xB775, 0x7A5F, 0xB776, 0x7A60, + 0xB777, 0x7A61, 0xB778, 0x7A62, 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, + 0x7A65, 0xB77C, 0x7A66, 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, + 0xB781, 0x7A6A, 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, + 0x7A6E, 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, 0xB78E, + 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, 0xB792, 0x7A89, + 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, 0xB796, 0x7A8E, 0xB797, + 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, 0xB79A, 0x7A94, 0xB79B, 0x7A99, + 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, + 0x7AA2, 0xB7A1, 0x8D30, 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, + 0xB7A5, 0x4F10, 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, + 0x73D0, 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, + 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, 0xB7B2, + 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, 0xB7B6, 0x8303, + 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, 0xB7BA, 0x6CDB, 0xB7BB, + 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, 0xB7BE, 0x80AA, 0xB7BF, 0x623F, + 0xB7C0, 0x9632, 0xB7C1, 0x59A8, 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, + 0x7EBA, 0xB7C5, 0x653E, 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, + 0xB7C9, 0x98DE, 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, + 0x5420, 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, 0xB7D6, + 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, 0xB7DA, 0x6C7E, + 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, 0xB7DE, 0x5FFF, 0xB7DF, + 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, + 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, + 0x75AF, 0xB7E9, 0x70FD, 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, + 0xB7ED, 0x8BBD, 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, + 0x5426, 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, + 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, 0xB7FA, + 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, 0xB7FE, 0x670D, + 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, 0xB843, 0x7AA9, 0xB844, + 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, 0xB847, 0x7AAF, 0xB848, 0x7AB0, + 0xB849, 0x7AB1, 0xB84A, 0x7AB2, 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, + 0x7AB6, 0xB84E, 0x7AB7, 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, + 0xB852, 0x7ABB, 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, + 0x7AC0, 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, 0xB85F, + 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, 0xB863, 0x7ACE, + 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, 0xB867, 0x7AD2, 0xB868, + 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, + 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, + 0x7AE1, 0xB872, 0x7AE2, 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, + 0xB876, 0x7AE9, 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, + 0x7AEE, 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, + 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, 0xB884, + 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, 0xB888, 0x7B00, + 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, 0xB88C, 0x7B07, 0xB88D, + 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, 0xB890, 0x7B0E, 0xB891, 0x7B10, + 0xB892, 0x7B12, 0xB893, 0x7B13, 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, + 0x7B18, 0xB897, 0x7B1A, 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, + 0xB89B, 0x7B21, 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, + 0x7B29, 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, 0xB8A8, + 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, 0xB8AC, 0x812F, + 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, 0xB8B0, 0x8D74, 0xB8B1, + 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, 0xB8B4, 0x590D, 0xB8B5, 0x5085, + 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, + 0x8D1F, 0xB8BB, 0x5BCC, 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, + 0xB8BF, 0x7F1A, 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, + 0x8BE5, 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, + 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, 0xB8CC, + 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, 0xB8D0, 0x611F, + 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, 0xB8D4, 0x5188, 0xB8D5, + 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, + 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, + 0x768B, 0xB8DF, 0x9AD8, 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, + 0xB8E3, 0x641E, 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, + 0x54E5, 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, 0xB8F0, + 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, 0xB8F4, 0x9694, + 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, 0xB8F8, 0x7ED9, 0xB8F9, + 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, + 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, + 0x7B34, 0xB944, 0x7B35, 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, + 0xB948, 0x7B3B, 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, + 0x7B41, 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, + 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, 0xB955, + 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, 0xB959, 0x7B5C, + 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, 0xB95D, 0x7B63, 0xB95E, + 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, 0xB961, 0x7B67, 0xB962, 0x7B68, + 0xB963, 0x7B69, 0xB964, 0x7B6A, 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, + 0x7B6D, 0xB968, 0x7B6F, 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, + 0xB96C, 0x7B76, 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, + 0x7B7D, 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, 0xB979, + 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, 0xB97D, 0x7B8E, + 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, 0xB982, 0x7B93, 0xB983, + 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, 0xB986, 0x7B9A, 0xB987, 0x7B9B, + 0xB988, 0x7B9E, 0xB989, 0x7B9F, 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, + 0x7BA4, 0xB98D, 0x7BA5, 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, + 0xB991, 0x7BB2, 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, + 0x7BB7, 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, + 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, 0xB99E, + 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, 0xB9A2, 0x803F, + 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, 0xB9A6, 0x529F, 0xB9A7, + 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, + 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, + 0x62F1, 0xB9B1, 0x8D21, 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, + 0xB9B5, 0x6C9F, 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, + 0x6784, 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, 0xB9C2, + 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, 0xB9C6, 0x86CA, + 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, 0xB9CA, 0x6545, 0xB9CB, + 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, 0xB9CE, 0x522E, 0xB9CF, 0x74DC, + 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, + 0x4E56, 0xB9D5, 0x62D0, 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, + 0xB9D9, 0x5B98, 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, + 0x9986, 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, + 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, 0xB9E6, + 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, 0xB9EA, 0x9F9F, + 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, 0xB9EE, 0x8BE1, 0xB9EF, + 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, + 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, + 0x9505, 0xB9F9, 0x90ED, 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, + 0xB9FD, 0x8FC7, 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, + 0x7BC9, 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, 0xBA4B, + 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, 0xBA4F, 0x7BDB, + 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, 0xBA53, 0x7BE0, 0xBA54, + 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, + 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, + 0x7BEF, 0xBA5E, 0x7BF0, 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, + 0xBA62, 0x7BF5, 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, + 0x7BFA, 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, + 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, 0xBA6F, + 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, 0xBA73, 0x7C0A, + 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, 0xBA77, 0x7C11, 0xBA78, + 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, + 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, + 0x7C1C, 0xBA83, 0x7C1D, 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, + 0xBA87, 0x7C22, 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, + 0x7C28, 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, 0xBA94, + 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, 0xBA98, 0x7C36, + 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, 0xBA9C, 0x7C3B, 0xBA9D, + 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, + 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, + 0x5BB3, 0xBAA7, 0x9A87, 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, + 0xBAAB, 0x97E9, 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, + 0x51FD, 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, + 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, 0xBAB8, + 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, 0xBABC, 0x676D, + 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, 0xBAC0, 0x8C6A, 0xBAC1, + 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, 0xBAC4, 0x8017, 0xBAC5, 0x53F7, + 0xBAC6, 0x6D69, 0xBAC7, 0x5475, 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, + 0x83CF, 0xBACB, 0x6838, 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, + 0xBACF, 0x5408, 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, + 0x6CB3, 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, 0xBADC, + 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, 0xBAE0, 0x4EA8, + 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, 0xBAE4, 0x8F70, 0xBAE5, + 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, + 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, + 0x4FAF, 0xBAEF, 0x7334, 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, + 0xBAF3, 0x540E, 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, + 0x745A, 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, + 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, 0xBB41, + 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, 0xBB45, 0x7C48, + 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, 0xBB49, 0x7C4C, 0xBB4A, + 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, + 0xBB4F, 0x7C53, 0xBB50, 0x7C54, 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, + 0x7C57, 0xBB54, 0x7C58, 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, + 0xBB58, 0x7C5C, 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, + 0x7C60, 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, 0xBB65, + 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, 0xBB69, 0x7C6D, + 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, 0xBB6D, 0x7C71, 0xBB6E, + 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, 0xBB71, 0x7C77, 0xBB72, 0x7C78, + 0xBB73, 0x7C79, 0xBB74, 0x7C7A, 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, + 0x7C80, 0xBB78, 0x7C81, 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, + 0xBB7C, 0x7C85, 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, + 0x7C8A, 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, + 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, 0xBB8A, + 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, 0xBB8E, 0x7CA0, + 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, 0xBB92, 0x7CA7, 0xBB93, + 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, + 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, + 0x7CB6, 0xBB9D, 0x7CB7, 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, + 0xBBA1, 0x5F27, 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, + 0x4E92, 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, 0xBBAE, + 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, 0xBBB2, 0x5F8A, + 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, 0xBBB6, 0x6B22, 0xBBB7, + 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, 0xBBBA, 0x7F13, 0xBBBB, 0x6362, + 0xBBBC, 0x60A3, 0xBBBD, 0x5524, 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, + 0x7115, 0xBBC1, 0x6DA3, 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, + 0xBBC5, 0x614C, 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, + 0x7C27, 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, + 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, 0xBBD2, + 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, 0xBBD6, 0x6062, + 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, 0xBBDA, 0x6094, 0xBBDB, + 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, + 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, + 0x8BB3, 0xBBE5, 0x8BF2, 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, + 0xBBE9, 0x5A5A, 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, + 0x8C41, 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, 0xBBF6, + 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, 0xBBFA, 0x673A, + 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, 0xBBFE, 0x7B95, 0xBC40, + 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, + 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, + 0x7CCF, 0xBC4A, 0x7CD0, 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, + 0xBC4E, 0x7CD4, 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, + 0x7CDD, 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, + 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, 0xBC5B, + 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, 0xBC5F, 0x7CED, + 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, 0xBC63, 0x7CF2, 0xBC64, + 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, + 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, + 0x7CFE, 0xBC6E, 0x7CFF, 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, + 0xBC72, 0x7D03, 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, + 0x7D07, 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, 0xBC80, + 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, 0xBC84, 0x7D15, + 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, 0xBC88, 0x7D19, 0xBC89, + 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, + 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, + 0x7D25, 0xBC93, 0x7D26, 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, + 0xBC97, 0x7D2C, 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, + 0x7D31, 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, + 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, 0xBCA4, + 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, 0xBCA8, 0x7EE9, + 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, 0xBCAC, 0x68D8, 0xBCAD, + 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, 0xBCB0, 0x53CA, 0xBCB1, 0x6025, + 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, + 0x7EA7, 0xBCB7, 0x6324, 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, + 0xBCBB, 0x84DF, 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, + 0x4F0E, 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, 0xBCC8, + 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, 0xBCCC, 0x7EE7, + 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, 0xBCD0, 0x5939, 0xBCD1, + 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, 0xBCD4, 0x835A, 0xBCD5, 0x988A, + 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, + 0x7A3C, 0xBCDB, 0x4EF7, 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, + 0xBCDF, 0x6B7C, 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, + 0x7B3A, 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, + 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, 0xBCEC, + 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, 0xBCF0, 0x62E3, + 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, 0xBCF4, 0x526A, 0xBCF5, + 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, + 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, + 0x4EF6, 0xBD40, 0x7D37, 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, + 0xBD44, 0x7D3B, 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, + 0x7D3F, 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, 0xBD51, + 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, 0xBD55, 0x7D4C, + 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, 0xBD59, 0x7D50, 0xBD5A, + 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, + 0xBD5F, 0x7D56, 0xBD60, 0x7D57, 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, + 0x7D5A, 0xBD64, 0x7D5B, 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, + 0xBD68, 0x7D5F, 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, + 0x7D63, 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, + 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, 0xBD75, + 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, 0xBD79, 0x7D71, + 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, 0xBD7D, 0x7D75, 0xBD7E, + 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, + 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, + 0x7D80, 0xBD89, 0x7D81, 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, + 0xBD8D, 0x7D85, 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, + 0x7D89, 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, 0xBD9A, + 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, 0xBD9E, 0x7D96, + 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, 0xBDA2, 0x8230, 0xBDA3, + 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, + 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, + 0x6D46, 0xBDAD, 0x6C5F, 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, + 0xBDB1, 0x5956, 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, + 0x964D, 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, + 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, 0xBDBE, + 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, 0xBDC2, 0x94F0, + 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, 0xBDC6, 0x72E1, 0xBDC7, + 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, + 0xBDCC, 0x6559, 0xBDCD, 0x9175, 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, + 0x53EB, 0xBDD1, 0x7A96, 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, + 0xBDD5, 0x79F8, 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, + 0x52AB, 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, 0xBDE2, + 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, 0xBDE6, 0x82A5, + 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, 0xBDEA, 0x75A5, 0xBDEB, + 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, + 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, + 0x7D27, 0xBDF5, 0x9526, 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, + 0xBDF9, 0x9773, 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, + 0x70EC, 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, + 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, 0xBE47, + 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, 0xBE4B, 0x7DA4, + 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, 0xBE4F, 0x7DA9, 0xBE50, + 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, + 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, + 0x7DB4, 0xBE5A, 0x7DB5, 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, + 0xBE5E, 0x7DB9, 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, + 0x7DBD, 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, 0xBE6B, + 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, 0xBE6F, 0x7DCA, + 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, 0xBE73, 0x7DCE, 0xBE74, + 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, + 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, + 0x7DD8, 0xBE7E, 0x7DD9, 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, + 0xBE83, 0x7DDD, 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, + 0x7DE1, 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, + 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, 0xBE90, + 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, 0xBE94, 0x7DEE, + 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, 0xBE98, 0x7DF2, 0xBE99, + 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, + 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, + 0x52B2, 0xBEA3, 0x8346, 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, + 0xBEA7, 0x6676, 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, + 0x7CBE, 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, 0xBEB4, + 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, 0xBEB8, 0x9756, + 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, 0xBEBC, 0x70AF, 0xBEBD, + 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, + 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, + 0x9152, 0xBEC7, 0x53A9, 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, + 0xBECB, 0x8205, 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, + 0x97A0, 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, + 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, 0xBED8, + 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, 0xBEDC, 0x62D2, + 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, 0xBEE0, 0x8DDD, 0xBEE1, + 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, + 0xBEE6, 0x70AC, 0xBEE7, 0x5267, 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, + 0x5A1F, 0xBEEB, 0x5026, 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, + 0xBEEF, 0x6485, 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, + 0x5014, 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, 0xBEFC, + 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, 0xBF41, 0x7DFC, + 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, 0xBF45, 0x7E00, 0xBF46, + 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, 0xBF49, 0x7E04, 0xBF4A, 0x7E05, + 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, + 0x7E0A, 0xBF50, 0x7E0B, 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, + 0xBF54, 0x7E0F, 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, + 0x7E13, 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, + 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, 0xBF61, + 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, 0xBF65, 0x7E20, + 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, 0xBF69, 0x7E24, 0xBF6A, + 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, + 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, + 0x7E2E, 0xBF74, 0x7E2F, 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, + 0xBF78, 0x7E33, 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, + 0x7E37, 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, 0xBF86, + 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, 0xBF8A, 0x7E46, + 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, 0xBF8E, 0x7E4B, 0xBF8F, + 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, 0xBF92, 0x7E4F, 0xBF93, 0x7E50, + 0xBF94, 0x7E51, 0xBF95, 0x7E52, 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, + 0x7E55, 0xBF99, 0x7E56, 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, + 0xBF9D, 0x7E5A, 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, + 0x4FCA, 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, + 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, 0xBFAA, + 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, 0xBFAE, 0x6168, + 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, 0xBFB2, 0x574E, 0xBFB3, + 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, + 0xBFB8, 0x625B, 0xBFB9, 0x6297, 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, + 0x8003, 0xBFBD, 0x62F7, 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, + 0xBFC1, 0x82DB, 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, + 0x9897, 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, 0xBFCE, + 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, 0xBFD2, 0x6073, + 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, 0xBFD6, 0x6050, 0xBFD7, + 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, 0xBFDA, 0x53E3, 0xBFDB, 0x6263, + 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, + 0x82E6, 0xBFE1, 0x9177, 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, + 0xBFE5, 0x57AE, 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, + 0x5757, 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, + 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, 0xBFF2, + 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, 0xBFF6, 0x51B5, + 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, 0xBFFA, 0x7AA5, 0xBFFB, + 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, 0xBFFE, 0x5080, 0xC040, 0x7E5E, + 0xC041, 0x7E5F, 0xC042, 0x7E60, 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, + 0x7E63, 0xC046, 0x7E64, 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, + 0xC04A, 0x7E68, 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, + 0x7E6C, 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, 0xC057, + 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, 0xC05B, 0x7E79, + 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, 0xC05F, 0x7E7D, 0xC060, + 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, 0xC063, 0x7E81, 0xC064, 0x7E83, + 0xC065, 0x7E84, 0xC066, 0x7E85, 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, + 0x7E88, 0xC06A, 0x7E89, 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, + 0xC06E, 0x7E8D, 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, + 0x7E91, 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, + 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, 0xC07B, + 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, 0xC080, 0x7EAE, + 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, 0xC084, 0x7ED6, 0xC085, + 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, 0xC088, 0x7F0A, 0xC089, 0x7F10, + 0xC08A, 0x7F1E, 0xC08B, 0x7F37, 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, + 0x7F3C, 0xC08F, 0x7F3D, 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, + 0xC093, 0x7F41, 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, + 0x7F48, 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, 0xC0A0, + 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, 0xC0A4, 0x5764, + 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, 0xC0A8, 0x62EC, 0xC0A9, + 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, 0xC0AC, 0x5783, 0xC0AD, 0x62C9, + 0xC0AE, 0x5587, 0xC0AF, 0x8721, 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, + 0x5566, 0xC0B3, 0x83B1, 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, + 0xC0B7, 0x5A6A, 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, + 0x9611, 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, + 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, 0xC0C4, + 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, 0xC0C8, 0x5ECA, + 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, 0xC0CC, 0x635E, 0xC0CD, + 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, + 0xC0D2, 0x916A, 0xC0D3, 0x70D9, 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, + 0x4E50, 0xC0D7, 0x96F7, 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, + 0xC0DB, 0x7D2F, 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, + 0x808B, 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, 0xC0E8, + 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, 0xC0EC, 0x6F13, + 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, 0xC0F0, 0x9CA4, 0xC0F1, + 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, 0xC0F4, 0x540F, 0xC0F5, 0x6817, + 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, + 0x5386, 0xC0FB, 0x5229, 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, + 0xC140, 0x7F56, 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, + 0x7F5D, 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, + 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, 0xC14D, + 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, 0xC151, 0x7F73, + 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, 0xC155, 0x7F78, 0xC156, + 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, 0xC159, 0x7F7D, 0xC15A, 0x7F7F, + 0xC15B, 0x7F80, 0xC15C, 0x7F82, 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, + 0x7F85, 0xC160, 0x7F86, 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, + 0xC164, 0x7F8B, 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, + 0x7F91, 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, 0xC171, + 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, 0xC175, 0x7FA5, + 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, 0xC179, 0x7FAA, 0xC17A, + 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, + 0xC180, 0x7FB3, 0xC181, 0x7FB4, 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, + 0x7FB7, 0xC185, 0x7FBA, 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, + 0xC189, 0x7FC2, 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, + 0x7FC7, 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, + 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, 0xC196, + 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, 0xC19A, 0x7FDA, + 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, 0xC19E, 0x7FDE, 0xC19F, + 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, + 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, + 0x54E9, 0xC1A9, 0x4FE9, 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, + 0xC1AD, 0x9570, 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, + 0x5E18, 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, 0xC1BA, + 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, 0xC1BE, 0x8F86, + 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, 0xC1C2, 0x8C05, 0xC1C3, + 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, 0xC1C6, 0x7597, 0xC1C7, 0x71CE, + 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, + 0x6482, 0xC1CD, 0x9563, 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, + 0xC1D1, 0x88C2, 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, + 0x7433, 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, + 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, 0xC1DE, + 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, 0xC1E2, 0x83F1, + 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, 0xC1E6, 0x4F36, 0xC1E7, + 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, + 0xC1EC, 0x9886, 0xC1ED, 0x53E6, 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, + 0x7409, 0xC1F1, 0x69B4, 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, + 0xC1F5, 0x5218, 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, + 0x516D, 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, 0xC243, + 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, 0xC247, 0x7FEF, + 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, 0xC24B, 0x7FF6, 0xC24C, + 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, 0xC24F, 0x7FFA, 0xC250, 0x7FFD, + 0xC251, 0x7FFE, 0xC252, 0x7FFF, 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, + 0x8008, 0xC256, 0x8009, 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, + 0xC25A, 0x8011, 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, + 0x801D, 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, + 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, 0xC267, + 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, 0xC26B, 0x8034, + 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, 0xC26F, 0x803E, 0xC270, + 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, 0xC273, 0x8045, 0xC274, 0x8047, + 0xC275, 0x8048, 0xC276, 0x8049, 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, + 0x8050, 0xC27A, 0x8051, 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, + 0xC27E, 0x8057, 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, + 0x805D, 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, 0xC28C, + 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, 0xC290, 0x806C, + 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, 0xC294, 0x8070, 0xC295, + 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, 0xC298, 0x8075, 0xC299, 0x8076, + 0xC29A, 0x8077, 0xC29B, 0x8078, 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, + 0x807B, 0xC29F, 0x807C, 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, + 0xC2A3, 0x62E2, 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, + 0x6402, 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, + 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, 0xC2B0, + 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, 0xC2B4, 0x9E93, + 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, 0xC2B8, 0x8D42, 0xC2B9, + 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, 0xC2BC, 0x5F55, 0xC2BD, 0x9646, + 0xC2BE, 0x622E, 0xC2BF, 0x9A74, 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, + 0x4FA3, 0xC2C3, 0x65C5, 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, + 0xC2C7, 0x8651, 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, + 0x6EE4, 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, 0xC2D4, + 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, 0xC2D8, 0x4ED1, + 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, 0xC2DC, 0x841D, 0xC2DD, + 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, + 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, + 0x9A86, 0xC2E7, 0x7EDC, 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, + 0xC2EB, 0x7801, 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, + 0x561B, 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, + 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, 0xC2F8, + 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, 0xC2FC, 0x66FC, + 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, 0xC341, 0x8081, 0xC342, + 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, 0xC345, 0x808A, 0xC346, 0x808D, + 0xC347, 0x808E, 0xC348, 0x808F, 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, + 0x8092, 0xC34C, 0x8094, 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, + 0xC350, 0x809E, 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, + 0x80A8, 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, 0xC35D, + 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, 0xC361, 0x80CA, + 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, 0xC365, 0x80D1, 0xC366, + 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, 0xC369, 0x80D5, 0xC36A, 0x80D8, + 0xC36B, 0x80DF, 0xC36C, 0x80E0, 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, + 0x80E6, 0xC370, 0x80EE, 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, + 0xC374, 0x80FB, 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, + 0x8101, 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, + 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, 0xC382, + 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, 0xC386, 0x811D, + 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, 0xC38A, 0x8122, 0xC38B, + 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, 0xC38E, 0x8126, 0xC38F, 0x8127, + 0xC390, 0x8128, 0xC391, 0x8129, 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, + 0x812D, 0xC395, 0x812E, 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, + 0xC399, 0x8135, 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, + 0x813B, 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, 0xC3A6, + 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, 0xC3AA, 0x951A, + 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, 0xC3AE, 0x536F, 0xC3AF, + 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, + 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, + 0x9176, 0xC3B9, 0x9709, 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, + 0xC3BD, 0x5A92, 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, + 0x6627, 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, + 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, 0xC3CA, + 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, 0xC3CE, 0x68A6, + 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, 0xC3D2, 0x9761, 0xC3D3, + 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, + 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, + 0x5BC6, 0xC3DD, 0x5E42, 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, + 0xC3E1, 0x5195, 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, + 0x7F05, 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, 0xC3EE, + 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, 0xC3F2, 0x62BF, + 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, 0xC3F6, 0x95FD, 0xC3F7, + 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, 0xC3FA, 0x94ED, 0xC3FB, 0x540D, + 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, + 0x8141, 0xC442, 0x8142, 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, + 0xC446, 0x8147, 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, + 0x814F, 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, + 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, 0xC453, + 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, 0xC457, 0x8164, + 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, 0xC45B, 0x816B, 0xC45C, + 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, 0xC45F, 0x8173, 0xC460, 0x8175, + 0xC461, 0x8176, 0xC462, 0x8177, 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, + 0x8183, 0xC466, 0x8184, 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, + 0xC46A, 0x8189, 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, + 0x818E, 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, 0xC477, + 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, 0xC47B, 0x81A1, + 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, 0xC480, 0x81A7, 0xC481, + 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, 0xC484, 0x81AD, 0xC485, 0x81AE, + 0xC486, 0x81AF, 0xC487, 0x81B0, 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, + 0x81B4, 0xC48B, 0x81B5, 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, + 0xC48F, 0x81B9, 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, + 0x81BF, 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, + 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, 0xC49C, + 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, 0xC4A0, 0x81D3, + 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, 0xC4A4, 0x819C, 0xC4A5, + 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, 0xC4A8, 0x62B9, 0xC4A9, 0x672B, + 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, + 0x6F20, 0xC4AF, 0x5BDE, 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, + 0xC4B3, 0x67D0, 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, + 0x59C6, 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, 0xC4C0, + 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, 0xC4C4, 0x54EA, + 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, 0xC4C8, 0x5A1C, 0xC4C9, + 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, 0xC4CC, 0x5976, 0xC4CD, 0x8010, + 0xC4CE, 0x5948, 0xC4CF, 0x5357, 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, + 0x56CA, 0xC4D3, 0x6320, 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, + 0xC4D7, 0x6DD6, 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, + 0x5AE9, 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, + 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, 0xC4E4, + 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, 0xC4E8, 0x852B, + 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, 0xC4EC, 0x64B5, 0xC4ED, + 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, + 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, + 0x556E, 0xC4F7, 0x954A, 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, + 0xC4FB, 0x67E0, 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, + 0x81D4, 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, 0xC549, + 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, 0xC54D, 0x81E1, + 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, 0xC551, 0x81E6, 0xC552, + 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, 0xC555, 0x81EE, 0xC556, 0x81EF, + 0xC557, 0x81F0, 0xC558, 0x81F1, 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, + 0x81F6, 0xC55C, 0x81F7, 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, + 0xC560, 0x81FD, 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, + 0x8208, 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, + 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, 0xC56D, + 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, 0xC571, 0x821A, + 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, 0xC575, 0x8225, 0xC576, + 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, 0xC579, 0x822E, 0xC57A, 0x8232, + 0xC57B, 0x823A, 0xC57C, 0x823C, 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, + 0x8240, 0xC581, 0x8241, 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, + 0xC585, 0x8246, 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, + 0x824D, 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, 0xC592, + 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, 0xC596, 0x825D, + 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, 0xC59A, 0x8262, 0xC59B, + 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, 0xC59E, 0x8266, 0xC59F, 0x8267, + 0xC5A0, 0x8269, 0xC5A1, 0x62E7, 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, + 0x626D, 0xC5A5, 0x94AE, 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, + 0xC5A9, 0x519C, 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, + 0x6012, 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, + 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, 0xC5B6, + 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, 0xC5BA, 0x85D5, + 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, 0xC5BE, 0x556A, 0xC5BF, + 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, 0xC5C2, 0x6015, 0xC5C3, 0x7436, + 0xC5C4, 0x62CD, 0xC5C5, 0x6392, 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, + 0x6E43, 0xC5C9, 0x6D3E, 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, + 0xC5CD, 0x78D0, 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, + 0x53DB, 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, 0xC5DA, + 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, 0xC5DE, 0x5478, + 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, 0xC5E2, 0x8D54, 0xC5E3, + 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, + 0xC5E8, 0x76C6, 0xC5E9, 0x7830, 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, + 0x6F8E, 0xC5ED, 0x5F6D, 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, + 0xC5F1, 0x7BF7, 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, + 0x6367, 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, + 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, 0xC5FE, + 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, 0xC643, 0x826D, + 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, 0xC647, 0x8277, 0xC648, + 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, 0xC64B, 0x8280, 0xC64C, 0x8281, + 0xC64D, 0x8283, 0xC64E, 0x8285, 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, + 0x8289, 0xC652, 0x828C, 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, + 0xC656, 0x8295, 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, + 0x829E, 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, 0xC663, + 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, 0xC667, 0x82C2, + 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, 0xC66B, 0x82C9, 0xC66C, + 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, 0xC66F, 0x82DA, 0xC670, 0x82DD, + 0xC671, 0x82E2, 0xC672, 0x82E7, 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, + 0x82EA, 0xC676, 0x82EC, 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, + 0xC67A, 0x82F2, 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, + 0x82F8, 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, + 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, 0xC688, + 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, 0xC68C, 0x8316, + 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, 0xC690, 0x831E, 0xC691, + 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, 0xC694, 0x8322, 0xC695, 0x8323, + 0xC696, 0x8324, 0xC697, 0x8325, 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, + 0x832A, 0xC69B, 0x832E, 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, + 0xC69F, 0x833B, 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, + 0x75B2, 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, 0xC6AC, + 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, 0xC6B0, 0x74E2, + 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, 0xC6B4, 0x62FC, 0xC6B5, + 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, 0xC6B8, 0x8058, 0xC6B9, 0x4E52, + 0xC6BA, 0x576A, 0xC6BB, 0x82F9, 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, + 0x51ED, 0xC6BF, 0x74F6, 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, + 0xC6C3, 0x6CFC, 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, + 0x9B44, 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, + 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, 0xC6D0, + 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, 0xC6D4, 0x5703, + 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, 0xC6D8, 0x66DD, 0xC6D9, + 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, 0xC6DC, 0x6816, 0xC6DD, 0x621A, + 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, + 0x67D2, 0xC6E3, 0x6C8F, 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, + 0xC6E7, 0x6B67, 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, + 0x9F50, 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, 0xC6F4, + 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, 0xC6F8, 0x6C14, + 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, 0xC6FC, 0x6CE3, 0xC6FD, + 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, 0xC741, 0x833F, 0xC742, 0x8341, + 0xC743, 0x8342, 0xC744, 0x8344, 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, + 0x834A, 0xC748, 0x834B, 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, + 0xC74C, 0x8353, 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, + 0x8358, 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, + 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, 0xC759, + 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, 0xC75D, 0x837E, + 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, 0xC761, 0x8382, 0xC762, + 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, 0xC765, 0x8388, 0xC766, 0x838A, + 0xC767, 0x838B, 0xC768, 0x838C, 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, + 0x8390, 0xC76C, 0x8391, 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, + 0xC770, 0x8397, 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, + 0x839F, 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, 0xC77D, + 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, 0xC782, 0x83BB, + 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, 0xC786, 0x83C3, 0xC787, + 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, 0xC78A, 0x83C9, 0xC78B, 0x83CB, + 0xC78C, 0x83CD, 0xC78D, 0x83CE, 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, + 0x83D2, 0xC791, 0x83D3, 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, + 0xC795, 0x83DA, 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, + 0x83E3, 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, + 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, 0xC7A2, + 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, 0xC7A6, 0x94C5, + 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, 0xC7AA, 0x4EDF, 0xC7AB, + 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, + 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, + 0x8C34, 0xC7B5, 0x5811, 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, + 0xC7B9, 0x67AA, 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, + 0x5899, 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, 0xC7C6, + 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, 0xC7CA, 0x9798, + 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, 0xC7CE, 0x4FCF, 0xC7CF, + 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, 0xC7D2, 0x4E14, 0xC7D3, 0x602F, + 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, + 0x79E6, 0xC7D9, 0x7434, 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, + 0xC7DD, 0x79BD, 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, + 0x8F7B, 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, + 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, 0xC7EA, + 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, 0xC7EE, 0x7A77, + 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, 0xC7F2, 0x7403, 0xC7F3, + 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, + 0xC7F8, 0x533A, 0xC7F9, 0x86C6, 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, + 0x5C48, 0xC7FD, 0x9A71, 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, + 0xC842, 0x83F3, 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, + 0x83F7, 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, 0xC84F, + 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, 0xC853, 0x8410, + 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, 0xC857, 0x8415, 0xC858, + 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, 0xC85B, 0x841A, 0xC85C, 0x841B, + 0xC85D, 0x841E, 0xC85E, 0x841F, 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, + 0x8422, 0xC862, 0x8423, 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, + 0xC866, 0x842C, 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, + 0x8430, 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, + 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, 0xC873, + 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, 0xC877, 0x8441, + 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, 0xC87B, 0x8445, 0xC87C, + 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, 0xC880, 0x844A, 0xC881, 0x844B, + 0xC882, 0x844C, 0xC883, 0x844D, 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, + 0x8450, 0xC887, 0x8452, 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, + 0xC88B, 0x8456, 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, + 0x845F, 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, 0xC898, + 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, 0xC89C, 0x8474, + 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, 0xC8A0, 0x847C, 0xC8A1, + 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, + 0xC8A6, 0x5708, 0xC8A7, 0x98A7, 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, + 0x6CC9, 0xC8AB, 0x5168, 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, + 0xC8AF, 0x5238, 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, + 0x7638, 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, + 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, 0xC8BC, + 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, 0xC8C0, 0x58E4, + 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, 0xC8C4, 0x9976, 0xC8C5, + 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, + 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, + 0x4EFB, 0xC8CF, 0x8BA4, 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, + 0xC8D3, 0x6254, 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, + 0x8338, 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, 0xC8E0, + 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, 0xC8E4, 0x8815, + 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, 0xC8E8, 0x8FB1, 0xC8E9, + 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, + 0xC8EE, 0x962E, 0xC8EF, 0x854A, 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, + 0x95F0, 0xC8F3, 0x6DA6, 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, + 0xC8F7, 0x6D12, 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, + 0x585E, 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, + 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, 0xC945, + 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, 0xC949, 0x848A, + 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, 0xC94D, 0x8491, 0xC94E, + 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, 0xC951, 0x8495, 0xC952, 0x8496, + 0xC953, 0x8498, 0xC954, 0x849A, 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, + 0x849E, 0xC958, 0x849F, 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, + 0xC95C, 0x84A4, 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, + 0x84A8, 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, 0xC969, + 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, 0xC96D, 0x84BB, + 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, 0xC971, 0x84C2, 0xC972, + 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, 0xC975, 0x84C7, 0xC976, 0x84C8, + 0xC977, 0x84CB, 0xC978, 0x84CC, 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, + 0x84D2, 0xC97C, 0x84D4, 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, + 0xC981, 0x84D9, 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, + 0x84DE, 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, + 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, 0xC98E, + 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, 0xC992, 0x84F2, + 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, 0xC996, 0x84F6, 0xC997, + 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, 0xC99A, 0x84FA, 0xC99B, 0x84FB, + 0xC99C, 0x84FD, 0xC99D, 0x84FE, 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, + 0x8502, 0xC9A1, 0x4F1E, 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, + 0xC9A5, 0x4E27, 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, + 0x5AC2, 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, 0xC9B2, + 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, 0xC9B6, 0x5565, + 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, 0xC9BA, 0x73CA, 0xC9BB, + 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, 0xC9BE, 0x5220, 0xC9BF, 0x717D, + 0xC9C0, 0x886B, 0xC9C1, 0x95EA, 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, + 0x8D61, 0xC9C5, 0x81B3, 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, + 0xC9C9, 0x7F2E, 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, + 0x8D4F, 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, + 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, 0xC9D6, + 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, 0xC9DA, 0x54E8, + 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, 0xC9DE, 0x8D4A, 0xC9DF, + 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, 0xC9E2, 0x8D66, 0xC9E3, 0x6444, + 0xC9E4, 0x5C04, 0xC9E5, 0x6151, 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, + 0x8BBE, 0xC9E9, 0x7837, 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, + 0xC9ED, 0x8EAB, 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, + 0x795E, 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, 0xC9FA, + 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, 0xC9FE, 0x7EF3, + 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, 0xCA43, 0x8506, 0xCA44, + 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, 0xCA47, 0x850A, 0xCA48, 0x850B, + 0xCA49, 0x850D, 0xCA4A, 0x850E, 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, + 0x8512, 0xCA4E, 0x8514, 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, + 0xCA52, 0x8519, 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, + 0x851E, 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, + 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, 0xCA5F, + 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, 0xCA63, 0x852F, + 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, 0xCA67, 0x8533, 0xCA68, + 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, 0xCA6B, 0x853E, 0xCA6C, 0x853F, + 0xCA6D, 0x8540, 0xCA6E, 0x8541, 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, + 0x8545, 0xCA72, 0x8546, 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, + 0xCA76, 0x854D, 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, + 0x8551, 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, 0xCA84, + 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, 0xCA88, 0x8561, + 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, 0xCA8C, 0x8566, 0xCA8D, + 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, 0xCA90, 0x856B, 0xCA91, 0x856C, + 0xCA92, 0x856D, 0xCA93, 0x856E, 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, + 0x8571, 0xCA97, 0x8573, 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, + 0xCA9B, 0x8578, 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, + 0x8580, 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, + 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, 0xCAA8, + 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, 0xCAAC, 0x5C38, + 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, 0xCAB0, 0x62FE, 0xCAB1, + 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, + 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, + 0x5C4E, 0xCABB, 0x9A76, 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, + 0xCABF, 0x58EB, 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, + 0x62ED, 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, 0xCACC, + 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, 0xCAD0, 0x5E02, + 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, 0xCAD4, 0x8BD5, 0xCAD5, + 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, + 0xCADA, 0x6388, 0xCADB, 0x552E, 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, + 0x517D, 0xCADF, 0x852C, 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, + 0xCAE3, 0x6292, 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, + 0x6DD1, 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, + 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, 0xCAF0, + 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, 0xCAF4, 0x5C5E, + 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, 0xCAF8, 0x675F, 0xCAF9, + 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, + 0xCAFE, 0x6F31, 0xCB40, 0x8582, 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, + 0x8588, 0xCB44, 0x8589, 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, + 0xCB48, 0x858D, 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, + 0x8592, 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, 0xCB55, + 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, 0xCB59, 0x85A1, + 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, 0xCB5D, 0x85A6, 0xCB5E, + 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, 0xCB61, 0x85AC, 0xCB62, 0x85AD, + 0xCB63, 0x85B1, 0xCB64, 0x85B2, 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, + 0x85B5, 0xCB68, 0x85B6, 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, + 0xCB6C, 0x85BC, 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, + 0x85C0, 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, + 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, 0xCB79, + 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, 0xCB7D, 0x85D1, + 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, 0xCB82, 0x85D7, 0xCB83, + 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, 0xCB86, 0x85DB, 0xCB87, 0x85DD, + 0xCB88, 0x85DE, 0xCB89, 0x85DF, 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, + 0x85E2, 0xCB8D, 0x85E3, 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, + 0xCB91, 0x85E8, 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, + 0x85ED, 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, 0xCB9E, + 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, 0xCBA2, 0x5237, + 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, 0xCBA6, 0x7529, 0xCBA7, + 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, 0xCBAA, 0x971C, 0xCBAB, 0x53CC, + 0xCBAC, 0x723D, 0xCBAD, 0x8C01, 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, + 0x7A0E, 0xCBB1, 0x542E, 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, + 0xCBB5, 0x8BF4, 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, + 0x65AF, 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, + 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, 0xCBC2, + 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, 0xCBC6, 0x4F3C, + 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, 0xCBCA, 0x8038, 0xCBCB, + 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, + 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, + 0x55FD, 0xCBD5, 0x82CF, 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, + 0xCBD9, 0x901F, 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, + 0x6EAF, 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, 0xCBE6, + 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, 0xCBEA, 0x5C81, + 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, 0xCBEE, 0x795F, 0xCBEF, + 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, + 0xCBF4, 0x5506, 0xCBF5, 0x7F29, 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, + 0x9501, 0xCBF9, 0x6240, 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, + 0xCBFD, 0x5979, 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, + 0x85FC, 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, + 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, 0xCC4B, + 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, 0xCC4F, 0x860B, + 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, 0xCC53, 0x860F, 0xCC54, + 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, 0xCC57, 0x8614, 0xCC58, 0x8615, + 0xCC59, 0x8617, 0xCC5A, 0x8618, 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, + 0x861B, 0xCC5E, 0x861C, 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, + 0xCC62, 0x8620, 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, + 0x8624, 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, 0xCC6F, + 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, 0xCC73, 0x8633, + 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, 0xCC77, 0x8637, 0xCC78, + 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, 0xCC7B, 0x863D, 0xCC7C, 0x863E, + 0xCC7D, 0x863F, 0xCC7E, 0x8640, 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, + 0x8643, 0xCC83, 0x8644, 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, + 0xCC87, 0x8648, 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, + 0x864C, 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, + 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, 0xCC94, + 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, 0xCC98, 0x8661, + 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, 0xCC9C, 0x8666, 0xCC9D, + 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, 0xCCA0, 0x866A, 0xCCA1, 0x736D, + 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, + 0x82D4, 0xCCA7, 0x62AC, 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, + 0xCCAB, 0x592A, 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, + 0x644A, 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, 0xCCB8, + 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, 0xCCBC, 0x78B3, + 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, 0xCCC0, 0x6C64, 0xCCC1, + 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, 0xCCC4, 0x68E0, 0xCCC5, 0x819B, + 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, + 0x6DCC, 0xCCCB, 0x8D9F, 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, + 0xCCCF, 0x6ED4, 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, + 0x9003, 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, + 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, 0xCCDC, + 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, 0xCCE0, 0x9511, + 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, 0xCCE4, 0x557C, 0xCCE5, + 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, + 0xCCEA, 0x5243, 0xCCEB, 0x5C49, 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, + 0x586B, 0xCCEF, 0x7530, 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, + 0xCCF3, 0x8146, 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, + 0x773A, 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, 0xCD41, + 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, 0xCD45, 0x8674, + 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, 0xCD49, 0x8678, 0xCD4A, + 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, 0xCD4D, 0x8686, 0xCD4E, 0x8687, + 0xCD4F, 0x8688, 0xCD50, 0x8689, 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, + 0x8690, 0xCD54, 0x8691, 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, + 0xCD58, 0x8697, 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, + 0x869B, 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, + 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, 0xCD65, + 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, 0xCD69, 0x86B7, + 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, 0xCD6D, 0x86BC, 0xCD6E, + 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, 0xCD71, 0x86C1, 0xCD72, 0x86C2, + 0xCD73, 0x86C3, 0xCD74, 0x86C5, 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, + 0x86CD, 0xCD78, 0x86D2, 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, + 0xCD7C, 0x86D7, 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, + 0x86E0, 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, 0xCD8A, + 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, 0xCD8E, 0x86F6, + 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, 0xCD92, 0x86FC, 0xCD93, + 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, 0xCD96, 0x8704, 0xCD97, 0x8705, + 0xCD98, 0x8706, 0xCD99, 0x870B, 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, + 0x870F, 0xCD9D, 0x8710, 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, + 0xCDA1, 0x6C40, 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, + 0x5EAD, 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, + 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, 0xCDAE, + 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, 0xCDB2, 0x7B52, + 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, 0xCDB6, 0x6295, 0xCDB7, + 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, + 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, + 0x5C60, 0xCDC1, 0x571F, 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, + 0xCDC5, 0x56E2, 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, + 0x8715, 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, 0xCDD2, + 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, 0xCDD6, 0x692D, + 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, 0xCDDA, 0x6316, 0xCDDB, + 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, + 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, + 0x5F2F, 0xCDE5, 0x6E7E, 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, + 0xCDE9, 0x70F7, 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, + 0x665A, 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, + 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, 0xCDF6, + 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, 0xCDFA, 0x65FA, + 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, 0xCDFE, 0x5A01, 0xCE40, + 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, 0xCE43, 0x871F, 0xCE44, 0x8720, + 0xCE45, 0x8724, 0xCE46, 0x8726, 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, + 0x872A, 0xCE4A, 0x872B, 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, + 0xCE4E, 0x8730, 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, + 0x8736, 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, 0xCE5B, + 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, 0xCE5F, 0x874A, + 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, 0xCE63, 0x8750, 0xCE64, + 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, 0xCE67, 0x8755, 0xCE68, 0x8756, + 0xCE69, 0x8758, 0xCE6A, 0x875A, 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, + 0x875D, 0xCE6E, 0x875E, 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, + 0xCE72, 0x8766, 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, + 0x876A, 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, + 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, 0xCE80, + 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, 0xCE84, 0x877F, + 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, 0xCE88, 0x8786, 0xCE89, + 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, 0xCE8C, 0x878C, 0xCE8D, 0x878E, + 0xCE8E, 0x878F, 0xCE8F, 0x8790, 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, + 0x8794, 0xCE93, 0x8795, 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, + 0xCE97, 0x879A, 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, + 0x879E, 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, 0xCEA4, + 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, 0xCEA8, 0x552F, + 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, 0xCEAC, 0x7EF4, 0xCEAD, + 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, + 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, + 0x5473, 0xCEB7, 0x754F, 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, + 0xCEBB, 0x4F4D, 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, + 0x6170, 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, + 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, 0xCEC8, + 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, 0xCECC, 0x7FC1, + 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, 0xCED0, 0x6DA1, 0xCED1, + 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, 0xCED4, 0x5367, 0xCED5, 0x63E1, + 0xCED6, 0x6C83, 0xCED7, 0x5DEB, 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, + 0x4E4C, 0xCEDB, 0x6C61, 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, + 0xCEDF, 0x829C, 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, + 0x6BCB, 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, 0xCEEC, + 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, 0xCEF0, 0x52FF, + 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, 0xCEF4, 0x6614, 0xCEF5, + 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, 0xCEF8, 0x7852, 0xCEF9, 0x77FD, + 0xCEFA, 0x6670, 0xCEFB, 0x563B, 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, + 0x727A, 0xCF40, 0x87A5, 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, + 0xCF44, 0x87AA, 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, + 0x87B2, 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, + 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, 0xCF51, + 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, 0xCF55, 0x87C4, + 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, 0xCF59, 0x87C9, 0xCF5A, + 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, + 0xCF5F, 0x87D4, 0xCF60, 0x87D5, 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, + 0x87D8, 0xCF64, 0x87D9, 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, + 0xCF68, 0x87DE, 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, + 0x87E3, 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, 0xCF75, + 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, 0xCF79, 0x87F3, + 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, 0xCF7D, 0x87F7, 0xCF7E, + 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, 0xCF82, 0x87FC, 0xCF83, 0x87FD, + 0xCF84, 0x87FF, 0xCF85, 0x8800, 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, + 0x8804, 0xCF89, 0x8805, 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, + 0xCF8D, 0x8809, 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, + 0x880E, 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, + 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, 0xCF9A, + 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, 0xCF9E, 0x881F, + 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, 0xCFA2, 0x606F, 0xCFA3, + 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, 0xCFA6, 0x5915, 0xCFA7, 0x60DC, + 0xCFA8, 0x7184, 0xCFA9, 0x70EF, 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, + 0x7280, 0xCFAD, 0x6A84, 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, + 0xCFB1, 0x5AB3, 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, + 0x7CFB, 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, 0xCFBE, + 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, 0xCFC2, 0x4E0B, + 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, 0xCFC6, 0x6380, 0xCFC7, + 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, + 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, + 0x95F2, 0xCFD1, 0x6D8E, 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, + 0xCFD5, 0x9669, 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, + 0x817A, 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, + 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, 0xCFE2, + 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, 0xCFE6, 0x6E58, + 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, 0xCFEA, 0x8BE6, 0xCFEB, + 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, + 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, + 0x8427, 0xCFF5, 0x785D, 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, + 0xCFF9, 0x56A3, 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, + 0x6DC6, 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, 0xD047, + 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, 0xD04B, 0x882F, + 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, 0xD04F, 0x8834, 0xD050, + 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, 0xD053, 0x8838, 0xD054, 0x883A, + 0xD055, 0x883B, 0xD056, 0x883D, 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, + 0x8841, 0xD05A, 0x8842, 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, + 0xD05E, 0x8848, 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, + 0x884E, 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, + 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, 0xD06B, + 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, 0xD06F, 0x885E, + 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, 0xD073, 0x8867, 0xD074, + 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, 0xD077, 0x8871, 0xD078, 0x8873, + 0xD079, 0x8874, 0xD07A, 0x8875, 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, + 0x8879, 0xD07E, 0x887A, 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, + 0xD083, 0x8883, 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, + 0x888A, 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, 0xD090, + 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, 0xD094, 0x889B, + 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, 0xD098, 0x88A0, 0xD099, + 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, 0xD09C, 0x88A6, 0xD09D, 0x88A7, + 0xD09E, 0x88A8, 0xD09F, 0x88A9, 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, + 0x5B5D, 0xD0A3, 0x6821, 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, + 0xD0A7, 0x6548, 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, + 0x874E, 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, + 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, 0xD0B4, + 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, 0xD0B8, 0x61C8, + 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, 0xD0BC, 0x5C51, 0xD0BD, + 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, + 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, + 0x8845, 0xD0C7, 0x661F, 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, + 0xD0CB, 0x5174, 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, + 0x90A2, 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, 0xD0D8, + 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, 0xD0DC, 0x718A, + 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, 0xD0E0, 0x673D, 0xD0E1, + 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, + 0xD0E6, 0x589F, 0xD0E7, 0x620C, 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, + 0x5618, 0xD0EB, 0x987B, 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, + 0xD0EF, 0x9157, 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, + 0x755C, 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, + 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, 0xD0FC, + 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, 0xD141, 0x88AE, + 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, 0xD145, 0x88B3, 0xD146, + 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, 0xD149, 0x88B8, 0xD14A, 0x88B9, + 0xD14B, 0x88BA, 0xD14C, 0x88BB, 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, + 0x88BF, 0xD150, 0x88C0, 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, + 0xD154, 0x88C8, 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, + 0x88CD, 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, 0xD161, + 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, 0xD165, 0x88E1, + 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, 0xD169, 0x88EA, 0xD16A, + 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, 0xD16D, 0x88EE, 0xD16E, 0x88EF, + 0xD16F, 0x88F2, 0xD170, 0x88F5, 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, + 0x88FA, 0xD174, 0x88FB, 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, + 0xD178, 0x8901, 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, + 0x8906, 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, + 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, 0xD186, + 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, 0xD18A, 0x8917, + 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, 0xD18E, 0x891E, 0xD18F, + 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, 0xD192, 0x8923, 0xD193, 0x8924, + 0xD194, 0x8926, 0xD195, 0x8927, 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, + 0x892C, 0xD199, 0x892D, 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, + 0xD19D, 0x8932, 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, + 0x9009, 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, 0xD1AA, + 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, 0xD1AE, 0x65EC, + 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, 0xD1B2, 0x5DE1, 0xD1B3, + 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, + 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, + 0x9E2D, 0xD1BD, 0x5440, 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, + 0xD1C1, 0x869C, 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, + 0x96C5, 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, + 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, 0xD1CE, + 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, 0xD1D2, 0x5CA9, + 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, 0xD1D6, 0x960E, 0xD1D7, + 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, 0xD1DA, 0x63A9, 0xD1DB, 0x773C, + 0xD1DC, 0x884D, 0xD1DD, 0x6F14, 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, + 0x71D5, 0xD1E1, 0x538C, 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, + 0xD1E5, 0x5F66, 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, + 0x9A8C, 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, 0xD1F2, + 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, 0xD1F6, 0x4EF0, + 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, 0xD1FA, 0x6F3E, 0xD1FB, + 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, 0xD1FE, 0x7476, 0xD240, 0x8938, + 0xD241, 0x8939, 0xD242, 0x893A, 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, + 0x893D, 0xD246, 0x893E, 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, + 0xD24A, 0x8943, 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, + 0x8948, 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, + 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, 0xD257, + 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, 0xD25B, 0x8955, + 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, 0xD25F, 0x8959, 0xD260, + 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, 0xD263, 0x895D, 0xD264, 0x8960, + 0xD265, 0x8961, 0xD266, 0x8962, 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, + 0x8965, 0xD26A, 0x8967, 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, + 0xD26E, 0x896B, 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, + 0x896F, 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, 0xD27B, + 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, 0xD280, 0x897D, + 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, 0xD284, 0x8984, 0xD285, + 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, 0xD288, 0x8989, 0xD289, 0x898A, + 0xD28A, 0x898B, 0xD28B, 0x898C, 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, + 0x898F, 0xD28F, 0x8990, 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, + 0xD293, 0x8994, 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, + 0x8998, 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, + 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, 0xD2A0, + 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, 0xD2A4, 0x7A91, + 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, 0xD2A8, 0x8200, 0xD2A9, + 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, 0xD2AC, 0x6930, 0xD2AD, 0x564E, + 0xD2AE, 0x8036, 0xD2AF, 0x7237, 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, + 0x4E5F, 0xD2B3, 0x9875, 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, + 0xD2B7, 0x66F3, 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, + 0x4E00, 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, 0xD2C4, + 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, 0xD2C8, 0x80F0, + 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, 0xD2CC, 0x59E8, 0xD2CD, + 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, + 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, + 0x6291, 0xD2D7, 0x6613, 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, + 0xD2DB, 0x5F79, 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, + 0x75AB, 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, + 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, 0xD2E8, + 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, 0xD2EC, 0x5F02, + 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, 0xD2F0, 0x8335, 0xD2F1, + 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, 0xD2F4, 0x97F3, 0xD2F5, 0x9634, + 0xD2F6, 0x59FB, 0xD2F7, 0x541F, 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, + 0x5BC5, 0xD2FB, 0x996E, 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, + 0xD340, 0x89A2, 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, + 0x89A6, 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, 0xD34D, + 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, 0xD351, 0x89B3, + 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, 0xD355, 0x89B7, 0xD356, + 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, 0xD359, 0x89BB, 0xD35A, 0x89BC, + 0xD35B, 0x89BD, 0xD35C, 0x89BE, 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, + 0x89C3, 0xD360, 0x89CD, 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, + 0xD364, 0x89D7, 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, + 0x89DD, 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, + 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, 0xD371, + 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, 0xD375, 0x89F0, + 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, 0xD379, 0x89F5, 0xD37A, + 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, 0xD37D, 0x89F9, 0xD37E, 0x89FA, + 0xD380, 0x89FB, 0xD381, 0x89FC, 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, + 0x89FF, 0xD385, 0x8A01, 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, + 0xD389, 0x8A05, 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, + 0x8A0A, 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, 0xD396, + 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, 0xD39A, 0x8A17, + 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, 0xD39E, 0x8A1B, 0xD39F, + 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, + 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, + 0x83B9, 0xD3A9, 0x8424, 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, + 0xD3AD, 0x8FCE, 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, + 0x9896, 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, + 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, 0xD3BA, + 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, 0xD3BE, 0x6CF3, + 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, 0xD3C2, 0x52C7, 0xD3C3, + 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, + 0xD3C8, 0x5C24, 0xD3C9, 0x7531, 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, + 0x72B9, 0xD3CD, 0x6CB9, 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, + 0xD3D1, 0x53CB, 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, + 0x8BF1, 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, 0xD3DE, + 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, 0xD3E2, 0x903E, + 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, 0xD3E6, 0x6E14, 0xD3E7, + 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, + 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, + 0x7FBD, 0xD3F1, 0x7389, 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, + 0xD3F5, 0x5401, 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, + 0x5FA1, 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, + 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, 0xD443, + 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, 0xD447, 0x8A25, + 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, 0xD44B, 0x8A29, 0xD44C, + 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, 0xD44F, 0x8A2D, 0xD450, 0x8A2E, + 0xD451, 0x8A2F, 0xD452, 0x8A30, 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, + 0x8A33, 0xD456, 0x8A34, 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, + 0xD45A, 0x8A38, 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, + 0x8A3C, 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, 0xD467, + 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, 0xD46B, 0x8A4B, + 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, 0xD46F, 0x8A4F, 0xD470, + 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, 0xD473, 0x8A53, 0xD474, 0x8A54, + 0xD475, 0x8A55, 0xD476, 0x8A56, 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, + 0x8A59, 0xD47A, 0x8A5A, 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, + 0xD47E, 0x8A5E, 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, + 0x8A62, 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, + 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, 0xD48C, + 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, 0xD490, 0x8A6F, + 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, 0xD494, 0x8A73, 0xD495, + 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, 0xD498, 0x8A77, 0xD499, 0x8A78, + 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, + 0x8A7E, 0xD49F, 0x8A7F, 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, + 0xD4A3, 0x88D5, 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, + 0x9E33, 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, 0xD4B0, + 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, 0xD4B4, 0x6E90, + 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, 0xD4B8, 0x613F, 0xD4B9, + 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, + 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, + 0x6708, 0xD4C3, 0x60A6, 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, + 0xD4C7, 0x90E7, 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, + 0x8FD0, 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, + 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, 0xD4D4, + 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, 0xD4D8, 0x8F7D, + 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, 0xD4DC, 0x6512, 0xD4DD, + 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, 0xD4E0, 0x810F, 0xD4E1, 0x846C, + 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, + 0x67A3, 0xD4E7, 0x65E9, 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, + 0xD4EB, 0x566A, 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, + 0x71E5, 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, 0xD4F8, + 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, 0xD4FC, 0x6E23, + 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, 0xD541, 0x8A82, 0xD542, + 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, 0xD545, 0x8A86, 0xD546, 0x8A87, + 0xD547, 0x8A88, 0xD548, 0x8A8B, 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, + 0x8A8E, 0xD54C, 0x8A8F, 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, + 0xD550, 0x8A94, 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, + 0x8A98, 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, + 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, 0xD55D, + 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, 0xD561, 0x8AA5, + 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, 0xD565, 0x8AA9, 0xD566, + 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, 0xD569, 0x8AAD, 0xD56A, 0x8AAE, + 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, + 0x8AB3, 0xD570, 0x8AB4, 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, + 0xD574, 0x8AB8, 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, + 0x8ABC, 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, 0xD582, + 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, 0xD586, 0x8AC9, + 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, 0xD58A, 0x8ACD, 0xD58B, + 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, + 0xD590, 0x8AD3, 0xD591, 0x8AD4, 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, + 0x8AD7, 0xD595, 0x8AD8, 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, + 0xD599, 0x8ADC, 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, + 0x8AE0, 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, + 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, 0xD5A6, + 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, 0xD5AA, 0x6458, + 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, 0xD5AE, 0x503A, 0xD5AF, + 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, + 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, + 0x5D2D, 0xD5B9, 0x5C55, 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, + 0xD5BD, 0x6218, 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, + 0x6A1F, 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, 0xD5CA, + 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, 0xD5CE, 0x7634, + 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, 0xD5D2, 0x627E, 0xD5D3, + 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, 0xD5D6, 0x7F69, 0xD5D7, 0x5146, + 0xD5D8, 0x8087, 0xD5D9, 0x53EC, 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, + 0x54F2, 0xD5DD, 0x86F0, 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, + 0xD5E1, 0x8517, 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, + 0x659F, 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, + 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, 0xD5EE, + 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, 0xD5F2, 0x9547, + 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, 0xD5F6, 0x7741, 0xD5F7, + 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, 0xD5FA, 0x6014, 0xD5FB, 0x6574, + 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, + 0x8AE5, 0xD642, 0x8AE6, 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, + 0xD646, 0x8AEA, 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, + 0x8AEE, 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, 0xD653, + 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, 0xD657, 0x8AFB, + 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, 0xD65B, 0x8AFF, 0xD65C, + 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, 0xD65F, 0x8B03, 0xD660, 0x8B04, + 0xD661, 0x8B05, 0xD662, 0x8B06, 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, + 0x8B0A, 0xD666, 0x8B0B, 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, + 0xD66A, 0x8B0F, 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, + 0x8B13, 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, + 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, 0xD677, + 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, 0xD67B, 0x8B20, + 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, 0xD680, 0x8B24, 0xD681, + 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, 0xD684, 0x8B29, 0xD685, 0x8B2A, + 0xD686, 0x8B2B, 0xD687, 0x8B2C, 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, + 0x8B2F, 0xD68B, 0x8B30, 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, + 0xD68F, 0x8B34, 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, + 0x8B38, 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, 0xD69C, + 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, 0xD6A0, 0x8B45, + 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, 0xD6A4, 0x8BC1, 0xD6A5, + 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, 0xD6A8, 0x5431, 0xD6A9, 0x8718, + 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, + 0x4E4B, 0xD6AF, 0x7EC7, 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, + 0xD6B3, 0x6B96, 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, + 0x5740, 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, + 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, 0xD6C0, + 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, 0xD6C4, 0x5E1C, + 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, 0xD6C8, 0x79E9, 0xD6C9, + 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, + 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, + 0x5FE0, 0xD6D3, 0x949F, 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, + 0xD6D7, 0x80BF, 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, + 0x821F, 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, 0xD6E4, + 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, 0xD6E8, 0x9AA4, + 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, 0xD6EC, 0x6731, 0xD6ED, + 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, + 0xD6F2, 0x70DB, 0xD6F3, 0x716E, 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, + 0x5631, 0xD6F7, 0x4E3B, 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, + 0xD6FB, 0x86C0, 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, + 0x8B46, 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, + 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, 0xD749, + 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, 0xD74D, 0x8B53, + 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, 0xD751, 0x8B57, 0xD752, + 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, 0xD755, 0x8B5B, 0xD756, 0x8B5C, + 0xD757, 0x8B5D, 0xD758, 0x8B5E, 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, + 0x8B61, 0xD75C, 0x8B62, 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, + 0xD760, 0x8B67, 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, + 0x8B6B, 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, 0xD76D, + 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, 0xD771, 0x8B79, + 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, 0xD775, 0x8B7D, 0xD776, + 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, 0xD779, 0x8B81, 0xD77A, 0x8B82, + 0xD77B, 0x8B83, 0xD77C, 0x8B84, 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, + 0x8B87, 0xD781, 0x8B88, 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, + 0xD785, 0x8B8C, 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, + 0x8B90, 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, + 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, 0xD792, + 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, 0xD796, 0x8B9D, + 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, 0xD79A, 0x8BB1, 0xD79B, + 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, 0xD79E, 0x8BEA, 0xD79F, 0x8C09, + 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, + 0x9A7B, 0xD7A5, 0x6293, 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, + 0xD7A9, 0x7816, 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, + 0x7BC6, 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, 0xD7B6, + 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, 0xD7BA, 0x7F00, + 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, 0xD7BE, 0x62D9, 0xD7BF, + 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, 0xD7C2, 0x8301, 0xD7C3, 0x914C, + 0xD7C4, 0x5544, 0xD7C5, 0x7740, 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, + 0x5179, 0xD7C9, 0x54A8, 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, + 0xD7CD, 0x6DC4, 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, + 0x7C7D, 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, + 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, 0xD7DA, + 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, 0xD7DE, 0x90B9, + 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, 0xD7E2, 0x79DF, 0xD7E3, + 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, + 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, + 0x5634, 0xD7ED, 0x9189, 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, + 0xD7F1, 0x9075, 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, + 0x67DE, 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, 0xD844, + 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, 0xD848, 0x8C40, + 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, 0xD84C, 0x8C45, 0xD84D, + 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, 0xD850, 0x8C4D, 0xD851, 0x8C4E, + 0xD852, 0x8C4F, 0xD853, 0x8C50, 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, + 0x8C53, 0xD857, 0x8C54, 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, + 0xD85B, 0x8C59, 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, + 0x8C5E, 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, + 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, 0xD868, + 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, 0xD86C, 0x8C6F, + 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, 0xD870, 0x8C74, 0xD871, + 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, 0xD874, 0x8C7B, 0xD875, 0x8C7C, + 0xD876, 0x8C7D, 0xD877, 0x8C7E, 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, + 0x8C81, 0xD87B, 0x8C83, 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, + 0xD880, 0x8C88, 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, + 0x8C8F, 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, 0xD88D, + 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, 0xD891, 0x8C9E, + 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, 0xD895, 0x8CA2, 0xD896, + 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, 0xD899, 0x8CA6, 0xD89A, 0x8CA7, + 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, + 0x8CAC, 0xD8A0, 0x8CAD, 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, + 0xD8A4, 0x4E10, 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, + 0x4E98, 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, + 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, 0xD8B1, + 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, 0xD8B5, 0x6C10, + 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, 0xD8B9, 0x6BD3, 0xD8BA, + 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, + 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, + 0x5B5B, 0xD8C4, 0x556C, 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, + 0xD8C8, 0x539D, 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, + 0x9765, 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, 0xD8D5, + 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, 0xD8D9, 0x522D, + 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, 0xD8DD, 0x524C, 0xD8DE, + 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, 0xD8E1, 0x84AF, 0xD8E2, 0x527D, + 0xD8E3, 0x5282, 0xD8E4, 0x5281, 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, + 0x5182, 0xD8E8, 0x7F54, 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, + 0xD8EC, 0x4EC2, 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, + 0x4EDE, 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, + 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, 0xD8F9, + 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, 0xD8FD, 0x4F5A, + 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, 0xD942, 0x8CB0, 0xD943, + 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, 0xD946, 0x8CB4, 0xD947, 0x8CB5, + 0xD948, 0x8CB6, 0xD949, 0x8CB7, 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, + 0x8CBA, 0xD94D, 0x8CBB, 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, + 0xD951, 0x8CBF, 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, + 0x8CC3, 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, 0xD95E, + 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, 0xD962, 0x8CD0, + 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, 0xD966, 0x8CD4, 0xD967, + 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, + 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, + 0x8CDE, 0xD971, 0x8CDF, 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, + 0xD975, 0x8CE3, 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, + 0x8CE7, 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, + 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, 0xD983, + 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, 0xD987, 0x8CF4, + 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, 0xD98B, 0x8CF8, 0xD98C, + 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, 0xD98F, 0x8CFC, 0xD990, 0x8CFD, + 0xD991, 0x8CFE, 0xD992, 0x8CFF, 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, + 0x8D02, 0xD996, 0x8D03, 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, + 0xD99A, 0x8D07, 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, + 0x8D0B, 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, 0xD9A7, + 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, 0xD9AB, 0x4F7E, + 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, 0xD9AF, 0x4FAC, 0xD9B0, + 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, + 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, + 0x4FDF, 0xD9BA, 0x4FF8, 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, + 0xD9BE, 0x502C, 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, + 0x4FFE, 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, + 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, 0xD9CB, + 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, 0xD9CF, 0x50A7, + 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, 0xD9D3, 0x5106, 0xD9D4, + 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, 0xD9D7, 0x50EE, 0xD9D8, 0x5107, + 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, + 0x4F65, 0xD9DE, 0x4FCE, 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, + 0xD9E2, 0x516E, 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, + 0x5181, 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, 0xD9EF, + 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, 0xD9F3, 0x88A4, + 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, 0xD9F7, 0x7980, 0xD9F8, + 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, + 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, + 0x8D10, 0xDA43, 0x8D11, 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, + 0xDA47, 0x8D15, 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, + 0x8D19, 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, + 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, 0xDA54, + 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, 0xDA58, 0x8D6C, + 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, 0xDA5C, 0x8D72, 0xDA5D, + 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, + 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, + 0x8D82, 0xDA67, 0x8D83, 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, + 0xDA6B, 0x8D89, 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, + 0x8D8F, 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, 0xDA78, + 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, 0xDA7C, 0x8D9E, + 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, 0xDA81, 0x8DA4, 0xDA82, + 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, + 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, + 0x8DAE, 0xDA8C, 0x8DAF, 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, + 0xDA90, 0x8DB7, 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, + 0x8DC0, 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, + 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, 0xDA9D, + 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, 0xDAA1, 0x51C7, + 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, 0xDAA5, 0x8BA0, 0xDAA6, + 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, + 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, + 0x8BCF, 0xDAB0, 0x8BCE, 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, + 0xDAB4, 0x8BD6, 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, + 0x8BDF, 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, 0xDAC1, + 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, 0xDAC5, 0x8C02, + 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, 0xDAC9, 0x8C0F, 0xDACA, + 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, 0xDACD, 0x8C15, 0xDACE, 0x8C16, + 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, + 0x8C1F, 0xDAD4, 0x8C20, 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, + 0xDAD8, 0x8C2A, 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, + 0x8C32, 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, + 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, 0xDAE5, + 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, 0xDAE9, 0x9642, + 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, 0xDAED, 0x9667, 0xDAEE, + 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, 0xDAF1, 0x9688, 0xDAF2, 0x968D, + 0xDAF3, 0x9697, 0xDAF4, 0x96B0, 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, + 0x909D, 0xDAF8, 0x9099, 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, + 0xDAFC, 0x90B3, 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, + 0x8DD8, 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, 0xDB4A, + 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, 0xDB4E, 0x8DF1, + 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, 0xDB52, 0x8DFC, 0xDB53, + 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, 0xDB56, 0x8E01, 0xDB57, 0x8E02, + 0xDB58, 0x8E03, 0xDB59, 0x8E04, 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, + 0x8E08, 0xDB5D, 0x8E0B, 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, + 0xDB61, 0x8E11, 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, + 0x8E16, 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, + 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, 0xDB6E, + 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, 0xDB72, 0x8E28, + 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, 0xDB76, 0x8E32, 0xDB77, + 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, + 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, + 0x8E43, 0xDB82, 0x8E45, 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, + 0xDB86, 0x8E4E, 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, + 0x8E54, 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, 0xDB93, + 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, 0xDB97, 0x8E62, + 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, 0xDB9B, 0x8E67, 0xDB9C, + 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, + 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, + 0x90BE, 0xDBA6, 0x90D0, 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, + 0xDBAA, 0x90E6, 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, + 0x90DB, 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, + 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, 0xDBB7, + 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, 0xDBBB, 0x520D, + 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, 0xDBBF, 0x52AD, 0xDBC0, + 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, + 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, + 0x51F5, 0xDBCA, 0x51FC, 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, + 0xDBCE, 0x755A, 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, + 0x57A1, 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, 0xDBDB, + 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, 0xDBDF, 0x573B, + 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, 0xDBE3, 0x576B, 0xDBE4, + 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, 0xDBE7, 0x5768, 0xDBE8, 0x576D, + 0xDBE9, 0x5776, 0xDBEA, 0x5773, 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, + 0x578C, 0xDBEE, 0x57B2, 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, + 0xDBF2, 0x5793, 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, + 0x57DA, 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, + 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, 0xDC40, + 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, 0xDC44, 0x8E79, + 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, 0xDC48, 0x8E7E, 0xDC49, + 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, + 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, + 0x8E8C, 0xDC53, 0x8E8D, 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, + 0xDC57, 0x8E93, 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, + 0x8E98, 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, 0xDC64, + 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, 0xDC68, 0x8EA7, + 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, 0xDC6C, 0x8EAD, 0xDC6D, + 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, + 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, + 0x8EB9, 0xDC77, 0x8EBB, 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, + 0xDC7B, 0x8EBF, 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, + 0x8EC3, 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, + 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, 0xDC89, + 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, 0xDC8D, 0x8ED1, + 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, 0xDC91, 0x8ED5, 0xDC92, + 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, + 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, + 0x8EDF, 0xDC9C, 0x8EE0, 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, + 0xDCA0, 0x8EE4, 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, + 0x57ED, 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, 0xDCAD, + 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, 0xDCB1, 0x9F19, + 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, 0xDCB5, 0x827F, 0xDCB6, + 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, 0xDCB9, 0x8284, 0xDCBA, 0x828E, + 0xDCBB, 0x8291, 0xDCBC, 0x8297, 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, + 0x82B8, 0xDCC0, 0x82BE, 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, + 0xDCC4, 0x82E3, 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, + 0x82CB, 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, + 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, 0xDCD1, + 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, 0xDCD5, 0x82F7, + 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, 0xDCD9, 0x82DC, 0xDCDA, + 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, 0xDCDD, 0x830C, 0xDCDE, 0x82FB, + 0xDCDF, 0x82D3, 0xDCE0, 0x8311, 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, + 0x8314, 0xDCE4, 0x8315, 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, + 0xDCE8, 0x8351, 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, + 0x8392, 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, 0xDCF5, + 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, 0xDCF9, 0x8360, + 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, 0xDCFD, 0x8366, 0xDCFE, + 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, + 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, + 0x8EED, 0xDD49, 0x8EEE, 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, + 0xDD4D, 0x8EF2, 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, + 0x8EF6, 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, + 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, 0xDD5A, + 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, 0xDD5E, 0x8F03, + 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, 0xDD62, 0x8F07, 0xDD63, + 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, + 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, + 0x8F11, 0xDD6D, 0x8F12, 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, + 0xDD71, 0x8F16, 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, + 0x8F1A, 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, 0xDD7E, + 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, 0xDD83, 0x8F27, + 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, 0xDD87, 0x8F2B, 0xDD88, + 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, + 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, + 0x8F35, 0xDD92, 0x8F36, 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, + 0xDD96, 0x8F3A, 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, + 0x8F3E, 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, + 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, 0xDDA3, + 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, 0xDDA7, 0x836E, + 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, 0xDDAB, 0x83B4, 0xDDAC, + 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, 0xDDAF, 0x839C, 0xDDB0, 0x8385, + 0xDDB1, 0x837C, 0xDDB2, 0x83B6, 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, + 0x83B8, 0xDDB6, 0x837B, 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, + 0xDDBA, 0x83BA, 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, + 0x83E5, 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, 0xDDC7, + 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, 0xDDCB, 0x83DF, + 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, 0xDDCF, 0x83F9, 0xDDD0, + 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, 0xDDD3, 0x8426, 0xDDD4, 0x83F0, + 0xDDD5, 0x83E1, 0xDDD6, 0x845C, 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, + 0x8459, 0xDDDA, 0x8473, 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, + 0xDDDE, 0x8489, 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, + 0x8469, 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, + 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, 0xDDEB, + 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, 0xDDEF, 0x84BF, + 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, 0xDDF3, 0x84B9, 0xDDF4, + 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, 0xDDF7, 0x84E3, 0xDDF8, 0x850C, + 0xDDF9, 0x750D, 0xDDFA, 0x8538, 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, + 0x851F, 0xDDFE, 0x853A, 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, + 0xDE43, 0x8F48, 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, + 0x8F4C, 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, 0xDE50, + 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, 0xDE54, 0x8F59, + 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, 0xDE58, 0x8F5D, 0xDE59, + 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, + 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, + 0x8F80, 0xDE63, 0x8F8C, 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, + 0xDE67, 0x8FA1, 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, + 0x8FA6, 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, + 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, 0xDE74, + 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, 0xDE78, 0x8FBA, + 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, 0xDE7C, 0x8FC0, 0xDE7D, + 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, + 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, + 0x8FD6, 0xDE88, 0x8FD7, 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, + 0xDE8C, 0x8FE3, 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, + 0x8FF1, 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, 0xDE99, + 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, 0xDE9D, 0x900E, + 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, 0xDEA1, 0x8556, 0xDEA2, + 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, 0xDEA5, 0x8559, 0xDEA6, 0x8548, + 0xDEA7, 0x8568, 0xDEA8, 0x8564, 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, + 0x77A2, 0xDEAC, 0x8543, 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, + 0xDEB0, 0x85A8, 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, + 0x85AE, 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, + 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, 0xDEBD, + 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, 0xDEC1, 0x8616, + 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, 0xDEC5, 0x593C, 0xDEC6, + 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, 0xDEC9, 0x595A, 0xDECA, 0x5958, + 0xDECB, 0x530F, 0xDECC, 0x5C22, 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, + 0x5C34, 0xDED0, 0x624C, 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, + 0xDED4, 0x62CA, 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, + 0x6322, 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, 0xDEE1, + 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, 0xDEE5, 0x638A, + 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, 0xDEE9, 0x63F2, 0xDEEA, + 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, 0xDEED, 0x63C4, 0xDEEE, 0x63DE, + 0xDEEF, 0x63CE, 0xDEF0, 0x6452, 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, + 0x6445, 0xDEF4, 0x6441, 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, + 0xDEF8, 0x640C, 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, + 0x6484, 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, + 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, 0xDF46, + 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, 0xDF4A, 0x902C, + 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, 0xDF4E, 0x9033, 0xDF4F, + 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, 0xDF52, 0x903A, 0xDF53, 0x903D, + 0xDF54, 0x903F, 0xDF55, 0x9040, 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, + 0x9046, 0xDF59, 0x9048, 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, + 0xDF5D, 0x904C, 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, + 0x9056, 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, 0xDF6A, + 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, 0xDF6E, 0x906A, + 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, 0xDF72, 0x9070, 0xDF73, + 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, 0xDF76, 0x9076, 0xDF77, 0x9077, + 0xDF78, 0x9078, 0xDF79, 0x9079, 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, + 0x907C, 0xDF7D, 0x907E, 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, + 0xDF82, 0x9086, 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, + 0x908C, 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, + 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, 0xDF8F, + 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, 0xDF93, 0x90A0, + 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, 0xDF97, 0x90A8, 0xDF98, + 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, + 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, + 0x647A, 0xDFA2, 0x64B7, 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, + 0xDFA6, 0x64C0, 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, + 0x64E2, 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, 0xDFB3, + 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, 0xDFB7, 0x53FB, + 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, 0xDFBB, 0x544B, 0xDFBC, + 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, 0xDFBF, 0x5456, 0xDFC0, 0x5443, + 0xDFC1, 0x5421, 0xDFC2, 0x5457, 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, + 0x5432, 0xDFC6, 0x5482, 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, + 0xDFCA, 0x5464, 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, + 0x5476, 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, + 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, 0xDFD7, + 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, 0xDFDB, 0x54A3, + 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, 0xDFDF, 0x54CC, 0xDFE0, + 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, + 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, + 0x551B, 0xDFEA, 0x54E7, 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, + 0xDFEE, 0x54F3, 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, + 0x5511, 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, 0xDFFB, + 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, 0xE040, 0x90C2, + 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, 0xE044, 0x90C9, 0xE045, + 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, 0xE048, 0x90D2, 0xE049, 0x90D4, + 0xE04A, 0x90D5, 0xE04B, 0x90D6, 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, + 0x90DA, 0xE04F, 0x90DE, 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, + 0xE053, 0x90E4, 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, + 0x90EC, 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, + 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, 0xE060, + 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, 0xE064, 0x90FF, + 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, 0xE068, 0x9105, 0xE069, + 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, 0xE06C, 0x9109, 0xE06D, 0x910A, + 0xE06E, 0x910B, 0xE06F, 0x910C, 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, + 0x910F, 0xE073, 0x9110, 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, + 0xE077, 0x9114, 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, + 0x9118, 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, 0xE085, + 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, 0xE089, 0x9129, + 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, 0xE08D, 0x912D, 0xE08E, + 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, 0xE091, 0x9133, 0xE092, 0x9134, + 0xE093, 0x9135, 0xE094, 0x9136, 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, + 0x913A, 0xE098, 0x913B, 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, + 0xE09C, 0x913F, 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, + 0x9144, 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, + 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, 0xE0A9, + 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, 0xE0AD, 0x55B9, + 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, 0xE0B1, 0x557E, 0xE0B2, + 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, + 0xE0B7, 0x55BE, 0xE0B8, 0x5594, 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, + 0x55F7, 0xE0BC, 0x55C9, 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, + 0xE0C0, 0x55EC, 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, + 0x55C4, 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, 0xE0CD, + 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, 0xE0D1, 0x560C, + 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, 0xE0D5, 0x55FE, 0xE0D6, + 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, 0xE0D9, 0x5658, 0xE0DA, 0x5639, + 0xE0DB, 0x5657, 0xE0DC, 0x562C, 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, + 0x5659, 0xE0E0, 0x565C, 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, + 0xE0E4, 0x5664, 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, + 0x567C, 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, + 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, 0xE0F1, + 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, 0xE0F5, 0x570A, + 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, 0xE0F9, 0x5E19, 0xE0FA, + 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, + 0xE140, 0x9145, 0xE141, 0x9147, 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, + 0x9153, 0xE145, 0x9154, 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, + 0xE149, 0x9159, 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, + 0x9160, 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, 0xE156, + 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, 0xE15A, 0x9183, + 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, 0xE15E, 0x918A, 0xE15F, + 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, 0xE162, 0x9194, 0xE163, 0x9195, + 0xE164, 0x9196, 0xE165, 0x9197, 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, + 0x919C, 0xE169, 0x919D, 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, + 0xE16D, 0x91A1, 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, + 0x91A7, 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, + 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, 0xE17A, + 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, 0xE17E, 0x91BB, + 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, 0xE183, 0x91BF, 0xE184, + 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, 0xE187, 0x91C3, 0xE188, 0x91C4, + 0xE189, 0x91C5, 0xE18A, 0x91C6, 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, + 0x91D0, 0xE18E, 0x91D2, 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, + 0xE192, 0x91D6, 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, + 0x91DA, 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, 0xE19F, + 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, 0xE1A3, 0x5E54, + 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, 0xE1A7, 0x5C8C, 0xE1A8, + 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, + 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, + 0x5C9C, 0xE1B2, 0x5CB5, 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, + 0xE1B6, 0x5CAB, 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, + 0x5CB7, 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, + 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, 0xE1C3, + 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, 0xE1C7, 0x5D06, + 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, 0xE1CB, 0x5D34, 0xE1CC, + 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, + 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, + 0x5D74, 0xE1D6, 0x5D82, 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, + 0xE1DA, 0x5DB7, 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, + 0x5F82, 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, 0xE1E7, + 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, 0xE1EB, 0x72AD, + 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, 0xE1EF, 0x72B8, 0xE1F0, + 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, + 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, + 0x72F4, 0xE1FA, 0x72F7, 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, + 0xE1FE, 0x72FA, 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, + 0x91E9, 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, + 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, 0xE24C, + 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, 0xE250, 0x91F6, + 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, 0xE254, 0x91FA, 0xE255, + 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, 0xE258, 0x91FE, 0xE259, 0x91FF, + 0xE25A, 0x9200, 0xE25B, 0x9201, 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, + 0x9204, 0xE25F, 0x9205, 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, + 0xE263, 0x9209, 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, + 0x920D, 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, 0xE270, + 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, 0xE274, 0x921A, + 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, 0xE278, 0x921E, 0xE279, + 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, 0xE27C, 0x9222, 0xE27D, 0x9223, + 0xE27E, 0x9224, 0xE280, 0x9225, 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, + 0x9228, 0xE284, 0x9229, 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, + 0xE288, 0x922D, 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, + 0x9231, 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, + 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, 0xE295, + 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, 0xE299, 0x923E, + 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, 0xE29D, 0x9242, 0xE29E, + 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, 0xE2A1, 0x72FB, 0xE2A2, 0x7317, + 0xE2A3, 0x7313, 0xE2A4, 0x7321, 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, + 0x731D, 0xE2A8, 0x7315, 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, + 0xE2AC, 0x732C, 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, + 0x734D, 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, 0xE2B9, + 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, 0xE2BD, 0x9968, + 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, 0xE2C1, 0x996C, 0xE2C2, + 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, 0xE2C5, 0x9980, 0xE2C6, 0x9984, + 0xE2C7, 0x9987, 0xE2C8, 0x998A, 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, + 0x9991, 0xE2CC, 0x9993, 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, + 0xE2D0, 0x5E91, 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, + 0x5EA0, 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, + 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, 0xE2DD, + 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, 0xE2E1, 0x5FC9, + 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, 0xE2E5, 0x5FEE, 0xE2E6, + 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, + 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, + 0x6019, 0xE2F0, 0x6035, 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, + 0xE2F4, 0x600D, 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, + 0x603F, 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, 0xE342, + 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, 0xE346, 0x924C, + 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, 0xE34A, 0x9250, 0xE34B, + 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, 0xE34E, 0x9254, 0xE34F, 0x9255, + 0xE350, 0x9256, 0xE351, 0x9257, 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, + 0x925A, 0xE355, 0x925B, 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, + 0xE359, 0x925F, 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, + 0x9263, 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, + 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, 0xE366, + 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, 0xE36A, 0x9270, + 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, 0xE36E, 0x9275, 0xE36F, + 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, 0xE372, 0x9279, 0xE373, 0x927A, + 0xE374, 0x927B, 0xE375, 0x927C, 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, + 0x927F, 0xE379, 0x9280, 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, + 0xE37D, 0x9284, 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, + 0x9288, 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, 0xE38B, + 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, 0xE38F, 0x9296, + 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, 0xE393, 0x929A, 0xE394, + 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, 0xE397, 0x929E, 0xE398, 0x929F, + 0xE399, 0x92A0, 0xE39A, 0x92A1, 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, + 0x92A4, 0xE39E, 0x92A5, 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, + 0xE3A2, 0x607D, 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, + 0x609D, 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, + 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, 0xE3AF, + 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, 0xE3B3, 0x6120, + 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, 0xE3B7, 0x60F4, 0xE3B8, + 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, 0xE3BB, 0x614A, 0xE3BC, 0x6175, + 0xE3BD, 0x61AC, 0xE3BE, 0x6194, 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, + 0x61D4, 0xE3C2, 0x61F5, 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, + 0xE3C6, 0x95EB, 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, + 0x95F6, 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, 0xE3D3, + 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, 0xE3D7, 0x9615, + 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, 0xE3DB, 0x961A, 0xE3DC, + 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, + 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, + 0x6C90, 0xE3E6, 0x6C94, 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, + 0xE3EA, 0x6C74, 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, + 0x6CD0, 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, + 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, 0xE3F7, + 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, 0xE3FB, 0x6CB1, + 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, 0xE440, 0x92A8, 0xE441, + 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, 0xE444, 0x92AC, 0xE445, 0x92AD, + 0xE446, 0x92AF, 0xE447, 0x92B0, 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, + 0x92B3, 0xE44B, 0x92B4, 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, + 0xE44F, 0x92B8, 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, + 0x92BC, 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, 0xE45C, + 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, 0xE460, 0x92CA, + 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, 0xE464, 0x92CE, 0xE465, + 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, 0xE468, 0x92D2, 0xE469, 0x92D3, + 0xE46A, 0x92D4, 0xE46B, 0x92D5, 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, + 0x92D8, 0xE46F, 0x92D9, 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, + 0xE473, 0x92DD, 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, + 0x92E1, 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, + 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, 0xE481, + 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, 0xE485, 0x92EE, + 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, 0xE489, 0x92F2, 0xE48A, + 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, 0xE48D, 0x92F6, 0xE48E, 0x92F7, + 0xE48F, 0x92F8, 0xE490, 0x92F9, 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, + 0x92FC, 0xE494, 0x92FD, 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, + 0xE498, 0x9301, 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, + 0x9305, 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, 0xE4A5, + 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, 0xE4A9, 0x6D0E, + 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, 0xE4AD, 0x6D35, 0xE4AE, + 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, + 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, + 0x6D5E, 0xE4B8, 0x6D93, 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, + 0xE4BC, 0x6D7C, 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, + 0x6DC5, 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, + 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, 0xE4C9, + 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, 0xE4CD, 0x6E2B, + 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, 0xE4D1, 0x6EB2, 0xE4D2, + 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, + 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, + 0x6E98, 0xE4DC, 0x6EE0, 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, + 0xE4E0, 0x6EA7, 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, + 0x6ED7, 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, 0xE4ED, + 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, 0xE4F1, 0x6F36, + 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, 0xE4F5, 0x6F09, 0xE4F6, + 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, + 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, + 0x930A, 0xE541, 0x930B, 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, + 0xE545, 0x930F, 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, + 0x9313, 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, + 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, 0xE552, + 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, 0xE556, 0x9320, + 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, 0xE55A, 0x9324, 0xE55B, + 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, 0xE55E, 0x9328, 0xE55F, 0x9329, + 0xE560, 0x932A, 0xE561, 0x932B, 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, + 0x932E, 0xE565, 0x932F, 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, + 0xE569, 0x9333, 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, + 0x9337, 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, 0xE576, + 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, 0xE57A, 0x9345, + 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, 0xE57E, 0x9349, 0xE580, + 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, 0xE583, 0x934D, 0xE584, 0x934E, + 0xE585, 0x934F, 0xE586, 0x9350, 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, + 0x9353, 0xE58A, 0x9354, 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, + 0xE58E, 0x9358, 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, + 0x935C, 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, + 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, 0xE59B, + 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, 0xE59F, 0x9369, + 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, 0xE5A3, 0x6FB9, 0xE5A4, + 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, + 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, + 0x701B, 0xE5AE, 0x7039, 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, + 0xE5B2, 0x5B80, 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, + 0x5BA5, 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, 0xE5BF, + 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, 0xE5C3, 0x8FD5, + 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, 0xE5C7, 0x8FE9, 0xE5C8, + 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, 0xE5CB, 0x9005, 0xE5CC, 0x9004, + 0xE5CD, 0x900B, 0xE5CE, 0x9026, 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, + 0x9016, 0xE5D2, 0x9021, 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, + 0xE5D6, 0x902F, 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, + 0x9050, 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, + 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, 0xE5E3, + 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, 0xE5E7, 0x5F57, + 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, 0xE5EB, 0x54AB, 0xE5EC, + 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, + 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, + 0x8274, 0xE5F6, 0x5F3C, 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, + 0xE5FA, 0x5983, 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, + 0x59A3, 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, 0xE648, + 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, 0xE64C, 0x9378, + 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, 0xE650, 0x937C, 0xE651, + 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, 0xE654, 0x9380, 0xE655, 0x9381, + 0xE656, 0x9382, 0xE657, 0x9383, 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, + 0x9386, 0xE65B, 0x9387, 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, + 0xE65F, 0x938B, 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, + 0x9390, 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, + 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, 0xE66C, + 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, 0xE670, 0x939D, + 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, 0xE674, 0x93A1, 0xE675, + 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, 0xE678, 0x93A5, 0xE679, 0x93A6, + 0xE67A, 0x93A7, 0xE67B, 0x93A8, 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, + 0x93AB, 0xE680, 0x93AC, 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, + 0xE684, 0x93B0, 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, + 0x93B4, 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, 0xE691, + 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, 0xE695, 0x93C1, + 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, 0xE699, 0x93C5, 0xE69A, + 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, 0xE69D, 0x93C9, 0xE69E, 0x93CB, + 0xE69F, 0x93CC, 0xE6A0, 0x93CD, 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, + 0x59AB, 0xE6A4, 0x599E, 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, + 0xE6A8, 0x59AF, 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, + 0x5A06, 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, + 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, 0xE6B5, + 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, 0xE6B9, 0x5A40, + 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, 0xE6BD, 0x5A3C, 0xE6BE, + 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, + 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, + 0x5AB2, 0xE6C8, 0x5AD2, 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, + 0xE6CC, 0x5AE3, 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, + 0x5AD8, 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, 0xE6D9, + 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, 0xE6DD, 0x5B51, + 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, 0xE6E1, 0x9A77, 0xE6E2, + 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, + 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, + 0x9A90, 0xE6EC, 0x9A92, 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, + 0xE6F0, 0x9A9B, 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, + 0x9AA0, 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, + 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, 0xE6FD, + 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, 0xE742, 0x93D0, + 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, 0xE746, 0x93D4, 0xE747, + 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, 0xE74A, 0x93D9, 0xE74B, 0x93DA, + 0xE74C, 0x93DB, 0xE74D, 0x93DC, 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, + 0x93DF, 0xE751, 0x93E0, 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, + 0xE755, 0x93E4, 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, + 0x93E8, 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, 0xE762, + 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, 0xE766, 0x93F5, + 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, 0xE76A, 0x93F9, 0xE76B, + 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, 0xE76E, 0x93FD, 0xE76F, 0x93FE, + 0xE770, 0x93FF, 0xE771, 0x9400, 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, + 0x9403, 0xE775, 0x9404, 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, + 0xE779, 0x9408, 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, + 0x940C, 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, + 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, 0xE787, + 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, 0xE78B, 0x9419, + 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, 0xE78F, 0x941D, 0xE790, + 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, 0xE793, 0x9421, 0xE794, 0x9422, + 0xE795, 0x9423, 0xE796, 0x9424, 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, + 0x9427, 0xE79A, 0x9428, 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, + 0xE79E, 0x942C, 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, + 0x7EB0, 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, 0xE7AB, + 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, 0xE7AF, 0x7EE1, + 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, 0xE7B3, 0x7EEF, 0xE7B4, + 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, + 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, + 0x7F03, 0xE7BE, 0x7F07, 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, + 0xE7C2, 0x7F0F, 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, + 0x7F19, 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, + 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, 0xE7CF, + 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, 0xE7D3, 0x7F2C, + 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, 0xE7D7, 0x7F31, 0xE7D8, + 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, + 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, + 0x7391, 0xE7E2, 0x73AE, 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, + 0xE7E6, 0x73C2, 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, + 0x73C0, 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, 0xE7F3, + 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, 0xE7F7, 0x742A, + 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, 0xE7FB, 0x7428, 0xE7FC, + 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, 0xE840, 0x942F, 0xE841, 0x9430, + 0xE842, 0x9431, 0xE843, 0x9432, 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, + 0x9435, 0xE847, 0x9436, 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, + 0xE84B, 0x943A, 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, + 0x943F, 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, + 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, 0xE858, + 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, 0xE85C, 0x944C, + 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, 0xE860, 0x9450, 0xE861, + 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, 0xE864, 0x9454, 0xE865, 0x9455, + 0xE866, 0x9456, 0xE867, 0x9457, 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, + 0x945A, 0xE86B, 0x945B, 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, + 0xE86F, 0x945F, 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, + 0x9463, 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, 0xE87C, + 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, 0xE881, 0x9471, + 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, 0xE885, 0x9475, 0xE886, + 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, 0xE889, 0x9479, 0xE88A, 0x947A, + 0xE88B, 0x947B, 0xE88C, 0x947C, 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, + 0x947F, 0xE890, 0x9480, 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, + 0xE894, 0x9484, 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, + 0x94C7, 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, + 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, 0xE8A1, + 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, 0xE8A5, 0x7457, + 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, 0xE8A9, 0x746D, 0xE8AA, + 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, 0xE8AD, 0x7480, 0xE8AE, 0x7481, + 0xE8AF, 0x7487, 0xE8B0, 0x748B, 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, + 0x74A9, 0xE8B4, 0x7490, 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, + 0xE8B8, 0x97EA, 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, + 0x6753, 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, 0xE8C5, + 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, 0xE8C9, 0x67AD, + 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, 0xE8CD, 0x67F0, 0xE8CE, + 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, + 0xE8D3, 0x680C, 0xE8D4, 0x67D9, 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, + 0x67B3, 0xE8D8, 0x67DD, 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, + 0xE8DC, 0x67E2, 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, + 0x6832, 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, + 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, 0xE8E9, + 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, 0xE8ED, 0x6867, + 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, 0xE8F1, 0x6849, 0xE8F2, + 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, 0xE8F5, 0x6874, 0xE8F6, 0x6877, + 0xE8F7, 0x6893, 0xE8F8, 0x686B, 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, + 0x68FC, 0xE8FC, 0x691F, 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, + 0xE941, 0x9533, 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, + 0x954B, 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, 0xE94E, + 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, 0xE952, 0x957D, + 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, 0xE956, 0x9582, 0xE957, + 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, 0xE95A, 0x9586, 0xE95B, 0x9587, + 0xE95C, 0x9588, 0xE95D, 0x9589, 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, + 0x958C, 0xE961, 0x958D, 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, + 0xE965, 0x9591, 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, + 0x9595, 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, + 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, 0xE972, + 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, 0xE976, 0x95A2, + 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, 0xE97A, 0x95A6, 0xE97B, + 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, 0xE97E, 0x95AA, 0xE980, 0x95AB, + 0xE981, 0x95AC, 0xE982, 0x95AD, 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, + 0x95B0, 0xE986, 0x95B1, 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, + 0xE98A, 0x95B5, 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, + 0x95B9, 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, 0xE997, + 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, 0xE99B, 0x95C6, + 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, 0xE99F, 0x95CA, 0xE9A0, + 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, 0xE9A3, 0x690B, 0xE9A4, 0x6901, + 0xE9A5, 0x6957, 0xE9A6, 0x68E3, 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, + 0x6939, 0xE9AA, 0x6960, 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, + 0xE9AE, 0x696B, 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, + 0x6934, 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, + 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, 0xE9BB, + 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, 0xE9BF, 0x69AD, + 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, 0xE9C3, 0x69CA, 0xE9C4, + 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, 0xE9C7, 0x698D, 0xE9C8, 0x69FF, + 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, + 0x6A65, 0xE9CE, 0x69F2, 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, + 0xE9D2, 0x6A50, 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, + 0x6A79, 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, 0xE9DF, + 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, 0xE9E3, 0x6B82, + 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, 0xE9E7, 0x6B93, 0xE9E8, + 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, + 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, + 0x8F73, 0xE9F2, 0x8F75, 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, + 0xE9F6, 0x8F79, 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, + 0x8F81, 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, + 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, 0xEA44, + 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, 0xEA48, 0x95D4, + 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, 0xEA4C, 0x95D8, 0xEA4D, + 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, 0xEA50, 0x95DC, 0xEA51, 0x95DD, + 0xEA52, 0x95DE, 0xEA53, 0x95DF, 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, + 0x95E2, 0xEA57, 0x95E3, 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, + 0xEA5B, 0x95E7, 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, + 0x9613, 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, 0xEA68, + 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, 0xEA6C, 0x962C, + 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, 0xEA70, 0x9637, 0xEA71, + 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, 0xEA74, 0x963E, 0xEA75, 0x9641, + 0xEA76, 0x9643, 0xEA77, 0x964A, 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, + 0x9651, 0xEA7B, 0x9652, 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, + 0xEA80, 0x9658, 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, + 0x965D, 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, + 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, 0xEA8D, + 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, 0xEA91, 0x9678, + 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, 0xEA95, 0x967C, 0xEA96, + 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, 0xEA99, 0x9680, 0xEA9A, 0x9681, + 0xEA9B, 0x9682, 0xEA9C, 0x9683, 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, + 0x9689, 0xEAA0, 0x968A, 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, + 0xEAA4, 0x8F98, 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, + 0x6217, 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, 0xEAB1, + 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, 0xEAB5, 0x7511, + 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, 0xEAB9, 0x65EF, 0xEABA, + 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, 0xEABD, 0x6772, 0xEABE, 0x6603, + 0xEABF, 0x6615, 0xEAC0, 0x6600, 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, + 0x661D, 0xEAC4, 0x6634, 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, + 0xEAC8, 0x8006, 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, + 0x664F, 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, + 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, 0xEAD5, + 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, 0xEAD9, 0x66E9, + 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, 0xEADD, 0x8D3B, 0xEADE, + 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, + 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, + 0x8D59, 0xEAE8, 0x89C7, 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, + 0xEAEC, 0x89CE, 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, + 0x726E, 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, 0xEAF9, + 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, 0xEAFD, 0x6332, + 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, 0xEB42, 0x9691, 0xEB43, + 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, 0xEB46, 0x9696, 0xEB47, 0x969A, + 0xEB48, 0x969B, 0xEB49, 0x969D, 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, + 0x96A0, 0xEB4D, 0x96A1, 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, + 0xEB51, 0x96A5, 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, + 0x96AA, 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, + 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, 0xEB5E, + 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, 0xEB62, 0x96BB, + 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, 0xEB66, 0x96C8, 0xEB67, + 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, + 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, + 0x96D9, 0xEB71, 0x96DA, 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, + 0xEB75, 0x96DE, 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, + 0x96E3, 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, 0xEB83, + 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, 0xEB87, 0x96F5, + 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, 0xEB8B, 0x96FC, 0xEB8C, + 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, 0xEB8F, 0x9703, 0xEB90, 0x9705, + 0xEB91, 0x970A, 0xEB92, 0x970B, 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, + 0x9711, 0xEB96, 0x9712, 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, + 0xEB9A, 0x9718, 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, + 0x971D, 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, + 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, 0xEBA7, + 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, 0xEBAB, 0x6C06, + 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, 0xEBAF, 0x6C19, 0xEBB0, + 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, + 0xEBB5, 0x6C32, 0xEBB6, 0x6535, 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, + 0x724D, 0xEBBA, 0x7252, 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, + 0xEBBE, 0x5216, 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, + 0x80BC, 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, 0xEBCB, + 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, 0xEBCF, 0x80C2, + 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, 0xEBD3, 0x80D7, 0xEBD4, + 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, + 0xEBD9, 0x80ED, 0xEBDA, 0x810D, 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, + 0x80FC, 0xEBDE, 0x6715, 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, + 0xEBE2, 0x811E, 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, + 0x8148, 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, + 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, 0xEBEF, + 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, 0xEBF3, 0x584D, + 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, 0xEBF7, 0x8191, 0xEBF8, + 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, 0xEBFB, 0x81CC, 0xEBFC, 0x6726, + 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, + 0x9723, 0xEC43, 0x9724, 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, + 0xEC47, 0x9728, 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, + 0x972E, 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, 0xEC54, + 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, 0xEC58, 0x9740, + 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, 0xEC5C, 0x9744, 0xEC5D, + 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, 0xEC60, 0x9748, 0xEC61, 0x9749, + 0xEC62, 0x974A, 0xEC63, 0x974B, 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, + 0x974E, 0xEC67, 0x974F, 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, + 0xEC6B, 0x9755, 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, + 0x975C, 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, + 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, 0xEC78, + 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, 0xEC7C, 0x976F, + 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, 0xEC81, 0x9775, 0xEC82, + 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, 0xEC85, 0x977A, 0xEC86, 0x977B, + 0xEC87, 0x977D, 0xEC88, 0x977E, 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, + 0x9781, 0xEC8C, 0x9782, 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, + 0xEC90, 0x9787, 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, + 0x978C, 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, 0xEC9D, + 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, 0xECA1, 0x81C1, + 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, 0xECA5, 0x6B39, 0xECA6, + 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, 0xECA9, 0x98D1, 0xECAA, 0x98D2, + 0xECAB, 0x98D3, 0xECAC, 0x98D5, 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, + 0x6BB3, 0xECB0, 0x5F40, 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, + 0xECB4, 0x9F51, 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, + 0x65C4, 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, + 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, 0xECC1, + 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, 0xECC5, 0x70AB, + 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, 0xECC9, 0x7110, 0xECCA, + 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, 0xECCD, 0x7131, 0xECCE, 0x7173, + 0xECCF, 0x715C, 0xECD0, 0x7168, 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, + 0x714A, 0xECD4, 0x7178, 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, + 0xECD8, 0x71B5, 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, + 0x71D4, 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, 0xECE5, + 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, 0xECE9, 0x6249, + 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, 0xECED, 0x7949, 0xECEE, + 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, 0xECF1, 0x795A, 0xECF2, 0x7962, + 0xECF3, 0x7957, 0xECF4, 0x7960, 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, + 0x797A, 0xECF8, 0x7985, 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, + 0xECFC, 0x79B3, 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, + 0x979F, 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, + 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, 0xED4A, + 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, 0xED4E, 0x97B1, + 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, 0xED52, 0x97B7, 0xED53, + 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, 0xED56, 0x97BB, 0xED57, 0x97BC, + 0xED58, 0x97BD, 0xED59, 0x97BE, 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, + 0x97C1, 0xED5D, 0x97C2, 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, + 0xED61, 0x97C6, 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, + 0x97CA, 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, 0xED6E, + 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, 0xED72, 0x97D7, + 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, 0xED76, 0x97DB, 0xED77, + 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, 0xED7A, 0x97DF, 0xED7B, 0x97E0, + 0xED7C, 0x97E1, 0xED7D, 0x97E2, 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, + 0x97E5, 0xED82, 0x97E8, 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, + 0xED86, 0x97F1, 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, + 0x97F8, 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, + 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, 0xED93, + 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, 0xED97, 0x9805, + 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, 0xED9B, 0x9809, 0xED9C, + 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, 0xED9F, 0x980D, 0xEDA0, 0x980E, + 0xEDA1, 0x603C, 0xEDA2, 0x605D, 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, + 0x6041, 0xEDA6, 0x6059, 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, + 0xEDAA, 0x610D, 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, + 0x61CB, 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, 0xEDB7, + 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, 0xEDBB, 0x7818, + 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, 0xEDBF, 0x781C, 0xEDC0, + 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, 0xEDC3, 0x783B, 0xEDC4, 0x781F, + 0xEDC5, 0x783C, 0xEDC6, 0x7825, 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, + 0x7829, 0xEDCA, 0x784E, 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, + 0xEDCE, 0x7826, 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, + 0x786A, 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, + 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, 0xEDDB, + 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, 0xEDDF, 0x78C9, + 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, 0xEDE3, 0x78F4, 0xEDE4, + 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, + 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, + 0x7704, 0xEDEE, 0x770D, 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, + 0xEDF2, 0x771A, 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, + 0x7726, 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, 0xEE40, + 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, 0xEE44, 0x9813, + 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, 0xEE48, 0x9817, 0xEE49, + 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, 0xEE4C, 0x981B, 0xEE4D, 0x981C, + 0xEE4E, 0x981D, 0xEE4F, 0x981E, 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, + 0x9821, 0xEE53, 0x9822, 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, + 0xEE57, 0x9826, 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, + 0x982A, 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, + 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, 0xEE64, + 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, 0xEE68, 0x9837, + 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, 0xEE6C, 0x983B, 0xEE6D, + 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, 0xEE70, 0x983F, 0xEE71, 0x9840, + 0xEE72, 0x9841, 0xEE73, 0x9842, 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, + 0x9845, 0xEE77, 0x9846, 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, + 0xEE7B, 0x984A, 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, + 0x984E, 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, 0xEE89, + 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, 0xEE8D, 0x985B, + 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, 0xEE91, 0x985F, 0xEE92, + 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, 0xEE95, 0x9863, 0xEE96, 0x9864, + 0xEE97, 0x9865, 0xEE98, 0x9866, 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, + 0x9869, 0xEE9C, 0x986A, 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, + 0xEEA0, 0x986E, 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, + 0x778D, 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, + 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, 0xEEAD, + 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, 0xEEB1, 0x754B, + 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, 0xEEB5, 0x7579, 0xEEB6, + 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, + 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, + 0x7F81, 0xEEC0, 0x7F7E, 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, + 0xEEC4, 0x9485, 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, + 0x948A, 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, 0xEED1, + 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, 0xEED5, 0x94AB, + 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, 0xEED9, 0x94AF, 0xEEDA, + 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, + 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, + 0x94BD, 0xEEE4, 0x94BF, 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, + 0xEEE8, 0x94CA, 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, + 0x94CE, 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, + 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, 0xEEF5, + 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, 0xEEF9, 0x94E2, + 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, 0xEEFD, 0x94E8, 0xEEFE, + 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, 0xEF42, 0x9871, 0xEF43, 0x9872, + 0xEF44, 0x9873, 0xEF45, 0x9874, 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, + 0x9892, 0xEF49, 0x9895, 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, + 0xEF4D, 0x98A9, 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, + 0x98AD, 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, 0xEF5A, + 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, 0xEF5E, 0x98BA, + 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, 0xEF62, 0x98BE, 0xEF63, + 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, 0xEF66, 0x98C2, 0xEF67, 0x98C3, + 0xEF68, 0x98C4, 0xEF69, 0x98C5, 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, + 0x98C8, 0xEF6D, 0x98C9, 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, + 0xEF71, 0x98CD, 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, + 0x98D6, 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, + 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, 0xEF7E, + 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, 0xEF83, 0x98EA, + 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, 0xEF87, 0x98EE, 0xEF88, + 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, + 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, + 0x98F8, 0xEF92, 0x98F9, 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, + 0xEF96, 0x98FD, 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, + 0x9901, 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, 0xEFA3, + 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, 0xEFA7, 0x94F5, + 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, 0xEFAB, 0x94FD, 0xEFAC, + 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, 0xEFAF, 0x9506, 0xEFB0, 0x9507, + 0xEFB1, 0x9509, 0xEFB2, 0x950A, 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, + 0x950F, 0xEFB6, 0x9512, 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, + 0xEFBA, 0x9516, 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, + 0x951E, 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, + 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, 0xEFC7, + 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, 0xEFCB, 0x953C, + 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, 0xEFCF, 0x9535, 0xEFD0, + 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, 0xEFD3, 0x9549, 0xEFD4, 0x954C, + 0xEFD5, 0x954E, 0xEFD6, 0x954F, 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, + 0x9554, 0xEFDA, 0x9556, 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, + 0xEFDE, 0x955B, 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, + 0x9561, 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, 0xEFEB, + 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, 0xEFEF, 0x9572, + 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, 0xEFF3, 0x77EC, 0xEFF4, + 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, + 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, + 0x7A1E, 0xEFFE, 0x7A14, 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, + 0xF043, 0x990B, 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, + 0x9911, 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, + 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, 0xF050, + 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, 0xF054, 0x991E, + 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, 0xF058, 0x9922, 0xF059, + 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, 0xF05C, 0x9926, 0xF05D, 0x9927, + 0xF05E, 0x9928, 0xF05F, 0x9929, 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, + 0x992C, 0xF063, 0x992D, 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, + 0xF067, 0x9932, 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, + 0x9936, 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, 0xF074, + 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, 0xF078, 0x9943, + 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, 0xF07C, 0x9947, 0xF07D, + 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, 0xF081, 0x994B, 0xF082, 0x994C, + 0xF083, 0x994D, 0xF084, 0x994E, 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, + 0x9951, 0xF088, 0x9952, 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, + 0xF08C, 0x9958, 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, + 0x995C, 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, + 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, 0xF099, + 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, 0xF09D, 0x997E, + 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, 0xF0A1, 0x7A39, 0xF0A2, + 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, + 0xF0A7, 0x7688, 0xF0A8, 0x768E, 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, + 0x76A4, 0xF0AC, 0x74DE, 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, + 0xF0B0, 0x9E22, 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, + 0x9E2B, 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, 0xF0BD, + 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, 0xF0C1, 0x9E46, + 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, 0xF0C5, 0x9E4B, 0xF0C6, + 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, + 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, + 0x9E63, 0xF0D0, 0x9E66, 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, + 0xF0D4, 0x9E6A, 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, + 0x9E6D, 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, + 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, 0xF0E1, + 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, 0xF0E5, 0x75B1, + 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, 0xF0E9, 0x75D6, 0xF0EA, + 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, + 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, + 0x75FC, 0xF0F4, 0x75FF, 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, + 0xF0F8, 0x760C, 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, + 0x7618, 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, 0xF146, + 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, 0xF14A, 0x99A2, + 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, 0xF14E, 0x99A7, 0xF14F, + 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, 0xF152, 0x99AC, 0xF153, 0x99AD, + 0xF154, 0x99AE, 0xF155, 0x99AF, 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, + 0x99B2, 0xF159, 0x99B3, 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, + 0xF15D, 0x99B7, 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, + 0x99BB, 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, + 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, 0xF16A, + 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, 0xF16E, 0x99C8, + 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, 0xF172, 0x99CC, 0xF173, + 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, 0xF176, 0x99D0, 0xF177, 0x99D1, + 0xF178, 0x99D2, 0xF179, 0x99D3, 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, + 0x99D6, 0xF17D, 0x99D7, 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, + 0xF182, 0x99DB, 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, + 0x99DF, 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, 0xF18F, + 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, 0xF193, 0x99EC, + 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, 0xF197, 0x99F0, 0xF198, + 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, 0xF19B, 0x99F4, 0xF19C, 0x99F5, + 0xF19D, 0x99F6, 0xF19E, 0x99F7, 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, + 0x761B, 0xF1A2, 0x763C, 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, + 0xF1A6, 0x762D, 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, + 0x7643, 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, + 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, 0xF1B3, + 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, 0xF1B7, 0x7A79, + 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, 0xF1BB, 0x7A95, 0xF1BC, + 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, + 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, + 0x887D, 0xF1C6, 0x887F, 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, + 0xF1CA, 0x88B7, 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, + 0x88CE, 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, 0xF1D7, + 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, 0xF1DB, 0x890A, + 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, 0xF1DF, 0x8941, 0xF1E0, + 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, + 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, + 0x8016, 0xF1EA, 0x801C, 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, + 0xF1EE, 0x8026, 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, + 0x8031, 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, + 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, 0xF1FB, + 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, 0xF240, 0x99FA, + 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, 0xF244, 0x99FE, 0xF245, + 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, 0xF248, 0x9A02, 0xF249, 0x9A03, + 0xF24A, 0x9A04, 0xF24B, 0x9A05, 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, + 0x9A08, 0xF24F, 0x9A09, 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, + 0xF253, 0x9A0D, 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, + 0x9A11, 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, 0xF260, + 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, 0xF264, 0x9A1E, + 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, 0xF268, 0x9A22, 0xF269, + 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, 0xF26C, 0x9A26, 0xF26D, 0x9A27, + 0xF26E, 0x9A28, 0xF26F, 0x9A29, 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, + 0x9A2C, 0xF273, 0x9A2D, 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, + 0xF277, 0x9A31, 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, + 0x9A35, 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, + 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, 0xF285, + 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, 0xF289, 0x9A42, + 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, 0xF28D, 0x9A46, 0xF28E, + 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, 0xF291, 0x9A4A, 0xF292, 0x9A4B, + 0xF293, 0x9A4C, 0xF294, 0x9A4D, 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, + 0x9A50, 0xF298, 0x9A51, 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, + 0xF29C, 0x9A55, 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, + 0x9A59, 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, 0xF2A9, + 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, 0xF2AD, 0x98A6, + 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, 0xF2B1, 0x866E, 0xF2B2, + 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, 0xF2B5, 0x867B, 0xF2B6, 0x86A8, + 0xF2B7, 0x868D, 0xF2B8, 0x868B, 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, + 0x86A7, 0xF2BC, 0x86A3, 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, + 0xF2C0, 0x86B6, 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, + 0x86B0, 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, + 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, 0xF2CD, + 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, 0xF2D1, 0x8713, + 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, 0xF2D5, 0x86D8, 0xF2D6, + 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, 0xF2D9, 0x86F8, 0xF2DA, 0x8708, + 0xF2DB, 0x870A, 0xF2DC, 0x870D, 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, + 0x873B, 0xF2E0, 0x871E, 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, + 0xF2E4, 0x873E, 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, + 0x8729, 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, 0xF2F1, + 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, 0xF2F5, 0x8753, + 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, 0xF2F9, 0x8759, 0xF2FA, + 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, + 0xF340, 0x9A5A, 0xF341, 0x9A5B, 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, + 0x9A5E, 0xF345, 0x9A5F, 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, + 0xF349, 0x9A63, 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, + 0x9A67, 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, + 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, 0xF356, + 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, 0xF35A, 0x9AA6, + 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, 0xF35E, 0x9AAC, 0xF35F, + 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, 0xF362, 0x9AB2, 0xF363, 0x9AB3, + 0xF364, 0x9AB4, 0xF365, 0x9AB5, 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, + 0x9ABD, 0xF369, 0x9ABE, 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, + 0xF36D, 0x9AC6, 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, + 0x9ACA, 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, 0xF37A, + 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, 0xF37E, 0x9ADC, + 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, 0xF383, 0x9AE2, 0xF384, + 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, 0xF387, 0x9AE7, 0xF388, 0x9AE8, + 0xF389, 0x9AE9, 0xF38A, 0x9AEA, 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, + 0x9AF0, 0xF38E, 0x9AF1, 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, + 0xF392, 0x9AF5, 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, + 0x9AFA, 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, + 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, 0xF39F, + 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, 0xF3A3, 0x8785, + 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, 0xF3A7, 0x87AB, 0xF3A8, + 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, + 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, + 0x87CA, 0xF3B2, 0x87DB, 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, + 0xF3B6, 0x8816, 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, + 0x881B, 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, 0xF3C3, + 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, 0xF3C7, 0x7B04, + 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, 0xF3CB, 0x7B0F, 0xF3CC, + 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, + 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, + 0x7B33, 0xF3D6, 0x7B3E, 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, + 0xF3DA, 0x7B45, 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, + 0x7B60, 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, + 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, 0xF3E7, + 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, 0xF3EB, 0x7B85, + 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, 0xF3EF, 0x7BAB, 0xF3F0, + 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, + 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, + 0x7C0C, 0xF3FA, 0x7BFE, 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, + 0xF3FE, 0x7C0B, 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, + 0x9B0B, 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, 0xF44C, + 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, 0xF450, 0x9B1A, + 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, 0xF454, 0x9B1E, 0xF455, + 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, 0xF458, 0x9B24, 0xF459, 0x9B25, + 0xF45A, 0x9B26, 0xF45B, 0x9B27, 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, + 0x9B2A, 0xF45F, 0x9B2B, 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, + 0xF463, 0x9B30, 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, + 0x9B35, 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, + 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, 0xF470, + 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, 0xF474, 0x9B4C, + 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, 0xF478, 0x9B53, 0xF479, + 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, 0xF47C, 0x9B58, 0xF47D, 0x9B59, + 0xF47E, 0x9B5A, 0xF480, 0x9B5B, 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, + 0x9B5E, 0xF484, 0x9B5F, 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, + 0xF488, 0x9B63, 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, + 0x9B67, 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, 0xF495, + 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, 0xF499, 0x9B74, + 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, 0xF49D, 0x9B78, 0xF49E, + 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, + 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, + 0x81FE, 0xF4A8, 0x8201, 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, + 0xF4AC, 0x8844, 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, + 0x822D, 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, + 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, 0xF4B9, + 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, 0xF4BD, 0x825A, + 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, 0xF4C1, 0x8885, 0xF4C2, + 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, + 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, + 0x7FB2, 0xF4CC, 0x7C7C, 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, + 0xF4D0, 0x7C9C, 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, + 0x7CBC, 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, 0xF4DD, + 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, 0xF4E1, 0x7FCE, + 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, 0xF4E5, 0x7FE6, 0xF4E6, + 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, + 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, + 0x9EB8, 0xF4F0, 0x9EB4, 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, + 0xF4F4, 0x8D91, 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, + 0x8C47, 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, + 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, 0xF542, + 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, 0xF546, 0x9B82, + 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, 0xF54A, 0x9B86, 0xF54B, + 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, + 0xF550, 0x9B8C, 0xF551, 0x9B8D, 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, + 0x9B90, 0xF555, 0x9B91, 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, + 0xF559, 0x9B95, 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, + 0x9B99, 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, 0xF566, + 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, 0xF56A, 0x9BA6, + 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, 0xF56E, 0x9BAA, 0xF56F, + 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, 0xF572, 0x9BAE, 0xF573, 0x9BAF, + 0xF574, 0x9BB0, 0xF575, 0x9BB1, 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, + 0x9BB4, 0xF579, 0x9BB5, 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, + 0xF57D, 0x9BB9, 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, + 0x9BBD, 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, + 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, 0xF58B, + 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, 0xF58F, 0x9BCA, + 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, 0xF593, 0x9BCE, 0xF594, + 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, 0xF597, 0x9BD2, 0xF598, 0x9BD3, + 0xF599, 0x9BD4, 0xF59A, 0x9BD5, 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, + 0x9BD8, 0xF59E, 0x9BD9, 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, + 0xF5A2, 0x9161, 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, + 0x917D, 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, 0xF5AF, + 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, 0xF5B3, 0x91AD, + 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, 0xF5B7, 0x91B4, 0xF5B8, + 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, + 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, + 0x8DBF, 0xF5C2, 0x8DBC, 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, + 0xF5C6, 0x8DD7, 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, + 0x8DCF, 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, + 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, 0xF5D3, + 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, 0xF5D7, 0x8E1D, + 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, 0xF5DB, 0x8E23, 0xF5DC, + 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, + 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, + 0x8E42, 0xF5E6, 0x8E51, 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, + 0xF5EA, 0x8E76, 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, + 0x8E85, 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, 0xF5F7, + 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, 0xF5FB, 0x89D6, + 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, 0xF640, 0x9BDC, 0xF641, + 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, 0xF644, 0x9BE0, 0xF645, 0x9BE1, + 0xF646, 0x9BE2, 0xF647, 0x9BE3, 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, + 0x9BE6, 0xF64B, 0x9BE7, 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, + 0xF64F, 0x9BEB, 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, + 0x9BEF, 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, + 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, 0xF65C, + 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, 0xF660, 0x9BFC, + 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, 0xF664, 0x9C00, 0xF665, + 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, 0xF668, 0x9C04, 0xF669, 0x9C05, + 0xF66A, 0x9C06, 0xF66B, 0x9C07, 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, + 0x9C0A, 0xF66F, 0x9C0B, 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, + 0xF673, 0x9C0F, 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, + 0x9C13, 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, 0xF681, + 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, 0xF685, 0x9C20, + 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, 0xF689, 0x9C24, 0xF68A, + 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, 0xF68D, 0x9C28, 0xF68E, 0x9C29, + 0xF68F, 0x9C2A, 0xF690, 0x9C2B, 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, + 0x9C2E, 0xF694, 0x9C2F, 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, + 0xF698, 0x9C33, 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, + 0x9C37, 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, + 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, 0xF6A5, + 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, 0xF6A9, 0x96EF, + 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, 0xF6AD, 0x970F, 0xF6AE, + 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, 0xF6B1, 0x9730, 0xF6B2, 0x973E, + 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, + 0x9F87, 0xF6B8, 0x9F88, 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, + 0xF6BC, 0x9EFE, 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, + 0x96BC, 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, 0xF6C9, + 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, 0xF6CD, 0x943E, + 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, 0xF6D1, 0x9C85, 0xF6D2, + 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, + 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, + 0x9C94, 0xF6DC, 0x9C95, 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, + 0xF6E0, 0x9C9F, 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, + 0x9CA3, 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, + 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, 0xF6ED, + 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, 0xF6F1, 0x9CB4, + 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, 0xF6F5, 0x9CBA, 0xF6F6, + 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, + 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, + 0x9C3C, 0xF741, 0x9C3D, 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, + 0xF745, 0x9C41, 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, + 0x9C45, 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, 0xF752, + 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, 0xF756, 0x9C52, + 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, 0xF75A, 0x9C56, 0xF75B, + 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, + 0xF760, 0x9C5C, 0xF761, 0x9C5D, 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, + 0x9C60, 0xF765, 0x9C61, 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, + 0xF769, 0x9C65, 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, + 0x9C69, 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, + 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, 0xF776, + 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, 0xF77A, 0x9C76, + 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, 0xF77E, 0x9C7A, 0xF780, + 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, 0xF783, 0x9C80, 0xF784, 0x9C83, + 0xF785, 0x9C84, 0xF786, 0x9C89, 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, + 0x9C8F, 0xF78A, 0x9C93, 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, + 0xF78E, 0x9C99, 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, + 0x9CAF, 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, 0xF79B, + 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, 0xF79F, 0x9CE0, + 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, 0xF7A3, 0x9CCE, 0xF7A4, + 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, + 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, + 0x9CDD, 0xF7AE, 0x9CDF, 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, + 0xF7B2, 0x9791, 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, + 0x97AB, 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, + 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, 0xF7BF, + 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, 0xF7C3, 0x9AC5, + 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, 0xF7C7, 0x9AD1, 0xF7C8, + 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, + 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, + 0x992E, 0xF7D2, 0x9955, 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, + 0xF7D6, 0x9AE6, 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, + 0x9AED, 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, 0xF7E3, + 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, 0xF7E7, 0x9E8B, + 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, 0xF7EB, 0x9E9F, 0xF7EC, + 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, + 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, + 0x9EEA, 0xF7F6, 0x9EEF, 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, + 0xF7FA, 0x9F39, 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, + 0x9F44, 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, + 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, 0xF848, + 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, 0xF84C, 0x9CEF, + 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, 0xF850, 0x9CF3, 0xF851, + 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, 0xF854, 0x9CF7, 0xF855, 0x9CF8, + 0xF856, 0x9CF9, 0xF857, 0x9CFA, 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, + 0x9CFD, 0xF85B, 0x9CFE, 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, + 0xF85F, 0x9D02, 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, + 0x9D06, 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, 0xF86C, + 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, 0xF870, 0x9D13, + 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, 0xF874, 0x9D17, 0xF875, + 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, 0xF878, 0x9D1B, 0xF879, 0x9D1C, + 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, + 0x9D21, 0xF880, 0x9D22, 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, + 0xF884, 0x9D26, 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, + 0x9D2A, 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, + 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, 0xF891, + 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, 0xF895, 0x9D37, + 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, 0xF899, 0x9D3B, 0xF89A, + 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, 0xF89D, 0x9D3F, 0xF89E, 0x9D40, + 0xF89F, 0x9D41, 0xF8A0, 0x9D42, 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, + 0x9D45, 0xF943, 0x9D46, 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, + 0xF947, 0x9D4A, 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, + 0x9D4E, 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, 0xF954, + 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, 0xF958, 0x9D5B, + 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, 0xF95C, 0x9D5F, 0xF95D, + 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, 0xF960, 0x9D63, 0xF961, 0x9D64, + 0xF962, 0x9D65, 0xF963, 0x9D66, 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, + 0x9D69, 0xF967, 0x9D6A, 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, + 0xF96B, 0x9D6E, 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, + 0x9D72, 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, + 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, 0xF978, + 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, 0xF97C, 0x9D7F, + 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, 0xF981, 0x9D83, 0xF982, + 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, 0xF985, 0x9D87, 0xF986, 0x9D88, + 0xF987, 0x9D89, 0xF988, 0x9D8A, 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, + 0x9D8D, 0xF98C, 0x9D8E, 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, + 0xF990, 0x9D92, 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, + 0x9D96, 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, 0xF99D, + 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, 0xFA40, 0x9DA3, + 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, 0xFA44, 0x9DA7, 0xFA45, + 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, + 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, + 0x9DB1, 0xFA4F, 0x9DB2, 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, + 0xFA53, 0x9DB6, 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, + 0x9DBA, 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, + 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, 0xFA60, + 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, 0xFA64, 0x9DC7, + 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, 0xFA68, 0x9DCB, 0xFA69, + 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, + 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, + 0x9DD5, 0xFA73, 0x9DD6, 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, + 0xFA77, 0x9DDA, 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, + 0x9DDE, 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, 0xFA85, + 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, 0xFA89, 0x9DEB, + 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, 0xFA8D, 0x9DEF, 0xFA8E, + 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, + 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, + 0x9DF9, 0xFA98, 0x9DFA, 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, + 0xFA9C, 0x9DFE, 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, + 0x9E02, 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, + 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, 0xFB48, + 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, 0xFB4C, 0x9E0F, + 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, 0xFB50, 0x9E13, 0xFB51, + 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, 0xFB54, 0x9E17, 0xFB55, 0x9E18, + 0xFB56, 0x9E19, 0xFB57, 0x9E1A, 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, + 0x9E1D, 0xFB5B, 0x9E1E, 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, + 0xFB5F, 0x9E30, 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, + 0x9E40, 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, 0xFB6C, + 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, 0xFB70, 0x9E65, + 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, 0xFB74, 0x9E74, 0xFB75, + 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, 0xFB78, 0x9E78, 0xFB79, 0x9E79, + 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, + 0x9E80, 0xFB80, 0x9E81, 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, + 0xFB84, 0x9E86, 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, + 0x9E8D, 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, + 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, 0xFB91, + 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, 0xFB95, 0x9E9C, + 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, 0xFB99, 0x9EA2, 0xFB9A, + 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, + 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, + 0x9EAD, 0xFC43, 0x9EAE, 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, + 0xFC47, 0x9EB2, 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, + 0x9EB7, 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, 0xFC54, + 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, 0xFC58, 0x9ECA, + 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, 0xFC5C, 0x9ED2, 0xFC5D, + 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, + 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, + 0x9EE4, 0xFC67, 0x9EE6, 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, + 0xFC6B, 0x9EED, 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, + 0x9EF2, 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, + 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, 0xFC78, + 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, 0xFC7C, 0x9F03, + 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, 0xFC81, 0x9F07, 0xFC82, + 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, + 0xFC87, 0x9F11, 0xFC88, 0x9F12, 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, + 0x9F16, 0xFC8C, 0x9F18, 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, + 0xFC90, 0x9F1D, 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, + 0x9F23, 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, 0xFC9D, + 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, 0xFD40, 0x9F32, + 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, 0xFD44, 0x9F36, 0xFD45, + 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, 0xFD48, 0x9F3F, 0xFD49, 0x9F40, + 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, + 0x9F46, 0xFD4F, 0x9F47, 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, + 0xFD53, 0x9F4B, 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, + 0x9F4F, 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, + 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, 0xFD60, + 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, 0xFD64, 0x9F5E, + 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, 0xFD68, 0x9F62, 0xFD69, + 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, + 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, + 0x9F6C, 0xFD73, 0x9F6D, 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, + 0xFD77, 0x9F71, 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, + 0x9F75, 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, 0xFD85, + 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, 0xFD89, 0x9F8E, + 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, 0xFD8D, 0x9F92, 0xFD8E, + 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, 0xFD91, 0x9F96, 0xFD92, 0x9F97, + 0xFD93, 0x9F98, 0xFD94, 0x9F9C, 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, + 0x9FA1, 0xFD98, 0x9FA2, 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, + 0xFD9C, 0xF92C, 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, + 0xF9F1, 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, + 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, 0xFE48, + 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, 0xFE4C, 0xFA24, + 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, 0, 0 }; +# endif + +/// Korean +# if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0 +/// Unicode --> Korean pairs +static const WCHAR uni2oem949[] + = { 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, 0x00AA, + 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, 0x00B1, 0xA1BE, + 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, 0x00B6, 0xA2D2, 0x00B7, + 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, + 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, + 0xA8A2, 0x00D7, 0xA1BF, 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, + 0x00E6, 0xA9A1, 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, + 0xA9AD, 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, + 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, 0x0140, + 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, 0x014A, 0xA8AF, + 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, 0x0166, 0xA8AE, 0x0167, + 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, + 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, + 0xA5C2, 0x0393, 0xA5C3, 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, + 0x0397, 0xA5C7, 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, + 0xA5CB, 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, 0x03A5, + 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, 0x03A9, 0xA5D8, + 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, 0x03B4, 0xA5E4, 0x03B5, + 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, + 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, + 0xA5EE, 0x03BF, 0xA5EF, 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, + 0x03C4, 0xA5F3, 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, + 0xA5F7, 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, + 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, 0x0416, + 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, 0x041A, 0xACAC, + 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, 0x041E, 0xACB0, 0x041F, + 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, 0x0422, 0xACB4, 0x0423, 0xACB5, + 0x0424, 0xACB6, 0x0425, 0xACB7, 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, + 0xACBA, 0x0429, 0xACBB, 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, + 0x042D, 0xACBF, 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, + 0xACD2, 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, 0x043A, + 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, 0x043E, 0xACE0, + 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, 0x0442, 0xACE4, 0x0443, + 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, 0x0446, 0xACE8, 0x0447, 0xACE9, + 0x0448, 0xACEA, 0x0449, 0xACEB, 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, + 0xACEE, 0x044D, 0xACEF, 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, + 0x2015, 0xA1AA, 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, + 0xA1B1, 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, + 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, 0x2074, + 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, 0x2083, 0xA9FD, + 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, 0x2109, 0xA2B5, 0x2113, + 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, 0x2122, 0xA2E2, 0x2126, 0xA7D9, + 0x212B, 0xA1CA, 0x2153, 0xA8F7, 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, + 0xA8FC, 0x215D, 0xA8FD, 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, + 0x2162, 0xA5B2, 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, + 0xA5B6, 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, 0x2175, + 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, 0x2179, 0xA5AA, + 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, 0x2193, 0xA1E9, 0x2194, + 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, 0x2197, 0xA2D6, 0x2198, 0xA2D9, + 0x2199, 0xA2D7, 0x21D2, 0xA2A1, 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, + 0xA1D3, 0x2203, 0xA2A4, 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, + 0x220F, 0xA2B3, 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, + 0xA1C4, 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, + 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, 0x222E, + 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, 0x223D, 0xA1EF, + 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, 0x2264, 0xA1C2, 0x2265, + 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, 0x2282, 0xA1F8, 0x2283, 0xA1F9, + 0x2286, 0xA1F6, 0x2287, 0xA1F7, 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, + 0xA1D2, 0x2460, 0xA8E7, 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, + 0x2464, 0xA8EB, 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, + 0xA8EF, 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, 0x2476, + 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, 0x247A, 0xA9ED, + 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, 0x247E, 0xA9F1, 0x247F, + 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, 0x2482, 0xA9F5, 0x249C, 0xA9CD, + 0x249D, 0xA9CE, 0x249E, 0xA9CF, 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, + 0xA9D2, 0x24A2, 0xA9D3, 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, + 0x24A6, 0xA9D7, 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, + 0xA9DB, 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, + 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, 0x24B3, + 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, 0x24D1, 0xA8CE, + 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, 0x24D5, 0xA8D2, 0x24D6, + 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, + 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, + 0xA8DC, 0x24E0, 0xA8DD, 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, + 0x24E4, 0xA8E1, 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, + 0xA8E5, 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, 0x250F, + 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, 0x2513, 0xA6AF, + 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, 0x2517, 0xA6B1, 0x2518, + 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, 0x251B, 0xA6B0, 0x251C, 0xA6A7, + 0x251D, 0xA6BC, 0x251E, 0xA6C9, 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, + 0xA6CB, 0x2522, 0xA6CC, 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, + 0x2526, 0xA6CD, 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, + 0xA6D0, 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, + 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, 0x2533, + 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, 0x2537, 0xA6BA, + 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, 0x253B, 0xA6B5, 0x253C, + 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, 0x253F, 0xA6BB, 0x2540, 0xA6DB, + 0x2541, 0xA6DC, 0x2542, 0xA6C0, 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, + 0xA6DF, 0x2546, 0xA6E0, 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, + 0x254A, 0xA6E4, 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, + 0xA1E0, 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, 0x25B3, + 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, 0x25BD, 0xA1E4, + 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, 0x25C7, 0xA1DE, 0x25C8, + 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, + 0x25D1, 0xA2C5, 0x2605, 0xA1DA, 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, + 0xA2CE, 0x261C, 0xA2D0, 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, + 0x2660, 0xA2BC, 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, + 0xA2BE, 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, + 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, 0x3002, + 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, 0x300A, 0xA1B6, + 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, 0x300E, 0xA1BA, 0x300F, + 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, 0x3013, 0xA1EB, 0x3014, 0xA1B2, + 0x3015, 0xA1B3, 0x3041, 0xAAA1, 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, + 0xAAA4, 0x3045, 0xAAA5, 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, + 0x3049, 0xAAA9, 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, + 0xAAAD, 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, 0x3056, + 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, 0x305A, 0xAABA, + 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, 0x305E, 0xAABE, 0x305F, + 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, 0x3062, 0xAAC2, 0x3063, 0xAAC3, + 0x3064, 0xAAC4, 0x3065, 0xAAC5, 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, + 0xAAC8, 0x3069, 0xAAC9, 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, + 0x306D, 0xAACD, 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, + 0xAAD1, 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, + 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, 0x307A, + 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, 0x307E, 0xAADE, + 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, 0x3082, 0xAAE2, 0x3083, + 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, 0x3086, 0xAAE6, 0x3087, 0xAAE7, + 0x3088, 0xAAE8, 0x3089, 0xAAE9, 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, + 0xAAEC, 0x308D, 0xAAED, 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, + 0x3091, 0xAAF1, 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, + 0xABA2, 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, 0x30AB, + 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, 0x30AF, 0xABAF, + 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, 0x30B3, 0xABB3, 0x30B4, + 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, 0x30B7, 0xABB7, 0x30B8, 0xABB8, + 0x30B9, 0xABB9, 0x30BA, 0xABBA, 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, + 0xABBD, 0x30BE, 0xABBE, 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, + 0x30C2, 0xABC2, 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, + 0xABC6, 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, + 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, 0x30CF, + 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, 0x30D3, 0xABD3, + 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, 0x30D7, 0xABD7, 0x30D8, + 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, 0x30DB, 0xABDB, 0x30DC, 0xABDC, + 0x30DD, 0xABDD, 0x30DE, 0xABDE, 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, + 0xABE1, 0x30E2, 0xABE2, 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, + 0x30E6, 0xABE6, 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, + 0xABEA, 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, 0x30F3, + 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, 0x3131, 0xA4A1, + 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, 0x3135, 0xA4A5, 0x3136, + 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, 0x3139, 0xA4A9, 0x313A, 0xA4AA, + 0x313B, 0xA4AB, 0x313C, 0xA4AC, 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, + 0xA4AF, 0x3140, 0xA4B0, 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, + 0x3144, 0xA4B4, 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, + 0xA4B8, 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, + 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, 0x3151, + 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, 0x3155, 0xA4C5, + 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, 0x3159, 0xA4C9, 0x315A, + 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, 0x315D, 0xA4CD, 0x315E, 0xA4CE, + 0x315F, 0xA4CF, 0x3160, 0xA4D0, 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, + 0xA4D3, 0x3164, 0xA4D4, 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, + 0x3168, 0xA4D8, 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, + 0xA4DC, 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, 0x3175, + 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, 0x3179, 0xA4E9, + 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, 0x317D, 0xA4ED, 0x317E, + 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, 0x3181, 0xA4F1, 0x3182, 0xA4F2, + 0x3183, 0xA4F3, 0x3184, 0xA4F4, 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, + 0xA4F7, 0x3188, 0xA4F8, 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, + 0x318C, 0xA4FC, 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, + 0xA9B2, 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, + 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, 0x320A, + 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, 0x320E, 0xA9BF, + 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, 0x3212, 0xA9C3, 0x3213, + 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, 0x3216, 0xA9C7, 0x3217, 0xA9C8, + 0x3218, 0xA9C9, 0x3219, 0xA9CA, 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, + 0xA2DF, 0x3260, 0xA8B1, 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, + 0x3264, 0xA8B5, 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, + 0xA8B9, 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, 0x3271, + 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, 0x3275, 0xA8C6, + 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, 0x3279, 0xA8CA, 0x327A, + 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, 0x3380, 0xA7C9, 0x3381, 0xA7CA, + 0x3382, 0xA7CB, 0x3383, 0xA7CC, 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, + 0xA7BB, 0x338A, 0xA7DC, 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, + 0x338E, 0xA7B7, 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, + 0xA7D6, 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, + 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, 0x339B, + 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, 0x339F, 0xA7B1, + 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, 0x33A3, 0xA7A7, 0x33A4, + 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, + 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, + 0xA7E1, 0x33AE, 0xA7E2, 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, + 0x33B2, 0xA7C1, 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, + 0xA7C5, 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, 0x33BF, + 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, 0x33C3, 0xA7EC, + 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, 0x33C7, 0xA2E1, 0x33C8, + 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, + 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, + 0xA7EE, 0x33DD, 0xA7E9, 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, + 0x4E07, 0xD8B2, 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, + 0xF9BB, 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, + 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, 0x4E2D, + 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, 0x4E3B, 0xF1AB, + 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, 0x4E4B, 0xF1FD, 0x4E4D, + 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, 0x4E56, 0xCED2, 0x4E58, 0xE3AB, + 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, + 0xCAE1, 0x4E6D, 0xD4CC, 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, + 0x4E7E, 0xCBEB, 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, + 0xDEC0, 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, 0x4E9B, + 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, 0x4EA4, 0xCEDF, + 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, 0x4EAB, 0xFABD, 0x4EAC, + 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, + 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, + 0xD0D1, 0x4ECB, 0xCBBF, 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, + 0x4ED6, 0xF6E2, 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, + 0xD4CE, 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, + 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, 0x4EFB, + 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, 0x4F0B, 0xD0DF, + 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, 0x4F10, 0xDBE9, 0x4F11, + 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, + 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, + 0xD3A3, 0x4F47, 0xEEB7, 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, + 0x4F4F, 0xF1AC, 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, + 0xE5F9, 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, 0x4F7A, + 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, 0x4F83, 0xCAC9, + 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, 0x4F8A, 0xCEC2, 0x4F8B, + 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, + 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, + 0xFDA5, 0x4FB5, 0xF6D5, 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, + 0x4FC3, 0xF5B5, 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, + 0xF0BB, 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, + 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, 0x4FE1, + 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, 0x4FF3, 0xDBC4, + 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, 0x5002, 0xDCB1, 0x5006, + 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, 0x500D, 0xDBC3, 0x5011, 0xD9FA, + 0x5012, 0xD3EE, 0x5016, 0xFAB8, 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, + 0xF4A6, 0x501E, 0xCCCA, 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, + 0x5024, 0xF6B7, 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, + 0xE7D2, 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, 0x504F, + 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, 0x5065, 0xCBED, + 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, 0x5078, 0xF7DE, 0x5080, + 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, 0x5091, 0xCBF8, 0x5098, 0xDFA1, + 0x5099, 0xDDE1, 0x50AC, 0xF5CA, 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, + 0xEEEE, 0x50B5, 0xF3F0, 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, + 0x50C9, 0xF4D2, 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, + 0xDCD2, 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, + 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, 0x50FF, + 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, 0x5106, 0xCCCC, + 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, 0x5121, 0xD6ED, 0x512A, + 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, 0x513A, 0xD1D3, 0x513C, 0xE5F0, + 0x5140, 0xE8B4, 0x5141, 0xEBC3, 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, + 0xF5F6, 0x5146, 0xF0BC, 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, + 0x514B, 0xD0BA, 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, + 0xE4AE, 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, 0x516C, + 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, 0x5175, 0xDCB2, + 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, 0x517C, 0xCCC2, 0x5180, + 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, 0x518D, 0xEEA2, 0x5192, 0xD9B3, + 0x5195, 0xD8F4, 0x5197, 0xE9B7, 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, + 0xD8F1, 0x51AC, 0xD4CF, 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, + 0x51C4, 0xF4A2, 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, + 0xD7D0, 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, + 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, 0x51F8, + 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, 0x5200, 0xD3EF, + 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, 0x5208, 0xE7D4, 0x520A, + 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, 0x5217, 0xD6AA, 0x521D, 0xF4F8, + 0x5224, 0xF7F7, 0x5225, 0xDCAC, 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, + 0xCEBE, 0x5230, 0xD3F0, 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, + 0x5239, 0xF3CB, 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, + 0xF6CE, 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, 0x5261, + 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, 0x5272, 0xF9DC, + 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, 0x5283, 0xFCF1, 0x5287, + 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, 0x528D, 0xCBFC, 0x5291, 0xF0A5, + 0x5292, 0xCBFD, 0x529B, 0xD5F4, 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, + 0xD6AB, 0x52A4, 0xD0C2, 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, + 0x52BE, 0xFAB6, 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, + 0xE9B8, 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, + 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, 0x52DD, + 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, 0x52E3, 0xEED3, + 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, 0x52F8, 0xCFE8, 0x52FA, + 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, 0x52FF, 0xDAA8, 0x5305, 0xF8D0, + 0x5308, 0xFDD6, 0x530D, 0xF8D1, 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, + 0xDDE2, 0x5316, 0xFBF9, 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, + 0x5321, 0xCEC4, 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, + 0xF9AF, 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, 0x534A, + 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, 0x5353, 0xF6F1, + 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, 0x535C, 0xDCD4, 0x535E, + 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, 0x5368, 0xE0D9, 0x536F, 0xD9D6, + 0x5370, 0xECD4, 0x5371, 0xEACB, 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, + 0xCFE9, 0x537D, 0xF1ED, 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, + 0x5398, 0xD7D8, 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, + 0xCFF0, 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, + 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, 0x53CD, + 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, 0x53DB, 0xDAE4, + 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, 0x53E4, 0xCDAF, 0x53E5, + 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, + 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, + 0xDEC8, 0x53F3, 0xE9D3, 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, + 0x5408, 0xF9EA, 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, + 0xD9A3, 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, 0x5426, + 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, 0x5438, 0xFDE5, + 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, 0x543E, 0xE7EE, 0x5442, + 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, 0x5451, 0xF7A2, 0x5468, 0xF1B2, + 0x546A, 0xF1B1, 0x5471, 0xCDB2, 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, + 0xE3E2, 0x547C, 0xFBBC, 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, + 0x548C, 0xFBFA, 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, + 0xEDAA, 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, + 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, 0x54C8, + 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, 0x54E8, 0xF4FA, + 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, 0x54FA, 0xF8D4, 0x5504, + 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, 0x550E, 0xD7DA, 0x5510, 0xD3D0, + 0x551C, 0xD8C5, 0x552F, 0xEAE6, 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, + 0xF6E4, 0x5544, 0xF6F2, 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, + 0x5556, 0xD3BA, 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, + 0xCBD3, 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, 0x559C, + 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, 0x55AA, 0xDFC3, + 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, 0x55C5, 0xFDAB, 0x55C7, + 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, + 0x55E3, 0xDECB, 0x55E4, 0xF6B8, 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, + 0xF7A3, 0x5609, 0xCAA9, 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, + 0x5632, 0xF0BF, 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, + 0xD0EF, 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, + 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, 0x56CA, + 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, 0x56DB, 0xDECC, + 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, 0x56F9, 0xD6B7, 0x56FA, + 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, 0x5708, 0xCFEA, 0x570B, 0xCFD0, + 0x570D, 0xEACC, 0x5712, 0xEAAE, 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, + 0xD3A5, 0x571F, 0xF7CF, 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, + 0x573B, 0xD0F0, 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, + 0xDBA9, 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, 0x576E, + 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, 0x5782, 0xE1F7, + 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, 0x57A0, 0xEBD9, 0x57A2, + 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, + 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, + 0xF3F1, 0x57F4, 0xE3D0, 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, + 0x57FC, 0xD0F2, 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, + 0xF7D8, 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, + 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, 0x582F, + 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, 0x5835, 0xD3F2, + 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, 0x584F, 0xCBC3, 0x5851, + 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, 0x5858, 0xD3D2, 0x585A, 0xF5C0, + 0x585E, 0xDFDD, 0x5861, 0xEEF3, 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, + 0xF2C8, 0x5879, 0xF3D2, 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, + 0x5885, 0xDFEA, 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, + 0xF1F2, 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, 0x58C1, + 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, 0x58D1, 0xF9C9, + 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, 0x58D9, 0xCEC5, 0x58DE, + 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, 0x58EB, 0xDECD, 0x58EC, 0xECF3, + 0x58EF, 0xEDE0, 0x58F9, 0xECEC, 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, + 0xE1F8, 0x590F, 0xF9BE, 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, + 0x5919, 0xE2D4, 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, + 0xD3DE, 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, + 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, 0x5944, + 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, 0x594E, 0xD0A5, + 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, 0x5954, 0xDDC6, 0x5955, + 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, 0x5960, 0xEEF5, 0x5962, 0xDECE, + 0x5967, 0xE7F3, 0x596A, 0xF7AC, 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, + 0xE0AB, 0x596E, 0xDDC7, 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, + 0x597D, 0xFBBF, 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, + 0xECF4, 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, 0x59BB, + 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, 0x59C9, 0xEDAB, + 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, 0x59D3, 0xE0F3, 0x59D4, + 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, + 0x59E6, 0xCACD, 0x59E8, 0xECA9, 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, + 0xF9F3, 0x59F8, 0xE6C1, 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, + 0x5A03, 0xE8DF, 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, + 0xD1D6, 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, + 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, 0x5A49, + 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, 0x5A92, 0xD8DA, + 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, 0x5AC1, 0xCAAA, 0x5AC2, + 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, + 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, + 0xE0BD, 0x5B0C, 0xCEE3, 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, + 0x5B43, 0xE5BE, 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, + 0xEDA6, 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, 0x5B69, + 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, 0x5B75, 0xDDA2, + 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, 0x5B85, 0xD3EB, 0x5B87, + 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, + 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, + 0xF0F3, 0x5B98, 0xCEAF, 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, + 0x5B9C, 0xEBF1, 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, + 0xEAE9, 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, + 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, 0x5BB8, + 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, 0x5BC2, 0xEED6, + 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, 0x5BC6, 0xDACB, 0x5BC7, + 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, + 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, + 0xCDFB, 0x5BE2, 0xF6D6, 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, + 0x5BE7, 0xD2BB, 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, + 0xCEB0, 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, 0x5C07, + 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, 0x5C0B, 0xE3FC, + 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, 0x5C11, 0xE1B4, 0x5C16, + 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, + 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, + 0xD2F9, 0x5C3E, 0xDAAD, 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, + 0x5C46, 0xCCFA, 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, + 0xE3BA, 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, + 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, 0x5C6F, + 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, 0x5C91, 0xEDD4, + 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, 0x5CAC, 0xCBA2, 0x5CB1, + 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, + 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, + 0xDFC7, 0x5CE8, 0xE4B1, 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, + 0x5CF6, 0xD3F6, 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, + 0xD5CF, 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, 0x5D4B, + 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, 0x5D6C, 0xE8E3, + 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, 0x5D9D, 0xD4F1, 0x5DA0, + 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, + 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, + 0xE4DC, 0x5DDD, 0xF4B9, 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, + 0x5DE5, 0xCDEF, 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, + 0xD9E3, 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, + 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, 0x5E02, + 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, 0x5E11, 0xF7B6, + 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, 0x5E1D, 0xF0A8, 0x5E25, + 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, + 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, + 0xE4C1, 0x5E45, 0xF8EB, 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, + 0x5E5F, 0xF6BA, 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, + 0xCACE, 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, 0x5E7E, + 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, 0x5E8F, 0xDFED, + 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, 0x5E9C, 0xDDA4, 0x5EA0, + 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, + 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, + 0xEAEC, 0x5EC2, 0xDFCB, 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, + 0x5ED0, 0xCFAA, 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, + 0xEEF8, 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, + 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, 0x5EFA, + 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, 0x5F0A, 0xF8C9, + 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, 0x5F14, 0xF0C0, 0x5F15, + 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, + 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, + 0xEDE5, 0x5F3A, 0xCBAD, 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, + 0x5F4C, 0xDAAF, 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, + 0xFDC4, 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, 0x5F6D, + 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, 0x5F79, 0xE6B5, + 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, 0x5F81, 0xEFD6, 0x5F85, + 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, + 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, + 0xDBC7, 0x5F99, 0xDED5, 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, + 0x5FA8, 0xFCC7, 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, + 0xF3A3, 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, + 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, 0x5FD7, + 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, 0x5FEB, 0xF6E1, + 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, 0x600F, 0xE4E8, 0x6012, + 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, 0x601D, 0xDED6, 0x6020, 0xF7BD, + 0x6021, 0xECAE, 0x6025, 0xD0E1, 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, + 0xCED6, 0x602F, 0xCCA5, 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, + 0x604D, 0xFCC8, 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, + 0xE5BF, 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, 0x606C, + 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, 0x6085, 0xE6ED, + 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, 0x6094, 0xFCE2, 0x6096, + 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, 0x609F, 0xE7F6, 0x60A0, 0xEAED, + 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, + 0xDDE8, 0x60B3, 0xD3ED, 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, + 0x60BC, 0xD3FA, 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, + 0xFBE3, 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, + 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, 0x60F6, + 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, 0x6101, 0xE1FE, + 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, 0x610D, 0xDAC0, 0x610E, + 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, 0x611A, 0xE9D7, 0x611B, 0xE4F1, + 0x611F, 0xCAEF, 0x6127, 0xCED7, 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, + 0xCBC4, 0x613C, 0xE3E5, 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, + 0x6144, 0xD7C9, 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, + 0xF7BE, 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, 0x6163, + 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, 0x616B, 0xF0F6, + 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, 0x6177, 0xCBAF, 0x617D, + 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, 0x6182, 0xE9D8, 0x618A, 0xDDE9, + 0x618E, 0xF1F3, 0x6190, 0xD5FB, 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, + 0xFDF3, 0x6199, 0xFDF2, 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, + 0x61A9, 0xCCA8, 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, + 0xFACA, 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, + 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, 0x61CB, + 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, 0x61F7, 0xFCE3, + 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, 0x61FF, 0xEBF3, 0x6200, + 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, 0x620A, 0xD9E6, 0x620C, 0xE2F9, + 0x620D, 0xE2A1, 0x620E, 0xEBD4, 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, + 0xCCFC, 0x6216, 0xFBE4, 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, + 0x622A, 0xEFB8, 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, + 0xD3E3, 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, 0x624B, + 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, 0x626E, 0xDDCA, + 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, 0x627C, 0xE4F9, 0x627F, + 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, 0x6289, 0xCCBC, 0x628A, 0xF7EA, + 0x6291, 0xE5E4, 0x6292, 0xDFF1, 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, + 0xEFB9, 0x629B, 0xF8D8, 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, + 0x62B9, 0xD8C6, 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, + 0xD9E7, 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, + 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, 0x62D4, + 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, 0x62D9, 0xF0F0, + 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, 0x62ED, 0xE3D4, 0x62EE, + 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, + 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, + 0xE4CE, 0x6311, 0xD3FB, 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, + 0x633B, 0xE6C9, 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, + 0xF8A4, 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, 0x637A, + 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, 0x6388, 0xE2A3, + 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, 0x6396, 0xE4FA, 0x6398, + 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, + 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, + 0xF0C2, 0x63C0, 0xCAD1, 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, + 0x63D0, 0xF0AB, 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, + 0xE4C4, 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, + 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, 0x6416, + 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, 0x642C, 0xDAE6, + 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, 0x6458, 0xEED7, 0x6460, + 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, 0x6478, 0xD9B8, 0x6479, 0xD9B9, + 0x647A, 0xEFC9, 0x6488, 0xD6CE, 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, + 0xE8F5, 0x649A, 0xD2B5, 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, + 0x64AB, 0xD9E8, 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, + 0xDAD2, 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, 0x64D2, + 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, 0x64E1, 0xD3E4, + 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, 0x64E7, 0xCBE1, 0x64EC, + 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, + 0x6500, 0xDAE7, 0x6504, 0xF7CC, 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, + 0xD5FD, 0x652A, 0xCEE6, 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, + 0x6536, 0xE2A5, 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, + 0xCDF4, 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, + 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, 0x6556, + 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, 0x6563, 0xDFA4, + 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, 0x6572, 0xCDBB, 0x6574, + 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, 0x6578, 0xE2A6, 0x657E, 0xE0C0, + 0x6582, 0xD6B0, 0x6583, 0xF8CA, 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, + 0xDEB0, 0x6590, 0xDDEC, 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, + 0x659B, 0xCDD7, 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, + 0xD0C5, 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, 0x65BC, + 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, 0x65CB, 0xE0C1, + 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, 0x65D7, 0xD0FD, 0x65E0, + 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, + 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, + 0xE9D9, 0x65FA, 0xE8DA, 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, + 0x65FF, 0xE7FA, 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, + 0xFBC4, 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, + 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, 0x661E, + 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, 0x6627, 0xD8DC, + 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, 0x6630, 0xF9C0, 0x6631, + 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, 0x663A, 0xDCB6, 0x663B, 0xE4E9, + 0x6641, 0xF0C5, 0x6642, 0xE3C1, 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, + 0xF2CB, 0x664B, 0xF2CC, 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, + 0x665D, 0xF1B8, 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, + 0xFCB7, 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, 0x6674, + 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, 0x667A, 0xF2AA, + 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, 0x6689, 0xFDC7, 0x668E, + 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, 0x6696, 0xD1EC, 0x6697, 0xE4DE, + 0x6698, 0xE5C3, 0x669D, 0xD9A6, 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, + 0xEDD5, 0x66AE, 0xD9BA, 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, + 0x66B9, 0xE0E7, 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, + 0xD5F5, 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, + 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, 0x66F0, + 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, 0x66F7, 0xCAE3, + 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, 0x66FC, 0xD8BA, 0x66FE, + 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, 0x6703, 0xFCE5, 0x6708, 0xEAC5, + 0x6709, 0xEAF3, 0x670B, 0xDDDB, 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, + 0xF2F9, 0x6717, 0xD5C7, 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, + 0x671F, 0xD1A2, 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, + 0xDAB1, 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, 0x673D, + 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, 0x674F, 0xFABA, + 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, 0x6756, 0xEDE8, 0x675C, + 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, 0x676D, 0xF9F8, 0x676F, 0xDBCA, + 0x6770, 0xCBF9, 0x6771, 0xD4D4, 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, + 0xF7ED, 0x677B, 0xD2EE, 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, + 0x6789, 0xE8DB, 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, + 0xD4E2, 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, + 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, 0x67B6, + 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, 0x67C4, 0xDCB7, + 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, 0x67D2, 0xF6D3, 0x67D3, + 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, + 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, + 0xD7B3, 0x67F4, 0xE3C3, 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, + 0x67FE, 0xEFDE, 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, + 0xD7CA, 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, 0x6840, + 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, 0x6848, 0xE4D0, + 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, 0x6853, 0xFCB8, 0x6854, + 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, 0x687F, 0xCAD4, 0x6881, 0xD5D9, + 0x6885, 0xD8DE, 0x688F, 0xCDD9, 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, + 0xCCDB, 0x689D, 0xF0C9, 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, + 0x68A7, 0xE7FC, 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, + 0xCCFE, 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, + 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, 0x68CD, + 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, 0x68D8, 0xD0BE, + 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, 0x68E7, 0xEDD0, 0x68E8, + 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, + 0x6900, 0xE8CA, 0x6905, 0xEBF5, 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, + 0xF5A1, 0x6927, 0xD9A7, 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, + 0x694A, 0xE5C5, 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, + 0xCBF1, 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, 0x696B, + 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, 0x6975, 0xD0BF, + 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, 0x6995, 0xE9BE, 0x699B, + 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, + 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, + 0xCFB0, 0x69CC, 0xF7D9, 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, + 0x69EA, 0xCBC8, 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, + 0xE4C5, 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, + 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, 0x6A23, + 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, 0x6A3A, 0xFBFC, + 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, 0x6A4B, 0xCEE9, 0x6A52, + 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, + 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, + 0xEFE0, 0x6A8D, 0xE5E5, 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, + 0x6AA2, 0xCBFE, 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, + 0xD4A2, 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, 0x6B0C, + 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, 0x6B21, 0xF3AD, + 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, 0x6B3D, 0xFDE3, 0x6B3E, + 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, + 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, + 0xEFE1, 0x6B64, 0xF3AE, 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, + 0x6B72, 0xE1A8, 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, + 0xD9D1, 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, + 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, 0x6BAE, + 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, 0x6BB7, 0xEBDC, + 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, 0x6BC1, 0xFDC3, 0x6BC5, + 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, + 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, + 0xDDF1, 0x6BD8, 0xDDF2, 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, + 0x6C08, 0xEEFD, 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, + 0xD1A8, 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, 0x6C50, + 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, 0x6C5D, 0xE6A3, + 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, 0x6C68, 0xCDE7, 0x6C6A, + 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, + 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, + 0xD1AA, 0x6C83, 0xE8AA, 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, + 0x6C88, 0xF6D8, 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, + 0xD3CB, 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, + 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, 0x6CB3, + 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, 0x6CBC, 0xE1BB, + 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, 0x6CC1, 0xFCCF, 0x6CC2, + 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, + 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, + 0xF8DC, 0x6CE2, 0xF7EE, 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, + 0x6CEB, 0xFADA, 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, + 0xE7B6, 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, 0x6D27, + 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, 0x6D35, 0xE2E7, + 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, 0x6D3B, 0xFCC0, 0x6D3D, + 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, + 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, + 0xD5C8, 0x6D6C, 0xD7DF, 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, + 0x6D78, 0xF6D9, 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, + 0xCCDC, 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, + 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, 0x6DAF, + 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, 0x6DC3, 0xCFEE, + 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, 0x6DC7, 0xD1AB, 0x6DCB, + 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, + 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, + 0xD7C5, 0x6DEB, 0xEBE2, 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, + 0x6DF5, 0xE6D0, 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, + 0xF4BC, 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, 0x6E23, + 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, 0x6E2B, 0xE0DE, + 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, 0x6E32, 0xE0C2, 0x6E34, + 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, + 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, + 0xF1BE, 0x6E4D, 0xD3AC, 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, + 0x6E5C, 0xE3D7, 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, + 0xF5D3, 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, + 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, 0x6E9D, + 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, 0x6EAA, 0xCDA2, + 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, 0x6EB6, 0xE9C1, 0x6EBA, + 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, + 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, + 0xEEAB, 0x6ED4, 0xD4A5, 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, + 0x6EFE, 0xCDE3, 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, + 0xF6D4, 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, 0x6F2C, + 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, 0x6F3F, 0xEDEC, + 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, 0x6F57, 0xF2FC, 0x6F58, + 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, + 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, + 0xCFF7, 0x6F7A, 0xEDD2, 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, + 0x6F81, 0xDFBB, 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, + 0xF8B1, 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, + 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, 0x6FB1, + 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, 0x6FC0, 0xCCAD, + 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, 0x6FCA, 0xE7D8, 0x6FD5, + 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, + 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, + 0xF6FB, 0x6FF1, 0xDEB4, 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, + 0x7006, 0xD4B9, 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, + 0xF8EE, 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, 0x7023, + 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, 0x7037, 0xECCB, + 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, 0x7051, 0xE1EE, 0x7058, + 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, 0x706B, 0xFBFD, 0x7070, 0xFCE9, + 0x7078, 0xCFB6, 0x707C, 0xEDC7, 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, + 0xF6A7, 0x708E, 0xE6FA, 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, + 0x709A, 0xCEC9, 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, + 0xCBE3, 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, + 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, 0x70CF, + 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, 0x70DF, 0xE6D3, + 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, 0x7104, 0xFDB6, 0x7109, + 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, 0x711A, 0xDDCD, 0x711E, 0xD4C8, + 0x7121, 0xD9ED, 0x7126, 0xF5A5, 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, + 0xFDC8, 0x7149, 0xD6A1, 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, + 0x7150, 0xE7BC, 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, + 0xDFB0, 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, 0x7184, + 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, 0x7192, 0xFBA7, + 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, 0x71A2, 0xDCEC, 0x71AC, + 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, + 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, + 0xD6FA, 0x71D0, 0xD7F2, 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, + 0x71DF, 0xE7BD, 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, + 0xF5B7, 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, + 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, 0x721B, + 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, 0x7230, 0xEABA, + 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, 0x723A, 0xE5AC, 0x723B, + 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, 0x7240, 0xDFD1, 0x7246, 0xEDED, + 0x7247, 0xF8B8, 0x7248, 0xF7FA, 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, + 0xD4BA, 0x7259, 0xE4B3, 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, + 0x7261, 0xD9C0, 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, + 0xDFE5, 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, 0x72C0, + 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, 0x72D0, 0xFBCF, + 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, 0x72E9, 0xE2AD, 0x72F8, + 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, 0x72FD, 0xF8AC, 0x730A, 0xE7D9, + 0x7316, 0xF3E9, 0x731B, 0xD8ED, 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, + 0xE8E5, 0x7329, 0xE0FA, 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, + 0x7337, 0xEBA3, 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, + 0xDEE2, 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, + 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, 0x7378, + 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, 0x7386, 0xEDB5, + 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, 0x738E, 0xEFE9, 0x7394, + 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, 0x7398, 0xD1AC, 0x739F, 0xDAC7, + 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, + 0xD3E5, 0x73B9, 0xFADD, 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, + 0x73CA, 0xDFA6, 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, + 0xCECB, 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, 0x73E9, + 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, 0x73F9, 0xE0FB, + 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, 0x7403, 0xCFB9, 0x7405, + 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, 0x7409, 0xD7B8, 0x7413, 0xE8CD, + 0x741B, 0xF6DA, 0x7420, 0xEFA2, 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, + 0xFBD0, 0x7426, 0xD1AD, 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, + 0x742C, 0xE8CE, 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, + 0xD7FB, 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, + 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, 0x7443, + 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, 0x7457, 0xEABC, + 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, 0x745C, 0xEBA5, 0x745E, + 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, 0x7462, 0xE9C3, 0x7464, 0xE8FD, + 0x7465, 0xE8AF, 0x7468, 0xF2D3, 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, + 0xD5CB, 0x747E, 0xD0C8, 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, + 0x7489, 0xD6A2, 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, + 0xDAD7, 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, 0x74B2, + 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, 0x74BF, 0xE0C7, + 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, 0x74D4, 0xE7C2, 0x74D8, + 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, + 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, + 0xDCBA, 0x7504, 0xCCB4, 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, + 0x751A, 0xE4A4, 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, + 0xDFE7, 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, + 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, 0x7537, + 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, 0x754C, 0xCDA3, + 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, 0x7554, 0xDAED, 0x7559, + 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, 0x755D, 0xD9EF, 0x7562, 0xF9B4, + 0x7565, 0xD5D4, 0x7566, 0xFDCF, 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, + 0xECB6, 0x7575, 0xFBFE, 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, + 0x757F, 0xD1B2, 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, + 0xF9B5, 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, 0x75B3, + 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, 0x75BC, 0xD4D9, + 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, 0x75C5, 0xDCBB, 0x75C7, + 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, + 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, + 0xD3C3, 0x75F2, 0xD8A6, 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, + 0x7600, 0xE5DC, 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, + 0xF4B0, 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, + 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, 0x7652, + 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, 0x7669, 0xD4FD, + 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, 0x7678, 0xCDA4, 0x767B, + 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, 0x767E, 0xDBDD, 0x7684, 0xEEDC, + 0x7686, 0xCBCB, 0x7687, 0xFCD5, 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, + 0xFBD3, 0x76AE, 0xF9AB, 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, + 0x76C3, 0xDBCD, 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, + 0xF9EC, 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, 0x76E7, + 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, 0x76F8, 0xDFD3, + 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, 0x7704, 0xD8F8, 0x7708, + 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, 0x771E, 0xF2D8, 0x7720, 0xD8F9, + 0x7729, 0xFADF, 0x7737, 0xCFEF, 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, + 0xE4D1, 0x7740, 0xF3B7, 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, + 0x7763, 0xD4BD, 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, + 0xCDC2, 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, + 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, 0x77B3, + 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, 0x77D7, 0xF5B8, + 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, 0x77E3, 0xEBF8, 0x77E5, + 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, + 0x77F3, 0xE0B4, 0x7802, 0xDEE3, 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, + 0xF3F6, 0x7827, 0xF6DB, 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, + 0x7845, 0xD0A9, 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, + 0xCCE3, 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, 0x7897, + 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, 0x78BA, 0xFCAC, + 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, 0x78C5, 0xDBB6, 0x78CA, + 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, + 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, + 0xF5A7, 0x790E, 0xF5A8, 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, + 0x792C, 0xDAF3, 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, + 0xD1B5, 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, + 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, 0x795C, + 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, 0x7965, 0xDFD4, + 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, 0x797F, 0xD6DF, 0x7981, + 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, 0x798F, 0xDCD8, 0x7991, 0xE9DF, + 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, + 0xD4AA, 0x79B3, 0xE5CC, 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, + 0x79BF, 0xD4BE, 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, + 0xD2B6, 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, 0x79E7, + 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, 0x7A05, 0xE1AA, + 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, 0x7A14, 0xECF9, 0x7A17, + 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, + 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, + 0xF2C3, 0x7A3B, 0xD4AB, 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, + 0x7A40, 0xCDDA, 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, + 0xE7C4, 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, + 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, 0x7A79, + 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, 0x7A81, 0xD4CD, + 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, 0x7A93, 0xF3EB, 0x7A95, + 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, + 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, + 0xD0AB, 0x7AC7, 0xD4E4, 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, + 0x7AD9, 0xF3D7, 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, + 0xF1E2, 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, 0x7B0F, + 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, 0x7B1E, 0xF7C2, + 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, 0x7B2D, 0xD6BD, 0x7B39, + 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, + 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, + 0xF7D5, 0x7B54, 0xD3CD, 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, + 0x7B6E, 0xDFFB, 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, + 0xEFA8, 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, + 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, 0x7BB1, + 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, 0x7BC1, 0xFCD6, + 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, 0x7BC9, 0xF5E9, 0x7BD2, + 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, + 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, + 0xEDD8, 0x7C2B, 0xE1C7, 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, + 0x7C43, 0xD5BE, 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, + 0xF4D9, 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, 0x7C9F, + 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, 0x7CB1, 0xD5DC, + 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, 0x7CBE, 0xEFF1, 0x7CCA, + 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, + 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, + 0xF1C4, 0x7D04, 0xE5B3, 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, + 0x7D08, 0xFCBC, 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, + 0xD2EF, 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, + 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, 0x7D22, + 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, 0x7D2F, 0xD7AB, + 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, 0x7D39, 0xE1C9, 0x7D3A, + 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, + 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, + 0xFAE2, 0x7D66, 0xD0E5, 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, + 0x7D71, 0xF7D6, 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, + 0xCCB5, 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, 0x7DAD, + 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, 0x7DB5, 0xF3F7, + 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, 0x7DBD, 0xEDCA, 0x7DBE, + 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, + 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, + 0xD3B0, 0x7DE0, 0xF4F3, 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, + 0x7DE9, 0xE8D0, 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, + 0xF6C6, 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, + 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, 0x7E23, + 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, 0x7E31, 0xF0FD, + 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, 0x7E41, 0xDBE5, 0x7E43, + 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, + 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, + 0xFCEB, 0x7E6B, 0xCDA8, 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, + 0x7E7C, 0xCDA9, 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, + 0xE7C5, 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, 0x7F50, + 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, 0x7F6B, 0xCED1, + 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, 0x7F75, 0xD8E1, 0x7F77, + 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, + 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, + 0xE2BA, 0x7FA4, 0xCFD8, 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, + 0x7FB8, 0xD7E8, 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, + 0xE3C7, 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, + 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, 0x7FE1, + 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, 0x7FF9, 0xCEEE, + 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, 0x8003, 0xCDC5, 0x8005, + 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, 0x800C, 0xECBB, 0x8010, 0xD2B1, + 0x8015, 0xCCE9, 0x8017, 0xD9C4, 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, + 0xECBC, 0x8036, 0xE5AD, 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, + 0x8046, 0xD6C0, 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, + 0xF6A9, 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, 0x807F, + 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, 0x8087, 0xF0DC, + 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, 0x8096, 0xF5AB, 0x809B, + 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, + 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, + 0xEBC0, 0x80B4, 0xFDA2, 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, + 0x80CC, 0xDBCE, 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, + 0xF8E0, 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, + 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, 0x8105, + 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, 0x810A, 0xF4B1, + 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, 0x8123, 0xE2EE, 0x8129, + 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, 0x8139, 0xF3EC, 0x813E, 0xDEA1, + 0x814B, 0xE4FD, 0x814E, 0xE3EC, 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, + 0xCBB7, 0x8155, 0xE8D3, 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, + 0x8170, 0xE9A6, 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, + 0xE0CD, 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, 0x81A0, + 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, 0x81B5, 0xF5FD, + 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, 0x81BF, 0xD2DB, 0x81C0, + 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, + 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, + 0xD7FC, 0x81EA, 0xEDBB, 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, + 0x81FA, 0xD3E6, 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, + 0xCFC0, 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, + 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, 0x821E, + 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, 0x822B, 0xDBBA, + 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, 0x8237, 0xFAE4, 0x8239, + 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, 0x8247, 0xEFF3, 0x8259, 0xF3ED, + 0x8264, 0xEBFA, 0x8266, 0xF9E6, 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, + 0xCADE, 0x8272, 0xDFE4, 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, + 0x828B, 0xE9E3, 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, + 0xDDB3, 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, 0x82AE, + 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, 0x82B7, 0xF2BA, + 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, 0x82BC, 0xD9C5, 0x82BD, + 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, + 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, + 0xCFC2, 0x82E1, 0xECBE, 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, + 0x82F1, 0xE7C8, 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, + 0xD9F2, 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, + 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, 0x8331, + 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, 0x8338, 0xE9C7, + 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, 0x8349, 0xF5AE, 0x834A, + 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, 0x8352, 0xFCD8, 0x8373, 0xD4E5, + 0x8377, 0xF9C3, 0x837B, 0xEEE2, 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, + 0xDEED, 0x8396, 0xCCEC, 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, + 0x83A9, 0xDDB4, 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, + 0xF4EA, 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, 0x83EB, + 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, 0x83F2, 0xDEA3, + 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, 0x8403, 0xF5FE, 0x8404, + 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, 0x840D, 0xF8C3, 0x840E, 0xEAD7, + 0x8429, 0xF5D7, 0x842C, 0xD8BF, 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, + 0xD5AA, 0x8449, 0xE7A8, 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, + 0x8463, 0xD4DD, 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, + 0xE5B5, 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, + 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, 0x84B8, + 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, 0x84C0, 0xE1E0, + 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, 0x84C9, 0xE9C8, 0x84CB, + 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, + 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, + 0xD8C0, 0x8514, 0xDCDB, 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, + 0x851E, 0xD7AD, 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, + 0xE1CA, 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, 0x8553, + 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, 0x8569, 0xF7B9, + 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, 0x8587, 0xDAB9, 0x858F, + 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, 0x859B, 0xE0E0, 0x85A6, 0xF4C0, + 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, + 0xFDB9, 0x85BA, 0xF0B1, 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, + 0x85CE, 0xE3F0, 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, + 0xE7DD, 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, + 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, 0x8602, + 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, 0x8616, 0xE5EE, + 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, 0x863F, 0xD5A1, 0x864E, + 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, 0x8655, 0xF4A5, 0x865B, 0xFAC8, + 0x865C, 0xD6D7, 0x865E, 0xE9E5, 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, + 0xFBF6, 0x868A, 0xDAA5, 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, + 0x86A4, 0xF0DE, 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, + 0xFCEE, 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, 0x8703, + 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, 0x871C, 0xDACC, + 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, 0x875F, 0xEADA, 0x8766, + 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, 0x8776, 0xEFCA, 0x8778, 0xE8C4, + 0x8782, 0xD5CC, 0x878D, 0xEBD7, 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, + 0xD3D9, 0x87BA, 0xD5A2, 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, + 0x87EF, 0xE9A8, 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, + 0xE0EA, 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, + 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, 0x8846, + 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, 0x8853, 0xE2FA, + 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, 0x885D, 0xF5FA, 0x8861, + 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, 0x8868, 0xF8FA, 0x886B, 0xDFB9, + 0x8870, 0xE1F1, 0x8872, 0xD2A4, 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, + 0xD0DB, 0x8881, 0xEABE, 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, + 0x888D, 0xF8E5, 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, + 0xCDE5, 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, 0x88DC, + 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, 0x88E8, 0xDEA5, + 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, 0x88F8, 0xD5A3, 0x88FD, + 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, 0x8912, 0xF8E6, 0x8913, 0xDCCE, + 0x8918, 0xEADC, 0x8919, 0xDBD2, 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, + 0xE3A8, 0x8938, 0xD7AE, 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, + 0x895F, 0xD0DC, 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, + 0xE0A4, 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, + 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, 0x89A1, + 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, 0x89BA, 0xCAC6, + 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, 0x89E3, 0xFAB0, 0x89F4, + 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, + 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, + 0xFDBA, 0x8A16, 0xFDE1, 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, + 0x8A1D, 0xE4B8, 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, + 0xDBBE, 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, 0x8A55, + 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, 0x8A62, 0xE2F3, + 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, 0x8A6D, 0xCFF8, 0x8A6E, + 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, + 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, + 0xF2BC, 0x8A8D, 0xECE3, 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, + 0x8A9E, 0xE5DE, 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, + 0xE8A6, 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, + 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, 0x8ABE, + 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, 0x8AC7, 0xD3C8, + 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, 0x8AD2, 0xD5DF, 0x8AD6, + 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, + 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, + 0xEDBF, 0x8AF1, 0xFDC9, 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, + 0x8AFA, 0xE5EC, 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, + 0xEADD, 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, 0x8B1B, + 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, 0x8B2B, 0xEEE3, + 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, 0x8B41, 0xFCA6, 0x8B49, + 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, + 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, + 0xECA1, 0x8B74, 0xCCB9, 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, + 0x8B8A, 0xDCA8, 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, + 0xF3D9, 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, + 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, 0x8C55, + 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, 0x8C6B, 0xE7E3, + 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, 0x8C8A, 0xD8E7, 0x8C8C, + 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, + 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, + 0xF7B1, 0x8CAB, 0xCEBB, 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, + 0x8CB3, 0xECC3, 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, + 0xD3E8, 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, 0x8CC4, + 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, 0x8CD1, 0xF2E1, + 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, 0x8CDE, 0xDFDB, 0x8CE0, + 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, + 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, + 0xCFC5, 0x8CFD, 0xDFDF, 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, + 0x8D08, 0xF1FC, 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, + 0xE1DB, 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, + 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, 0x8D8A, + 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, 0x8DB3, 0xF0EB, + 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, 0x8DCB, 0xDBA2, 0x8DCC, + 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, + 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, + 0xE9C9, 0x8E0F, 0xD3CE, 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, + 0x8E30, 0xEBB2, 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, + 0xCBF4, 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, 0x8E81, + 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, 0x8EAA, 0xD7F5, + 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, 0x8ECA, 0xF3B3, 0x8ECB, + 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, + 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, + 0xCEF2, 0x8F05, 0xD6D9, 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, + 0x8F14, 0xDCD0, 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, + 0xFDCA, 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, + 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, 0x8F38, + 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, 0x8F3F, 0xE6AB, + 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, 0x8F4D, 0xF4D0, 0x8F4E, + 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, + 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, + 0xDEF6, 0x8FAF, 0xDCAA, 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, + 0x8FC2, 0xE9E6, 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, + 0xDAF7, 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, 0x8FFD, + 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, 0x9003, 0xD4B1, + 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, 0x900B, 0xF8E7, 0x900D, + 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, 0x9011, 0xCFC7, 0x9014, 0xD4B2, + 0x9015, 0xCCEF, 0x9017, 0xD4E8, 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, + 0xE0A6, 0x901E, 0xD6C1, 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, + 0x9022, 0xDCF1, 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, + 0xF2E4, 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, + 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, 0x904B, + 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, 0x9051, 0xFCDA, + 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, 0x9059, 0xE9AB, 0x905C, + 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, 0x9060, 0xEAC0, 0x9061, 0xE1CF, + 0x9063, 0xCCBA, 0x9069, 0xEEEA, 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, + 0xD4EE, 0x9072, 0xF2C0, 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, + 0x907A, 0xEBB6, 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, + 0xE9AD, 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, 0x9091, + 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, 0x90A3, 0xD1E1, + 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, 0x90AF, 0xCAFB, 0x90B0, + 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, 0x90B8, 0xEED0, 0x90C1, 0xE9F4, + 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, + 0xCEAC, 0x90F5, 0xE9E8, 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, + 0x9115, 0xFAC1, 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, + 0xD3B3, 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, + 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, 0x9169, + 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, 0x9177, 0xFBE5, + 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, 0x918B, 0xF5B3, 0x918D, + 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, 0x91AB, 0xECA2, 0x91AC, 0xEDFD, + 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, + 0xCBD9, 0x91C0, 0xE5D4, 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, + 0x91CC, 0xD7EC, 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, + 0xD7ED, 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, 0x91F5, + 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, 0x9212, 0xDFBC, + 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, 0x923A, 0xE8AD, 0x923F, + 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, 0x9249, 0xFAE8, 0x9257, 0xCCC6, + 0x925B, 0xE6E7, 0x925E, 0xEAC7, 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, + 0xE2FC, 0x9266, 0xEFFA, 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, + 0x9291, 0xE0D5, 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, + 0xF9E7, 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, + 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, 0x92EA, + 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, 0x9310, 0xF5DE, + 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, 0x931F, 0xD3CA, 0x9320, + 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, 0x9324, 0xD1C5, 0x9326, 0xD0DE, + 0x9328, 0xD9E1, 0x932B, 0xE0B8, 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, + 0xE7CC, 0x934A, 0xD6A8, 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, + 0x935B, 0xD3B4, 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, + 0xF1A3, 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, 0x93B0, + 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, 0x93E1, 0xCCF0, + 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, 0x9418, 0xF1A4, 0x9425, + 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, 0x9438, 0xF7A1, 0x9444, 0xF1D1, + 0x9451, 0xCAFC, 0x9452, 0xCAFD, 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, + 0xF3BA, 0x9577, 0xEDFE, 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, + 0x958B, 0xCBD2, 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, + 0xCAE0, 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, + 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, 0x95BB, + 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, 0x95D4, 0xF9EF, + 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, 0x95E1, 0xF4C5, 0x95E2, + 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, 0x962A, 0xF8A1, 0x962E, 0xE8D6, + 0x9632, 0xDBC1, 0x963B, 0xF0E6, 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, + 0xF9AE, 0x9644, 0xDDBE, 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, + 0x9650, 0xF9DA, 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, + 0xE3B3, 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, 0x9676, + 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, 0x9685, 0xE9EA, + 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, 0x968D, 0xFCDB, 0x968E, + 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, 0x9698, 0xE4F6, 0x9699, 0xD0C0, + 0x969B, 0xF0B7, 0x969C, 0xEEA1, 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, + 0xE2CB, 0x96AA, 0xFACF, 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, + 0x96C0, 0xEDCD, 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, + 0xF3A2, 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, + 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, 0x96D9, + 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, 0x96E3, 0xD1F1, + 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, 0x96EF, 0xDAA7, 0x96F0, + 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, 0x96F7, 0xD6F4, 0x96F9, 0xDADF, + 0x96FB, 0xEFB3, 0x9700, 0xE2CD, 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, + 0xEFC5, 0x9713, 0xE7E7, 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, + 0x971E, 0xF9C7, 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, + 0xDCA4, 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, 0x9761, + 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, 0x9774, 0xFCA8, + 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, 0x978D, 0xE4D3, 0x978F, + 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, + 0x97C6, 0xF4C7, 0x97CB, 0xEADF, 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, + 0xEBE5, 0x97F6, 0xE1D2, 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, + 0x9801, 0xFAED, 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, + 0xE2F7, 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, + 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, 0x9818, + 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, 0x9839, 0xF7DD, + 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, 0x984D, 0xE4FE, 0x984E, + 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, 0x985A, 0xEFB4, 0x985E, 0xD7BE, + 0x9865, 0xFBE2, 0x9867, 0xCDD3, 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, + 0xF9A6, 0x98AF, 0xDFBD, 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, + 0x98DB, 0xDEAB, 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, + 0xD1C6, 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, 0x9909, + 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, 0x9913, 0xE4BB, + 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, 0x9928, 0xCEBD, 0x9945, + 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, 0x994C, 0xF3CA, 0x994D, 0xE0D7, + 0x9951, 0xD1C7, 0x9952, 0xE9AE, 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, + 0xE2CF, 0x9999, 0xFAC5, 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, + 0x99AC, 0xD8A9, 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, + 0xF6CC, 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, + 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, 0x99DD, + 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, 0x99FF, 0xF1E7, + 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, 0x9A0F, 0xD1C9, 0x9A19, + 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, + 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, + 0xCEF6, 0x9A57, 0xFAD0, 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, + 0x9A62, 0xD5F0, 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, + 0xCDE9, 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, 0x9B2A, + 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, 0x9B42, 0xFBEB, + 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, 0x9B4F, 0xEAE0, 0x9B54, + 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, + 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, + 0xF4ED, 0x9BE4, 0xCDE6, 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, + 0x9C12, 0xDCE1, 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, + 0xD8C4, 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, + 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, 0x9CF6, + 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, 0x9D28, 0xE4E5, + 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, 0x9D60, 0xCDDC, 0x9D61, + 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, + 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, + 0xFDD3, 0x9DF9, 0xEBED, 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, + 0x9E75, 0xD6DD, 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, + 0xD1CB, 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, 0x9EBE, + 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, 0x9ED1, 0xFDD9, + 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, 0x9EDC, 0xF5F5, 0x9EDE, + 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, + 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, + 0xF0BA, 0x9F4B, 0xEEB1, 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, + 0x9F61, 0xD6C6, 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, + 0xE4CB, 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, + 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, 0xAC04, + 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, 0xAC08, 0xB0A5, + 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, 0xAC0C, 0x8146, 0xAC0D, + 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, + 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, + 0xB0AE, 0xAC17, 0xB0AF, 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, + 0xAC1B, 0xB0B2, 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, + 0x814C, 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, 0xAC28, + 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, 0xAC2C, 0xB0B7, + 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, 0xAC30, 0xB0BA, 0xAC31, + 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, 0xAC34, 0x815A, 0xAC35, 0x8161, + 0xAC36, 0x8162, 0xAC37, 0x8163, 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, + 0x8164, 0xAC3B, 0x8165, 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, + 0xAC3F, 0x8168, 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, + 0x816B, 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, + 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, 0xAC4C, + 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, 0xAC50, 0x8176, + 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, 0xAC54, 0xB0C2, 0xAC55, + 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, 0xAC58, 0xB0C3, 0xAC59, 0x8183, + 0xAC5A, 0x8184, 0xAC5B, 0x8185, 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, + 0x8187, 0xAC5F, 0x8188, 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, + 0xAC63, 0x818C, 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, + 0x8190, 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, 0xAC70, + 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, 0xAC74, 0xB0C7, + 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, 0xAC78, 0xB0C9, 0xAC79, + 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, 0xAC7C, 0x819F, 0xAC7D, 0x81A0, + 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, + 0x81A3, 0xAC83, 0xB0CD, 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, + 0xAC87, 0x81A4, 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, + 0xB0D3, 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, + 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, 0xAC94, + 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, 0xAC98, 0x81AF, + 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, 0xAC9C, 0xB0D7, 0xAC9D, + 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, + 0xACA2, 0x81B4, 0xACA3, 0x81B5, 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, + 0x81B8, 0xACA7, 0x81B9, 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, + 0xACAB, 0x81BA, 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, + 0xB0E0, 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, 0xACB8, + 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, 0xACBC, 0xB0E5, + 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, 0xACC0, 0x81C7, 0xACC1, + 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, 0xACC4, 0xB0E8, 0xACC5, 0x81CA, + 0xACC6, 0x81CB, 0xACC7, 0x81CC, 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, + 0x81CE, 0xACCB, 0x81CF, 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, + 0xACCF, 0x81D2, 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, + 0x81D6, 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, + 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, 0xACDC, + 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, 0xACE0, 0xB0ED, + 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, 0xACE4, 0xB0EF, 0xACE5, + 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, 0xACE8, 0xB0F1, 0xACE9, 0x81E5, + 0xACEA, 0xB0F2, 0xACEB, 0x81E6, 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, + 0x81E8, 0xACEF, 0xB0F4, 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, + 0xACF3, 0xB0F7, 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, + 0x81EB, 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, 0xAD00, + 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, 0xAD04, 0xB0FD, + 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, 0xAD08, 0x81F7, 0xAD09, + 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, + 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, + 0x81FD, 0xAD13, 0x81FE, 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, + 0xAD17, 0x8244, 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, + 0x8247, 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, + 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, 0xAD24, + 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, 0xAD28, 0x8252, + 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, 0xAD2C, 0xB1A9, 0xAD2D, + 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, 0xAD30, 0x8257, 0xAD31, 0x8258, + 0xAD32, 0x8259, 0xAD33, 0x825A, 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, + 0x8261, 0xAD37, 0x8262, 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, + 0xAD3B, 0x8265, 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, + 0x8268, 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, 0xAD48, + 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, 0xAD4C, 0x8271, + 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, 0xAD50, 0xB1B3, 0xAD51, + 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, 0xAD54, 0xB1B4, 0xAD55, 0x8278, + 0xAD56, 0x8279, 0xAD57, 0x827A, 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, + 0x8282, 0xAD5B, 0x8283, 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, + 0xAD5F, 0x8287, 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, + 0xB1B7, 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, + 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, 0xAD6C, + 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, 0xAD70, 0xB1BA, + 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, 0xAD74, 0xB1BC, 0xAD75, + 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, 0xAD78, 0x8297, 0xAD79, 0x8298, + 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, + 0x829A, 0xAD7F, 0xB1C2, 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, + 0xAD83, 0x829C, 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, + 0x82A0, 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, 0xAD90, + 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, 0xAD94, 0x82A9, + 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, 0xAD98, 0x82AD, 0xAD99, + 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, + 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, + 0x82B5, 0xADA3, 0x82B6, 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, + 0xADA7, 0x82B9, 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, + 0x82BD, 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, + 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, 0xADB4, + 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, 0xADB8, 0x82C9, + 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, 0xADBC, 0x82CD, 0xADBD, + 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, + 0xADC2, 0x82D1, 0xADC3, 0x82D2, 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, + 0x82D4, 0xADC7, 0x82D5, 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, + 0xADCB, 0x82D8, 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, + 0x82DC, 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, 0xADD8, + 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, 0xADDC, 0xB1D4, + 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, 0xADE0, 0xB1D5, 0xADE1, + 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, 0xADE4, 0xB1D6, 0xADE5, 0x82EC, + 0xADE6, 0x82ED, 0xADE7, 0x82EE, 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, + 0x82F1, 0xADEB, 0x82F2, 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, + 0xADEF, 0x82F6, 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, + 0x82FA, 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, + 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, 0xADFC, + 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, 0xAE00, 0xB1DB, + 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, 0xAE04, 0x8347, 0xAE05, + 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, + 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, + 0x834D, 0xAE0F, 0x834E, 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, + 0xAE13, 0x8352, 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, + 0x8355, 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, 0xAE20, + 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, 0xAE24, 0x8368, + 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, 0xAE28, 0x836C, 0xAE29, + 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, 0xAE2C, 0x8370, 0xAE2D, 0x8371, + 0xAE2E, 0x8372, 0xAE2F, 0x8373, 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, + 0x8374, 0xAE33, 0x8375, 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, + 0xAE37, 0xB1E5, 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, + 0x8379, 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, + 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, 0xAE44, + 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, 0xAE48, 0x8387, + 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, 0xAE4C, 0xB1EE, 0xAE4D, + 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, 0xAE50, 0xB1F1, 0xAE51, 0x838B, + 0xAE52, 0x838C, 0xAE53, 0x838D, 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, + 0xB1F3, 0xAE57, 0x838F, 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, + 0xAE5B, 0x8393, 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, + 0xB1F6, 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, 0xAE68, + 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, 0xAE6C, 0xB1FC, + 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, 0xAE70, 0xB1FD, 0xAE71, + 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, 0xAE74, 0x83A2, 0xAE75, 0x83A3, + 0xAE76, 0x83A4, 0xAE77, 0x83A5, 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, + 0x83A6, 0xAE7B, 0xB2A2, 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, + 0xAE7F, 0x83A8, 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, + 0x83AC, 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, + 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, 0xAE8C, + 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, 0xAE90, 0x83B6, + 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, 0xAE94, 0x83BA, 0xAE95, + 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, 0xAE98, 0x83BE, 0xAE99, 0x83BF, + 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, + 0x83C4, 0xAE9F, 0x83C5, 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, + 0xAEA3, 0x83C9, 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, + 0x83CD, 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, 0xAEB0, + 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, 0xAEB4, 0x83DA, + 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, 0xAEB8, 0x83DE, 0xAEB9, + 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, + 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, + 0x83E4, 0xAEC3, 0x83E5, 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, + 0xAEC7, 0x83E8, 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, + 0x83EC, 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, + 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, 0xAED4, + 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, 0xAED8, 0xB2B2, + 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, 0xAEDC, 0xB2B4, 0xAEDD, + 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, + 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, + 0x8441, 0xAEE7, 0x8442, 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, + 0xAEEB, 0xB2B6, 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, + 0x8447, 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, 0xAEF8, + 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, 0xAEFC, 0xB2BA, + 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, 0xAF00, 0x8455, 0xAF01, + 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, 0xAF04, 0x8459, 0xAF05, 0x845A, + 0xAF06, 0x8461, 0xAF07, 0xB2BB, 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, + 0x8463, 0xAF0B, 0x8464, 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, + 0xAF0F, 0x8467, 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, + 0x846A, 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, + 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, 0xAF1C, + 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, 0xAF20, 0x8477, + 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, 0xAF24, 0x8481, 0xAF25, + 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, 0xAF28, 0x8485, 0xAF29, 0x8486, + 0xAF2A, 0x8487, 0xAF2B, 0x8488, 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, + 0x8489, 0xAF2F, 0x848A, 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, + 0xAF33, 0x848C, 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, + 0x848F, 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, 0xAF40, + 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, 0xAF44, 0x8496, + 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, 0xAF48, 0xB2CA, 0xAF49, + 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, 0xAF4C, 0x849C, 0xAF4D, 0x849D, + 0xAF4E, 0x849E, 0xAF4F, 0x849F, 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, + 0x84A1, 0xAF53, 0x84A2, 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, + 0xAF57, 0x84A6, 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, + 0x84AA, 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, + 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, 0xAF64, + 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, 0xAF68, 0x84B3, + 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, 0xAF6C, 0x84B7, 0xAF6D, + 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, 0xAF70, 0x84BB, 0xAF71, 0x84BC, + 0xAF72, 0x84BD, 0xAF73, 0x84BE, 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, + 0x84C1, 0xAF77, 0x84C2, 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, + 0xAF7B, 0x84C5, 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, + 0x84C9, 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, 0xAF88, + 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, 0xAF8C, 0x84D3, + 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, 0xAF90, 0xB2D5, 0xAF91, + 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, 0xAF94, 0x84D9, 0xAF95, 0xB2D7, + 0xAF96, 0x84DA, 0xAF97, 0x84DB, 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, + 0x84DE, 0xAF9B, 0x84DF, 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, + 0xAF9F, 0x84E2, 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, + 0x84E6, 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, + 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, 0xAFAC, + 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, 0xAFB0, 0x84F3, + 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, 0xAFB4, 0x84F7, 0xAFB5, + 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, + 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, + 0x84FE, 0xAFBF, 0x8541, 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, + 0xAFC3, 0x8544, 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, + 0xB2DD, 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, 0xAFD0, + 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, 0xAFD4, 0xB2E3, + 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, 0xAFD8, 0x8552, 0xAFD9, + 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, + 0xAFDE, 0x8557, 0xAFDF, 0x8558, 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, + 0x8561, 0xAFE3, 0x8562, 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, + 0xAFE7, 0x8566, 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, + 0x8568, 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, + 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, 0xAFF4, + 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, 0xAFF8, 0xB2EA, + 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, 0xAFFC, 0x8575, 0xAFFD, + 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, 0xB000, 0xB2EB, 0xB001, 0xB2EC, + 0xB002, 0x8579, 0xB003, 0x857A, 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, + 0x8582, 0xB007, 0x8583, 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, + 0xB00B, 0x8587, 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, + 0x858A, 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, 0xB018, + 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, 0xB01C, 0xB2F1, + 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, 0xB020, 0x8597, 0xB021, + 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, 0xB024, 0x859B, 0xB025, 0x859C, + 0xB026, 0x859D, 0xB027, 0x859E, 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, + 0x85A0, 0xB02B, 0x85A1, 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, + 0xB02F, 0x85A5, 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, + 0x85A9, 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, + 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, 0xB03C, + 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, 0xB040, 0x85B6, + 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, 0xB044, 0xB2F4, 0xB045, + 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, 0xB048, 0xB2F6, 0xB049, 0x85BC, + 0xB04A, 0xB2F7, 0xB04B, 0x85BD, 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, + 0xB2F9, 0xB04F, 0x85BF, 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, + 0xB053, 0xB2FA, 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, + 0xB2FD, 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, 0xB060, + 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, 0xB064, 0x85CE, + 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, 0xB068, 0x85D2, 0xB069, + 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, 0xB06C, 0x85D6, 0xB06D, 0x85D7, + 0xB06E, 0x85D8, 0xB06F, 0x85D9, 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, + 0x85DC, 0xB073, 0x85DD, 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, + 0xB077, 0x85E1, 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, + 0x85E5, 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, + 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, 0xB084, + 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, 0xB088, 0x85EE, + 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, 0xB08C, 0xB3A6, 0xB08D, + 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, 0xB090, 0x85F3, 0xB091, 0xB3A9, + 0xB092, 0x85F4, 0xB093, 0x85F5, 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, + 0x85F8, 0xB097, 0x85F9, 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, + 0xB09B, 0x85FA, 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, + 0xB3AE, 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, 0xB0A8, + 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, 0xB0AC, 0xB3B5, + 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, 0xB0B0, 0x8645, 0xB0B1, + 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, + 0xB0B6, 0x8647, 0xB0B7, 0x8648, 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, + 0x864A, 0xB0BB, 0x864B, 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, + 0xB0BF, 0x864E, 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, + 0x8652, 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, + 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, 0xB0CC, + 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, 0xB0D0, 0xB3C4, + 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, 0xB0D4, 0xB3C6, 0xB0D5, + 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, + 0xB0DA, 0x8666, 0xB0DB, 0x8667, 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, + 0x866A, 0xB0DF, 0x866B, 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, + 0xB0E3, 0x866E, 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, + 0x8671, 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, 0xB0F0, + 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, 0xB0F4, 0x8684, + 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, 0xB0F8, 0x8688, 0xB0F9, + 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, 0xB0FC, 0x868C, 0xB0FD, 0x868D, + 0xB0FE, 0x868E, 0xB0FF, 0x868F, 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, + 0x8692, 0xB103, 0x8693, 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, + 0xB107, 0x8697, 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, + 0xB3CC, 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, + 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, 0xB114, + 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, 0xB118, 0xB3D1, + 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, 0xB11C, 0xB3D4, 0xB11D, + 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, 0xB120, 0x86A4, 0xB121, 0x86A5, + 0xB122, 0x86A6, 0xB123, 0xB3D6, 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, + 0x86A7, 0xB127, 0x86A8, 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, + 0xB12B, 0x86AB, 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, + 0x86AE, 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, 0xB138, + 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, 0xB13C, 0x86B6, + 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, 0xB140, 0xB3E0, 0xB141, + 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, 0xB144, 0xB3E2, 0xB145, 0x86BC, + 0xB146, 0x86BD, 0xB147, 0x86BE, 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, + 0x86C0, 0xB14B, 0x86C1, 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, + 0xB14F, 0x86C5, 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, + 0x86C7, 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, + 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, 0xB15C, + 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, 0xB160, 0xB3EA, + 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, 0xB164, 0x86D3, 0xB165, + 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, 0xB168, 0x86D7, 0xB169, 0x86D8, + 0xB16A, 0x86D9, 0xB16B, 0x86DA, 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, + 0x86DD, 0xB16F, 0x86DE, 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, + 0xB173, 0x86E2, 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, + 0x86E6, 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, 0xB180, + 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, 0xB184, 0x86EE, + 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, 0xB188, 0xB3F0, 0xB189, + 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, 0xB18C, 0x86F3, 0xB18D, 0xB3F3, + 0xB18E, 0x86F4, 0xB18F, 0x86F5, 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, + 0xB3F4, 0xB193, 0xB3F5, 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, + 0xB197, 0x86FA, 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, + 0x86FD, 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, + 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, 0xB1A4, + 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, 0xB1A8, 0xB3F9, + 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, 0xB1AC, 0x874E, 0xB1AD, + 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, 0xB1B0, 0x8752, 0xB1B1, 0x8753, + 0xB1B2, 0x8754, 0xB1B3, 0x8755, 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, + 0x8758, 0xB1B7, 0x8759, 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, + 0xB1BB, 0x8763, 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, + 0x8767, 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, 0xB1C8, + 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, 0xB1CC, 0xB3FA, + 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, 0xB1D0, 0xB3FB, 0xB1D1, + 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, + 0xB1D6, 0x8781, 0xB1D7, 0x8782, 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, + 0x8785, 0xB1DB, 0x8786, 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, + 0xB1DF, 0xB4A1, 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, + 0x878B, 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, + 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, 0xB1EC, + 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, 0xB1F0, 0xB4A5, + 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, 0xB1F4, 0x8798, 0xB1F5, + 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, + 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, + 0x879F, 0xB1FF, 0x87A0, 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, + 0xB203, 0x87A4, 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, + 0x87A6, 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, 0xB210, + 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, 0xB214, 0xB4AE, + 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, 0xB218, 0x87B1, 0xB219, + 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, 0xB21C, 0x87B4, 0xB21D, 0x87B5, + 0xB21E, 0x87B6, 0xB21F, 0x87B7, 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, + 0x87B9, 0xB223, 0x87BA, 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, + 0xB227, 0x87BE, 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, + 0x87C2, 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, + 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, 0xB234, + 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, 0xB238, 0x87CE, + 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, 0xB23C, 0xB4B4, 0xB23D, + 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, 0xB240, 0x87D5, 0xB241, 0x87D6, + 0xB242, 0x87D7, 0xB243, 0x87D8, 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, + 0x87DB, 0xB247, 0x87DC, 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, + 0xB24B, 0x87E0, 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, + 0x87E4, 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, 0xB258, + 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, 0xB25C, 0xB4B6, + 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, 0xB260, 0xB4B7, 0xB261, + 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, 0xB264, 0x87F6, 0xB265, 0x87F7, + 0xB266, 0x87F8, 0xB267, 0x87F9, 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, + 0x87FA, 0xB26B, 0x87FB, 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, + 0xB26F, 0x8841, 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, + 0x8845, 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, + 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, 0xB27C, + 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, 0xB280, 0x884F, + 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, 0xB284, 0xB4BD, 0xB285, + 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, 0xB288, 0x8855, 0xB289, 0xB4BF, + 0xB28A, 0x8856, 0xB28B, 0x8857, 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, + 0x885A, 0xB28F, 0x8861, 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, + 0xB293, 0x8863, 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, + 0x8866, 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, 0xB2A0, + 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, 0xB2A4, 0x886D, + 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, 0xB2A8, 0x886F, 0xB2A9, + 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, + 0xB2AE, 0x8873, 0xB2AF, 0x8874, 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, + 0x8876, 0xB2B3, 0x8877, 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, + 0xB2B7, 0x887A, 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, + 0x8884, 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, + 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, 0xB2C4, + 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, 0xB2C8, 0xB4CF, + 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, 0xB2CC, 0xB4D1, 0xB2CD, + 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, + 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, + 0x889A, 0xB2D7, 0x889B, 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, + 0xB2DB, 0xB4D6, 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, + 0x889F, 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, 0xB2E8, + 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, 0xB2EC, 0xB4DE, + 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, 0xB2F0, 0x88A6, 0xB2F1, + 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, + 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, + 0xB4E8, 0xB2FB, 0xB4E9, 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, + 0xB2FF, 0xB4EA, 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, + 0x88AE, 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, + 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, 0xB30C, + 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, 0xB310, 0xB4EF, + 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, 0xB314, 0xB4F2, 0xB315, + 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, 0xB318, 0x88BC, 0xB319, 0x88BD, + 0xB31A, 0x88BE, 0xB31B, 0x88BF, 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, + 0x88C1, 0xB31F, 0x88C2, 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, + 0xB323, 0x88C6, 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, + 0x88CA, 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, 0xB330, + 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, 0xB334, 0x88D7, + 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, 0xB338, 0x88DB, 0xB339, + 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, 0xB33C, 0x88DF, 0xB33D, 0x88E0, + 0xB33E, 0x88E1, 0xB33F, 0x88E2, 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, + 0x88E5, 0xB343, 0x88E6, 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, + 0xB347, 0x88EA, 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, + 0x88EE, 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, + 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, 0xB354, + 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, 0xB358, 0xB4F8, + 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, 0xB35C, 0xB4FA, 0xB35D, + 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, 0xB360, 0x88FB, 0xB361, 0x88FC, + 0xB362, 0x88FD, 0xB363, 0x88FE, 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, + 0x8941, 0xB367, 0xB5A1, 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, + 0xB36B, 0xB5A3, 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, + 0x8946, 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, 0xB378, + 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, 0xB37C, 0x894F, + 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, 0xB380, 0xB5A9, 0xB381, + 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, 0xB384, 0xB5AC, 0xB385, 0xB5AD, + 0xB386, 0x8954, 0xB387, 0x8955, 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, + 0x8958, 0xB38B, 0x8959, 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, + 0xB38F, 0x8962, 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, + 0x8965, 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, + 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, 0xB39C, + 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, 0xB3A0, 0xB5B1, + 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, 0xB3A4, 0x8973, 0xB3A5, + 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, + 0xB3AA, 0x8978, 0xB3AB, 0x8979, 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, + 0x8981, 0xB3AF, 0x8982, 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, + 0xB3B3, 0x8986, 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, + 0x898A, 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, 0xB3C0, + 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, 0xB3C4, 0xB5B5, + 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, 0xB3C8, 0xB5B7, 0xB3C9, + 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, + 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, + 0x899E, 0xB3D3, 0x899F, 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, + 0xB3D7, 0xB5BE, 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, + 0xB5C0, 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, + 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, 0xB3E4, + 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, 0xB3E8, 0xB5C4, + 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, 0xB3EC, 0x89AF, 0xB3ED, + 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, + 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, + 0x89B9, 0xB3F7, 0x89BA, 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, + 0xB3FB, 0x89BE, 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, + 0x89C1, 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, 0xB408, + 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, 0xB40C, 0x89CE, + 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, 0xB410, 0xB5C6, 0xB411, + 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, 0xB414, 0x89D5, 0xB415, 0x89D6, + 0xB416, 0x89D7, 0xB417, 0x89D8, 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, + 0x89DA, 0xB41B, 0x89DB, 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, + 0xB41F, 0x89DE, 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, + 0x89E1, 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, + 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, 0xB42C, + 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, 0xB430, 0x89EB, + 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, 0xB434, 0xB5CD, 0xB435, + 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, 0xB438, 0x89F2, 0xB439, 0x89F3, + 0xB43A, 0x89F4, 0xB43B, 0x89F5, 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, + 0x89F8, 0xB43F, 0x89F9, 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, + 0xB443, 0x89FD, 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, + 0x8A43, 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, 0xB450, + 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, 0xB454, 0xB5D0, + 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, 0xB458, 0xB5D1, 0xB459, + 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, 0xB45C, 0x8A54, 0xB45D, 0x8A55, + 0xB45E, 0x8A56, 0xB45F, 0x8A57, 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, + 0x8A58, 0xB463, 0xB5D4, 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, + 0xB467, 0x8A61, 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, + 0x8A65, 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, + 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, 0xB474, + 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, 0xB478, 0x8A71, + 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, 0xB47C, 0x8A75, 0xB47D, + 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, 0xB480, 0xB5D7, 0xB481, 0x8A79, + 0xB482, 0x8A7A, 0xB483, 0x8A81, 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, + 0x8A84, 0xB487, 0x8A85, 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, + 0xB48B, 0x8A88, 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, + 0x8A8C, 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, 0xB498, + 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, 0xB49C, 0x8A99, + 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, 0xB4A0, 0x8A9C, 0xB4A1, + 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, + 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, + 0x8AA4, 0xB4AB, 0x8AA5, 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, + 0xB4AF, 0x8AA8, 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, + 0x8AAC, 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, + 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, 0xB4BC, + 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, 0xB4C0, 0xB5E0, + 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, 0xB4C4, 0xB5E1, 0xB4C5, + 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, + 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, + 0x8AC1, 0xB4CF, 0x8AC2, 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, + 0xB4D3, 0x8AC5, 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, + 0x8AC8, 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, 0xB4E0, + 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, 0xB4E4, 0xB5E9, + 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, 0xB4E8, 0x8AD3, 0xB4E9, + 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, + 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, + 0x8AD9, 0xB4F3, 0x8ADA, 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, + 0xB4F7, 0x8ADE, 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, + 0x8AE1, 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, + 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, 0xB504, + 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, 0xB508, 0x8AEE, + 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, 0xB50C, 0x8AF2, 0xB50D, + 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, 0xB510, 0x8AF6, 0xB511, 0x8AF7, + 0xB512, 0x8AF8, 0xB513, 0x8AF9, 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, + 0x8AFA, 0xB517, 0x8AFB, 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, + 0xB51B, 0xB5F3, 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, + 0x8B42, 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, 0xB528, + 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, 0xB52C, 0x8B49, + 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, 0xB530, 0xB5FB, 0xB531, + 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, 0xB534, 0xB5FD, 0xB535, 0x8B4F, + 0xB536, 0x8B50, 0xB537, 0x8B51, 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, + 0x8B53, 0xB53B, 0x8B54, 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, + 0xB53F, 0x8B58, 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, + 0xB6A3, 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, + 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, 0xB54C, + 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, 0xB550, 0xB6A9, + 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, 0xB554, 0xB6AA, 0xB555, + 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, 0xB558, 0x8B6D, 0xB559, 0x8B6E, + 0xB55A, 0x8B6F, 0xB55B, 0x8B70, 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, + 0x8B71, 0xB55F, 0xB6AD, 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, + 0xB563, 0x8B73, 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, + 0x8B77, 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, 0xB570, + 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, 0xB574, 0x8B8A, + 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, 0xB578, 0x8B8E, 0xB579, + 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, 0xB57C, 0x8B92, 0xB57D, 0x8B93, + 0xB57E, 0x8B94, 0xB57F, 0x8B95, 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, + 0x8B98, 0xB583, 0x8B99, 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, + 0xB587, 0x8B9D, 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, + 0x8BA1, 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, + 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, 0xB594, + 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, 0xB598, 0x8BAE, + 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, 0xB59C, 0x8BB2, 0xB59D, + 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, + 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, + 0x8BB9, 0xB5A7, 0x8BBA, 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, + 0xB5AB, 0xB6B5, 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, + 0x8BBF, 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, 0xB5B8, + 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, 0xB5BC, 0xB6BC, + 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, 0xB5C0, 0xB6BE, 0xB5C1, + 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, + 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, + 0x8BD0, 0xB5CB, 0x8BD1, 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, + 0xB5CF, 0xB6C2, 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, + 0x8BD4, 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, + 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, 0xB5DC, + 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, 0xB5E0, 0x8BE0, + 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, 0xB5E4, 0x8BE4, 0xB5E5, + 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, + 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, + 0x8BED, 0xB5EF, 0x8BEE, 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, + 0xB5F3, 0x8BF2, 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, + 0x8BF6, 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, 0xB600, + 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, 0xB604, 0x8C45, + 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, 0xB608, 0x8C49, 0xB609, + 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, + 0xB60E, 0x8C4F, 0xB60F, 0x8C50, 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, + 0x8C51, 0xB613, 0x8C52, 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, + 0xB617, 0x8C55, 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, + 0x8C58, 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, + 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, 0xB624, + 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, 0xB628, 0x8C6A, + 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, 0xB62C, 0xB6CC, 0xB62D, + 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, 0xB630, 0x8C71, 0xB631, 0x8C72, + 0xB632, 0x8C73, 0xB633, 0x8C74, 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, + 0x8C76, 0xB637, 0x8C77, 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, + 0xB63B, 0x8C81, 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, + 0x8C85, 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, 0xB648, + 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, 0xB64C, 0x8C91, + 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, 0xB650, 0x8C95, 0xB651, + 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, 0xB654, 0x8C99, 0xB655, 0x8C9A, + 0xB656, 0x8C9B, 0xB657, 0x8C9C, 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, + 0x8C9F, 0xB65B, 0x8CA0, 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, + 0xB65F, 0x8CA4, 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, + 0x8CA8, 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, + 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, 0xB66C, + 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, 0xB670, 0x8CB3, + 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, 0xB674, 0x8CB7, 0xB675, + 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, 0xB678, 0x8CBB, 0xB679, 0x8CBC, + 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, + 0x8CC1, 0xB67F, 0x8CC2, 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, + 0xB683, 0x8CC6, 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, + 0x8CCA, 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, 0xB690, + 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, 0xB694, 0x8CD7, + 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, 0xB698, 0x8CDB, 0xB699, + 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, + 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, + 0x8CE2, 0xB6A3, 0x8CE3, 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, + 0xB6A7, 0x8CE6, 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, + 0xB6D5, 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, + 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, 0xB6B4, + 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, 0xB6B8, 0x8CF4, + 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, 0xB6BC, 0x8CF8, 0xB6BD, + 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, + 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, + 0x8D44, 0xB6C7, 0x8D45, 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, + 0xB6CB, 0x8D49, 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, + 0x8D4D, 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, 0xB6D8, + 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, 0xB6DC, 0x8D59, + 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, 0xB6E0, 0x8D63, 0xB6E1, + 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, + 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, + 0x8D6D, 0xB6EB, 0x8D6E, 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, + 0xB6EF, 0x8D72, 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, + 0x8D75, 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, + 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, 0xB6FC, + 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, 0xB700, 0xB6DC, + 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, 0xB704, 0x8D88, 0xB705, + 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, 0xB708, 0x8D8B, 0xB709, 0x8D8C, + 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, + 0x8D91, 0xB70F, 0x8D92, 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, + 0xB713, 0x8D96, 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, + 0x8D9A, 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, 0xB720, + 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, 0xB724, 0x8DA7, + 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, 0xB728, 0xB6DF, 0xB729, + 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, + 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, + 0x8DB0, 0xB733, 0x8DB1, 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, + 0xB737, 0x8DB5, 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, + 0xB6E6, 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, + 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, 0xB744, + 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, 0xB748, 0xB6E8, + 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, 0xB74C, 0xB6E9, 0xB74D, + 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, 0xB750, 0x8DC8, 0xB751, 0x8DC9, + 0xB752, 0x8DCA, 0xB753, 0x8DCB, 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, + 0x8DCC, 0xB757, 0x8DCD, 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, + 0xB75B, 0x8DD1, 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, + 0x8DD5, 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, 0xB768, + 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, 0xB76C, 0x8DDF, + 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, 0xB770, 0xB6EF, 0xB771, + 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, 0xB774, 0x8DE4, 0xB775, 0xB6F2, + 0xB776, 0x8DE5, 0xB777, 0x8DE6, 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, + 0x8DE9, 0xB77B, 0x8DEA, 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, + 0xB77F, 0x8DEC, 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, + 0x8DEF, 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, + 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, 0xB78C, + 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, 0xB790, 0xB6FA, + 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, 0xB794, 0x8DF9, 0xB795, + 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, 0xB798, 0xB7A1, 0xB799, 0xB7A2, + 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, + 0x8DFE, 0xB79F, 0x8E41, 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, + 0xB7A3, 0x8E44, 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, + 0x8E48, 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, 0xB7B0, + 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, 0xB7B4, 0xB7AA, + 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, 0xB7B8, 0xB7AC, 0xB7B9, + 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, + 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, + 0x8E61, 0xB7C3, 0x8E62, 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, + 0xB7C7, 0xB7AD, 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, + 0x8E68, 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, + 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, 0xB7D4, + 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, 0xB7D8, 0x8E75, + 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, 0xB7DC, 0x8E79, 0xB7DD, + 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, + 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, + 0x8E89, 0xB7E7, 0x8E8A, 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, + 0xB7EB, 0x8E8E, 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, + 0x8E90, 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, 0xB7F8, + 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, 0xB7FC, 0xB7B3, + 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, 0xB800, 0xB7B6, 0xB801, + 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, 0xB804, 0x8E9E, 0xB805, 0x8E9F, + 0xB806, 0x8EA0, 0xB807, 0xB7B8, 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, + 0x8EA1, 0xB80B, 0x8EA2, 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, + 0xB80F, 0x8EA5, 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, + 0x8EA8, 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, + 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, 0xB81C, + 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, 0xB820, 0x8EB1, + 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, 0xB824, 0xB7C1, 0xB825, + 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, 0xB828, 0xB7C3, 0xB829, 0x8EB7, + 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, + 0x8EBB, 0xB82F, 0x8EBC, 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, + 0xB833, 0x8EC0, 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, + 0xB7C7, 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, 0xB840, + 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, 0xB844, 0xB7CB, + 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, 0xB848, 0x8ECE, 0xB849, + 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, + 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, + 0x8ED7, 0xB853, 0xB7CD, 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, + 0xB857, 0x8EDB, 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, + 0x8EDF, 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, + 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, 0xB864, + 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, 0xB868, 0x8EE8, + 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, 0xB86C, 0xB7D2, 0xB86D, + 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, 0xB870, 0x8EED, 0xB871, 0xB7D5, + 0xB872, 0x8EEE, 0xB873, 0x8EEF, 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, + 0x8EF2, 0xB877, 0x8EF3, 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, + 0xB87B, 0x8EF6, 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, + 0x8EF9, 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, 0xB888, + 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, 0xB88C, 0x8F48, + 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, 0xB890, 0x8F4B, 0xB891, + 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, 0xB894, 0x8F4F, 0xB895, 0x8F50, + 0xB896, 0x8F51, 0xB897, 0x8F52, 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, + 0x8F55, 0xB89B, 0x8F56, 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, + 0xB89F, 0x8F5A, 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, + 0x8F64, 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, + 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, 0xB8AC, + 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, 0xB8B0, 0xB7DA, + 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, 0xB8B4, 0xB7DB, 0xB8B5, + 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, + 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, + 0x8F81, 0xB8BF, 0x8F82, 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, + 0xB8C3, 0xB7DF, 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, + 0x8F86, 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, 0xB8D0, + 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, 0xB8D4, 0xB7E3, + 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, 0xB8D8, 0x8F94, 0xB8D9, + 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, + 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, + 0x8F9B, 0xB8E3, 0x8F9C, 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, + 0xB8E7, 0x8FA0, 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, + 0x8FA2, 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, + 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, 0xB8F4, + 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, 0xB8F8, 0xB7EB, + 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, 0xB8FC, 0x8FAE, 0xB8FD, + 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, 0xB900, 0x8FB1, 0xB901, 0x8FB2, + 0xB902, 0x8FB3, 0xB903, 0x8FB4, 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, + 0x8FB6, 0xB907, 0x8FB7, 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, + 0xB90B, 0x8FBB, 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, + 0x8FBF, 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, 0xB918, + 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, 0xB91C, 0x8FCB, + 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, 0xB920, 0xB7F1, 0xB921, + 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, 0xB924, 0x8FD2, 0xB925, 0x8FD3, + 0xB926, 0x8FD4, 0xB927, 0x8FD5, 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, + 0x8FD8, 0xB92B, 0x8FD9, 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, + 0xB92F, 0x8FDD, 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, + 0x8FE1, 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, + 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, 0xB93C, + 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, 0xB940, 0xB7F4, + 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, 0xB944, 0xB7F5, 0xB945, + 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, 0xB948, 0x8FF2, 0xB949, 0x8FF3, + 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, + 0x8FF7, 0xB94F, 0xB7F7, 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, + 0xB953, 0x8FFA, 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, + 0x8FFE, 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, 0xB960, + 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, 0xB964, 0x9049, + 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, 0xB968, 0xB7FD, 0xB969, + 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, 0xB96C, 0x904E, 0xB96D, 0xB8A2, + 0xB96E, 0x904F, 0xB96F, 0x9050, 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, + 0x9053, 0xB973, 0x9054, 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, + 0xB977, 0x9056, 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, + 0x9059, 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, + 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, 0xB984, + 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, 0xB988, 0x9068, + 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, 0xB98C, 0x906A, 0xB98D, + 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, 0xB990, 0x906C, 0xB991, 0x906D, + 0xB992, 0x906E, 0xB993, 0x906F, 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, + 0x9072, 0xB997, 0x9073, 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, + 0xB99B, 0x9077, 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, + 0x9081, 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, 0xB9A8, + 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, 0xB9AC, 0xB8AE, + 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, 0xB9B0, 0xB8B0, 0xB9B1, + 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, + 0xB9B6, 0x9094, 0xB9B7, 0x9095, 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, + 0x9098, 0xB9BB, 0x9099, 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, + 0xB9BF, 0xB8B4, 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, + 0x909D, 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, + 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, 0xB9CC, + 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, 0xB9D0, 0xB8BB, + 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, 0xB9D4, 0x90A6, 0xB9D5, + 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, + 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, + 0xB8C2, 0xB9DF, 0x90AC, 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, + 0xB9E3, 0xB8C4, 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, + 0x90B0, 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, 0xB9F0, + 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, 0xB9F4, 0xB8C9, + 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, 0xB9F8, 0xB8CC, 0xB9F9, + 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, + 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, + 0x90C1, 0xBA03, 0x90C2, 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, + 0xBA07, 0x90C6, 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, + 0x90C9, 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, + 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, 0xBA14, + 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, 0xBA18, 0x90D5, + 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, 0xBA1C, 0x90D9, 0xBA1D, + 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, 0xBA20, 0x90DD, 0xBA21, 0x90DE, + 0xBA22, 0x90DF, 0xBA23, 0x90E0, 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, + 0x90E3, 0xBA27, 0x90E4, 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, + 0xBA2B, 0x90E8, 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, + 0x90EC, 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, 0xBA38, + 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, 0xBA3C, 0xB8D5, + 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, 0xBA40, 0xB8D6, 0xBA41, + 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, 0xBA44, 0x90FC, 0xBA45, 0x90FD, + 0xBA46, 0x90FE, 0xBA47, 0x9141, 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, + 0x9142, 0xBA4B, 0xB8DA, 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, + 0xBA4F, 0x9144, 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, + 0xB8DD, 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, + 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, 0xBA5C, + 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, 0xBA60, 0x9150, + 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, 0xBA64, 0xB8E2, 0xBA65, + 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, + 0xBA6A, 0x9155, 0xBA6B, 0x9156, 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, + 0x9159, 0xBA6F, 0x915A, 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, + 0xBA73, 0x9162, 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, + 0x9165, 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, 0xBA80, + 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, 0xBA84, 0xB8EC, + 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, 0xBA88, 0x9171, 0xBA89, + 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, + 0xBA8E, 0x9176, 0xBA8F, 0x9177, 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, + 0x917A, 0xBA93, 0x9181, 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, + 0xBA97, 0x9185, 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, + 0x9189, 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, + 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, 0xBAA4, + 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, 0xBAA8, 0xB8F0, + 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, 0xBAAC, 0xB8F3, 0xBAAD, + 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, + 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, + 0x919E, 0xBAB7, 0x919F, 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, + 0xBABB, 0xB8F8, 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, + 0x91A3, 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, 0xBAC8, + 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, 0xBACC, 0x91AE, + 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, 0xBAD0, 0x91B2, 0xBAD1, + 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, + 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, + 0x91BA, 0xBADB, 0x91BB, 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, + 0xBADF, 0x91BF, 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, + 0x91C3, 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, + 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, 0xBAEC, + 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, 0xBAF0, 0x91D0, + 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, 0xBAF4, 0x91D4, 0xBAF5, + 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, + 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, + 0x91DD, 0xBAFF, 0x91DE, 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, + 0xBB03, 0x91E1, 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, + 0x91E4, 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, 0xBB10, + 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, 0xBB14, 0x91EE, + 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, 0xBB18, 0xB9A6, 0xBB19, + 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, + 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, + 0x91F9, 0xBB23, 0x91FA, 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, + 0xBB27, 0x91FE, 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, + 0xB9AA, 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, + 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, 0xBB34, + 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, 0xBB38, 0xB9AE, + 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, 0xBB3C, 0xB9B0, 0xBB3D, + 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, 0xBB40, 0x924F, 0xBB41, 0x9250, + 0xBB42, 0x9251, 0xBB43, 0x9252, 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, + 0x9253, 0xBB47, 0xB9B5, 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, + 0xBB4B, 0x9256, 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, + 0xB9B8, 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, 0xBB58, + 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, 0xBB5C, 0x9268, + 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, 0xBB60, 0x926C, 0xBB61, + 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, 0xBB64, 0x926E, 0xBB65, 0x926F, + 0xBB66, 0x9270, 0xBB67, 0x9271, 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, + 0x9274, 0xBB6B, 0x9275, 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, + 0xBB6F, 0x9278, 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, + 0x9282, 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, + 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, 0xBB7C, + 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, 0xBB80, 0x928F, + 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, 0xBB84, 0x9293, 0xBB85, + 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, 0xBB88, 0xB9BF, 0xBB89, 0x9297, + 0xBB8A, 0x9298, 0xBB8B, 0x9299, 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, + 0x929B, 0xBB8F, 0x929C, 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, + 0xBB93, 0x929F, 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, + 0x92A3, 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, 0xBBA0, + 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, 0xBBA4, 0xB9C2, + 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, 0xBBA8, 0xB9C3, 0xBBA9, + 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, + 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, + 0x92BB, 0xBBB3, 0x92BC, 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, + 0xBBB7, 0xB9C6, 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, + 0x92C2, 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, + 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, 0xBBC4, + 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, 0xBBC8, 0xB9C9, + 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, 0xBBCC, 0x92D0, 0xBBCD, + 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, + 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, + 0x92D8, 0xBBD7, 0x92D9, 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, + 0xBBDB, 0x92DD, 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, + 0x92E1, 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, 0xBBE8, + 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, 0xBBEC, 0x92EE, + 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, 0xBBF0, 0x92F2, 0xBBF1, + 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, + 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, + 0x92FA, 0xBBFB, 0x92FB, 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, + 0xBBFF, 0xB9CF, 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, + 0x9341, 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, + 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, 0xBC0C, + 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, 0xBC10, 0x9348, + 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, 0xBC14, 0xB9D9, 0xBC15, + 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, 0xBC18, 0xB9DD, 0xBC19, 0x934B, + 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, + 0xB9E1, 0xBC1F, 0xB9E2, 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, + 0xBC23, 0x9350, 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, + 0xB9E5, 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, 0xBC30, + 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, 0xBC34, 0xB9EA, + 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, 0xBC38, 0xB9EB, 0xBC39, + 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, 0xBC3C, 0x9366, 0xBC3D, 0x9367, + 0xBC3E, 0x9368, 0xBC3F, 0x9369, 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, + 0x936A, 0xBC43, 0xB9EE, 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, + 0xBC47, 0x936C, 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, + 0x936F, 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, + 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, 0xBC54, + 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, 0xBC58, 0x9379, + 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, 0xBC5C, 0x9383, 0xBC5D, + 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, 0xBC60, 0x9386, 0xBC61, 0x9387, + 0xBC62, 0x9388, 0xBC63, 0x9389, 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, + 0x938C, 0xBC67, 0x938D, 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, + 0xBC6B, 0x9391, 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, + 0x9395, 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, 0xBC78, + 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, 0xBC7C, 0x93A2, + 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, 0xBC80, 0x93A6, 0xBC81, + 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, + 0xBC86, 0x93AA, 0xBC87, 0x93AB, 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, + 0x93AD, 0xBC8B, 0xB9F9, 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, + 0xBC8F, 0x93AF, 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, + 0x93B3, 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, + 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, 0xBC9C, + 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, 0xBCA0, 0xBAA3, + 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, 0xBCA4, 0xBAA5, 0xBCA5, + 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, + 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, + 0x93C4, 0xBCAF, 0x93C5, 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, + 0xBCB3, 0xBAAA, 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, + 0x93C8, 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, 0xBCC0, + 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, 0xBCC4, 0xBAB0, + 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, 0xBCC8, 0x93D5, 0xBCC9, + 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, + 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, + 0x93DB, 0xBCD3, 0x93DC, 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, + 0xBCD7, 0x93DF, 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, + 0x93E2, 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, + 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, 0xBCE4, + 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, 0xBCE8, 0x93EE, + 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, 0xBCEC, 0x93F2, 0xBCED, + 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, + 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, + 0xBABA, 0xBCF7, 0x93FA, 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, + 0xBCFB, 0x93FD, 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, + 0x9442, 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, 0xBD08, + 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, 0xBD0C, 0x944B, + 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, 0xBD10, 0xBAC1, 0xBD11, + 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, 0xBD14, 0xBAC2, 0xBD15, 0x9452, + 0xBD16, 0x9453, 0xBD17, 0x9454, 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, + 0x9457, 0xBD1B, 0x9458, 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, + 0xBD1F, 0x9462, 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, + 0x9466, 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, + 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, 0xBD2C, + 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, 0xBD30, 0x9471, + 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, 0xBD34, 0x9475, 0xBD35, + 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, 0xBD38, 0x9479, 0xBD39, 0x947A, + 0xBD3A, 0x9481, 0xBD3B, 0x9482, 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, + 0x9485, 0xBD3F, 0x9486, 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, + 0xBD43, 0x9489, 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, + 0x948D, 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, 0xBD50, + 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, 0xBD54, 0x9496, + 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, 0xBD58, 0xBACA, 0xBD59, + 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, 0xBD5C, 0x949C, 0xBD5D, 0x949D, + 0xBD5E, 0x949E, 0xBD5F, 0x949F, 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, + 0x94A2, 0xBD63, 0x94A3, 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, + 0xBD67, 0x94A6, 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, + 0x94A9, 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, + 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, 0xBD74, + 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, 0xBD78, 0x94B6, + 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, 0xBD7C, 0x94BA, 0xBD7D, + 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, 0xBD80, 0xBACE, 0xBD81, 0xBACF, + 0xBD82, 0x94BE, 0xBD83, 0x94BF, 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, + 0x94C1, 0xBD87, 0xBAD1, 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, + 0xBD8B, 0x94C2, 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, + 0x94C6, 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, 0xBD98, + 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, 0xBD9C, 0xBADB, + 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, 0xBDA0, 0x94D0, 0xBDA1, + 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, + 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, + 0x94D9, 0xBDAB, 0x94DA, 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, + 0xBDAF, 0x94DE, 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, + 0x94E1, 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, + 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, 0xBDBC, + 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, 0xBDC0, 0x94ED, + 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, 0xBDC4, 0x94F1, 0xBDC5, + 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, + 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, + 0x94FB, 0xBDCF, 0x94FC, 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, + 0xBDD3, 0x9542, 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, + 0x9544, 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, 0xBDE0, + 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, 0xBDE4, 0x954F, + 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, 0xBDE8, 0x9553, 0xBDE9, + 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, 0xBDEC, 0x9556, 0xBDED, 0x9557, + 0xBDEE, 0x9558, 0xBDEF, 0x9559, 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, + 0x9561, 0xBDF3, 0x9562, 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, + 0xBDF7, 0x9565, 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, + 0x9568, 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, + 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, 0xBE04, + 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, 0xBE08, 0x9572, + 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, 0xBE0C, 0xBAEA, 0xBE0D, + 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, 0xBE10, 0xBAEC, 0xBE11, 0x9578, + 0xBE12, 0x9579, 0xBE13, 0x957A, 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, + 0x9582, 0xBE17, 0x9583, 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, + 0xBE1B, 0x9587, 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, + 0xBAF0, 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, 0xBE28, + 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, 0xBE2C, 0x9595, + 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, 0xBE30, 0x9599, 0xBE31, + 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, 0xBE34, 0x959D, 0xBE35, 0x959E, + 0xBE36, 0x959F, 0xBE37, 0x95A0, 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, + 0x95A3, 0xBE3B, 0x95A4, 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, + 0xBE3F, 0x95A8, 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, + 0x95AC, 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, + 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, 0xBE4C, + 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, 0xBE50, 0x95B4, + 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, 0xBE54, 0xBAF6, 0xBE55, + 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, 0xBE58, 0x95B9, 0xBE59, 0xBAF9, + 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, + 0x95BC, 0xBE5F, 0x95BD, 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, + 0xBE63, 0x95BF, 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, + 0x95C2, 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, 0xBE70, + 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, 0xBE74, 0xBBA6, + 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, 0xBE78, 0x95CC, 0xBE79, + 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, + 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, + 0x95D2, 0xBE83, 0x95D3, 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, + 0xBE87, 0x95D6, 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, + 0x95DA, 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, + 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, 0xBE94, + 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, 0xBE98, 0xBBB2, + 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, 0xBE9C, 0x95E4, 0xBE9D, + 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, + 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, + 0x95EE, 0xBEA7, 0x95EF, 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, + 0xBEAB, 0x95F2, 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, + 0x95F6, 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, 0xBEB8, + 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, 0xBEBC, 0x9645, + 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, 0xBEC0, 0x9649, 0xBEC1, + 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, 0xBEC4, 0x964D, 0xBEC5, 0x964E, + 0xBEC6, 0x964F, 0xBEC7, 0x9650, 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, + 0x9653, 0xBECB, 0x9654, 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, + 0xBECF, 0x9658, 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, + 0x965A, 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, + 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, 0xBEDC, + 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, 0xBEE0, 0xBBBA, + 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, 0xBEE4, 0xBBBC, 0xBEE5, + 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, 0xBEE8, 0x966E, 0xBEE9, 0x966F, + 0xBEEA, 0x9670, 0xBEEB, 0x9671, 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, + 0x9673, 0xBEEF, 0x9674, 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, + 0xBEF3, 0x9678, 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, + 0x9682, 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, 0xBF00, + 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, 0xBF04, 0x968E, + 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, 0xBF08, 0xBBC0, 0xBF09, + 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, 0xBF0C, 0x9694, 0xBF0D, 0x9695, + 0xBF0E, 0x9696, 0xBF0F, 0x9697, 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, + 0x969A, 0xBF13, 0x969B, 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, + 0xBF17, 0x969F, 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, + 0xBBC4, 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, + 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, 0xBF24, + 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, 0xBF28, 0x96AB, + 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, 0xBF2C, 0x96AF, 0xBF2D, + 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, 0xBF30, 0x96B3, 0xBF31, 0x96B4, + 0xBF32, 0x96B5, 0xBF33, 0x96B6, 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, + 0x96B9, 0xBF37, 0x96BA, 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, + 0xBF3B, 0x96BE, 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, + 0x96C2, 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, 0xBF48, + 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, 0xBF4C, 0x96CB, + 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, 0xBF50, 0xBBCB, 0xBF51, + 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, 0xBF54, 0x96D1, 0xBF55, 0xBBCD, + 0xBF56, 0x96D2, 0xBF57, 0x96D3, 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, + 0x96D6, 0xBF5B, 0x96D7, 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, + 0xBF5F, 0x96DB, 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, + 0x96DF, 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, + 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, 0xBF6C, + 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, 0xBF70, 0x96EC, + 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, 0xBF74, 0x96F0, 0xBF75, + 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, 0xBF78, 0x96F4, 0xBF79, 0x96F5, + 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, + 0x96FA, 0xBF7F, 0x96FB, 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, + 0xBF83, 0x9741, 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, + 0x9745, 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, 0xBF90, + 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, 0xBF94, 0xBBCE, + 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, 0xBF98, 0x9755, 0xBF99, + 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, 0xBF9C, 0x9759, 0xBF9D, 0x975A, + 0xBF9E, 0x9761, 0xBF9F, 0x9762, 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, + 0x9765, 0xBFA3, 0x9766, 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, + 0xBFA7, 0x976A, 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, + 0x976E, 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, + 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, 0xBFB4, + 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, 0xBFB8, 0x977A, + 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, 0xBFBC, 0x9784, 0xBFBD, + 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, 0xBFC0, 0x9788, 0xBFC1, 0x9789, + 0xBFC2, 0x978A, 0xBFC3, 0x978B, 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, + 0x978D, 0xBFC7, 0x978E, 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, + 0xBFCB, 0x9792, 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, + 0x9794, 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, 0xBFD8, + 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, 0xBFDC, 0xBBD5, + 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, 0xBFE0, 0x97A1, 0xBFE1, + 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, + 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, + 0x97AA, 0xBFEB, 0x97AB, 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, + 0xBFEF, 0x97AF, 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, + 0x97B3, 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, + 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, 0xBFFC, + 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, 0xC000, 0x97C0, + 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, 0xC004, 0x97C4, 0xC005, + 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, 0xC008, 0x97C8, 0xC009, 0x97C9, + 0xC00A, 0x97CA, 0xC00B, 0x97CB, 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, + 0x97CE, 0xC00F, 0x97CF, 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, + 0xC013, 0x97D3, 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, + 0x97D7, 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, 0xC020, + 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, 0xC024, 0x97E4, + 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, 0xC028, 0x97E8, 0xC029, + 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, 0xC02C, 0x97EC, 0xC02D, 0x97ED, + 0xC02E, 0x97EE, 0xC02F, 0x97EF, 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, + 0x97F2, 0xC033, 0x97F3, 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, + 0xC037, 0x97F7, 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, + 0x97FB, 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, + 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, 0xC044, + 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, 0xC048, 0x9849, + 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, 0xC04C, 0x984D, 0xC04D, + 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, 0xC050, 0x9851, 0xC051, 0xBBD9, + 0xC052, 0x9852, 0xC053, 0x9853, 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, + 0x9856, 0xC057, 0x9857, 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, + 0xC05B, 0x985A, 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, + 0x9863, 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, 0xC068, + 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, 0xC06C, 0x986D, + 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, 0xC070, 0x9871, 0xC071, + 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, 0xC074, 0x9875, 0xC075, 0x9876, + 0xC076, 0x9877, 0xC077, 0x9878, 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, + 0x9881, 0xC07B, 0x9882, 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, + 0xC07F, 0x9886, 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, + 0x988A, 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, + 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, 0xC08C, + 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, 0xC090, 0xBBDF, + 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, 0xC094, 0xBBE1, 0xC095, + 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, 0xC098, 0xBBE2, 0xC099, 0x989C, + 0xC09A, 0x989D, 0xC09B, 0x989E, 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, + 0x98A1, 0xC09F, 0x98A2, 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, + 0xC0A3, 0xBBE5, 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, + 0x98A6, 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, 0xC0B0, + 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, 0xC0B4, 0xBBEC, + 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, 0xC0B8, 0x98AF, 0xC0B9, + 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, + 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, + 0x98B4, 0xC0C3, 0x98B5, 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, + 0xC0C7, 0x98B8, 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, + 0x98BA, 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, + 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, 0xC0D4, + 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, 0xC0D8, 0xBBF9, + 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, 0xC0DC, 0xBBFC, 0xC0DD, + 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, + 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, + 0x98CC, 0xC0E7, 0x98CD, 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, + 0xC0EB, 0x98D0, 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, + 0x98D3, 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, 0xC0F8, + 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, 0xC0FC, 0x98DC, + 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, 0xC100, 0xBCA8, 0xC101, + 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, 0xC104, 0xBCA9, 0xC105, 0x98E3, + 0xC106, 0x98E4, 0xC107, 0x98E5, 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, + 0x98E7, 0xC10B, 0x98E8, 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, + 0xC10F, 0x98EC, 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, + 0x98EF, 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, + 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, 0xC11C, + 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, 0xC120, 0xBCB1, + 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, 0xC124, 0xBCB3, 0xC125, + 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, 0xC128, 0x98FA, 0xC129, 0x98FB, + 0xC12A, 0x98FC, 0xC12B, 0x98FD, 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, + 0x98FE, 0xC12F, 0xBCB8, 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, + 0xC133, 0x9942, 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, + 0x9945, 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, 0xC140, + 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, 0xC144, 0x994E, + 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, 0xC148, 0xBCC0, 0xC149, + 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, + 0xC14E, 0x9953, 0xC14F, 0x9954, 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, + 0x9957, 0xC153, 0x9958, 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, + 0xC157, 0x995A, 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, + 0x9963, 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, + 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, 0xC164, + 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, 0xC168, 0xBCCC, + 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, 0xC16C, 0x996E, 0xC16D, + 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, 0xC170, 0xBCCE, 0xC171, 0x9972, + 0xC172, 0x9973, 0xC173, 0x9974, 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, + 0x9976, 0xC177, 0x9977, 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, + 0xC17B, 0x997A, 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, + 0x9984, 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, 0xC188, + 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, 0xC18C, 0xBCD2, + 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, 0xC190, 0xBCD5, 0xC191, + 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, 0xC194, 0xBCD6, 0xC195, 0x9994, + 0xC196, 0xBCD7, 0xC197, 0x9995, 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, + 0x9998, 0xC19B, 0x9999, 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, + 0xC19F, 0xBCDA, 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, + 0x999D, 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, + 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, 0xC1AC, + 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, 0xC1B0, 0xBCE0, + 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, 0xC1B4, 0x99A9, 0xC1B5, + 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, + 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, + 0x99B2, 0xC1BF, 0x99B3, 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, + 0xC1C3, 0x99B7, 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, + 0x99BA, 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, 0xC1D0, + 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, 0xC1D4, 0xBCE5, + 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, 0xC1D8, 0xBCE7, 0xC1D9, + 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, + 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, + 0x99CF, 0xC1E3, 0x99D0, 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, + 0xC1E7, 0x99D3, 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, + 0x99D6, 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, + 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, 0xC1F4, + 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, 0xC1F8, 0x99E0, + 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, 0xC1FC, 0xBCEE, 0xC1FD, + 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, 0xC200, 0xBCF0, 0xC201, 0x99E6, + 0xC202, 0x99E7, 0xC203, 0x99E8, 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, + 0x99EA, 0xC207, 0x99EB, 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, + 0xC20B, 0x99EF, 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, + 0xBCF4, 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, 0xC218, + 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, 0xC21C, 0xBCF8, + 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, 0xC220, 0xBCFA, 0xC221, + 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, 0xC224, 0x9A41, 0xC225, 0x9A42, + 0xC226, 0x9A43, 0xC227, 0x9A44, 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, + 0x9A45, 0xC22B, 0xBCFD, 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, + 0xC22F, 0xBDA1, 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, + 0x9A49, 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, + 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, 0xC23C, + 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, 0xC240, 0x9A55, + 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, 0xC244, 0x9A59, 0xC245, + 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, 0xC248, 0xBDA5, 0xC249, 0x9A63, + 0xC24A, 0x9A64, 0xC24B, 0x9A65, 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, + 0x9A68, 0xC24F, 0x9A69, 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, + 0xC253, 0x9A6B, 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, + 0x9A6E, 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, 0xC260, + 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, 0xC264, 0x9A79, + 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, 0xC268, 0x9A82, 0xC269, + 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, + 0xC26E, 0x9A86, 0xC26F, 0x9A87, 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, + 0x9A89, 0xC273, 0x9A8A, 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, + 0xC277, 0x9A8D, 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, + 0x9A91, 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, + 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, 0xC284, + 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, 0xC288, 0xBDB4, + 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, 0xC28C, 0x9A9C, 0xC28D, + 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, 0xC290, 0xBDB6, 0xC291, 0x9AA0, + 0xC292, 0x9AA1, 0xC293, 0x9AA2, 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, + 0x9AA5, 0xC297, 0x9AA6, 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, + 0xC29B, 0xBDB8, 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, + 0x9AAB, 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, 0xC2A8, + 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, 0xC2AC, 0xBDBD, + 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, 0xC2B0, 0x9AB7, 0xC2B1, + 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, + 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, + 0x9ABD, 0xC2BB, 0x9ABE, 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, + 0xC2BF, 0x9AC2, 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, + 0x9AC6, 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, + 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, 0xC2CC, + 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, 0xC2D0, 0x9AD3, + 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, 0xC2D4, 0x9AD7, 0xC2D5, + 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, + 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, + 0x9ADF, 0xC2DF, 0x9AE0, 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, + 0xC2E3, 0xBDC6, 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, + 0x9AE5, 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, 0xC2F0, + 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, 0xC2F4, 0x9AED, + 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, 0xC2F8, 0xBDCE, 0xC2F9, + 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, + 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, + 0x9AF5, 0xC303, 0x9AF6, 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, + 0xC307, 0x9AFA, 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, + 0x9AFC, 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, + 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, 0xC314, + 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, 0xC318, 0xBDDA, + 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, 0xC31C, 0xBDDB, 0xC31D, + 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, 0xC320, 0x9B4C, 0xC321, 0x9B4D, + 0xC322, 0x9B4E, 0xC323, 0x9B4F, 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, + 0x9B50, 0xC327, 0x9B51, 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, + 0xC32B, 0x9B53, 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, + 0x9B57, 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, 0xC338, + 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, 0xC33C, 0x9B6A, + 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, 0xC340, 0x9B6E, 0xC341, + 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, 0xC344, 0x9B72, 0xC345, 0xBDE0, + 0xC346, 0x9B73, 0xC347, 0x9B74, 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, + 0x9B77, 0xC34B, 0x9B78, 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, + 0xC34F, 0x9B82, 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, + 0x9B86, 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, + 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, 0xC35C, + 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, 0xC360, 0x9B93, + 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, 0xC364, 0x9B97, 0xC365, + 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, 0xC368, 0xBDE1, 0xC369, 0xBDE2, + 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, + 0x9B9E, 0xC36F, 0x9B9F, 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, + 0xC373, 0x9BA1, 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, + 0x9BA5, 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, 0xC380, + 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, 0xC384, 0xBDEA, + 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, 0xC388, 0xBDEB, 0xC389, + 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, + 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, + 0x9BB9, 0xC393, 0x9BBA, 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, + 0xC397, 0x9BBE, 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, + 0x9BC2, 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, + 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, 0xC3A4, + 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, 0xC3A8, 0x9BCF, + 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, 0xC3AC, 0x9BD3, 0xC3AD, + 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, + 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, + 0x9BDD, 0xC3B7, 0x9BDE, 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, + 0xC3BB, 0x9BE2, 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, + 0x9BE6, 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, 0xC3C8, + 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, 0xC3CC, 0x9BF2, + 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, 0xC3D0, 0x9BF6, 0xC3D1, + 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, + 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, + 0x9BFE, 0xC3DB, 0x9C41, 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, + 0xC3DF, 0xBDF1, 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, + 0x9C45, 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, + 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, 0xC3EC, + 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, 0xC3F0, 0x9C4F, + 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, 0xC3F4, 0xBDF7, 0xC3F5, + 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, + 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, + 0x9C5A, 0xC3FF, 0x9C61, 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, + 0xC403, 0x9C65, 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, + 0x9C69, 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, 0xC410, + 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, 0xC414, 0x9C74, + 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, 0xC418, 0x9C78, 0xC419, + 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, 0xC41C, 0x9C82, 0xC41D, 0x9C83, + 0xC41E, 0x9C84, 0xC41F, 0x9C85, 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, + 0x9C88, 0xC423, 0x9C89, 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, + 0xC427, 0x9C8C, 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, + 0x9C90, 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, + 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, 0xC434, + 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, 0xC438, 0x9C9A, + 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, 0xC43C, 0xBEA2, 0xC43D, + 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, 0xC440, 0x9CA0, 0xC441, 0x9CA1, + 0xC442, 0x9CA2, 0xC443, 0x9CA3, 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, + 0x9CA6, 0xC447, 0x9CA7, 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, + 0xC44B, 0x9CAA, 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, + 0x9CAE, 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, 0xC458, + 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, 0xC45C, 0x9CBB, + 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, 0xC460, 0x9CBF, 0xC461, + 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, 0xC464, 0xBEA5, 0xC465, 0xBEA6, + 0xC466, 0x9CC3, 0xC467, 0x9CC4, 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, + 0x9CC6, 0xC46B, 0x9CC7, 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, + 0xC46F, 0x9CCA, 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, + 0x9CCE, 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, + 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, 0xC47C, + 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, 0xC480, 0xBEAC, + 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, 0xC484, 0x9CDB, 0xC485, + 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, 0xC488, 0x9CDF, 0xC489, 0x9CE0, + 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, + 0x9CE5, 0xC48F, 0x9CE6, 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, + 0xC493, 0x9CEA, 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, + 0x9CED, 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, 0xC4A0, + 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, 0xC4A4, 0x9CF9, + 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, 0xC4A8, 0x9CFD, 0xC4A9, + 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, + 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, + 0x9D49, 0xC4B3, 0x9D4A, 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, + 0xC4B7, 0x9D4E, 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, + 0x9D51, 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, + 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, 0xC4C4, + 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, 0xC4C8, 0x9D63, + 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, 0xC4CC, 0x9D67, 0xC4CD, + 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, + 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, + 0x9D71, 0xC4D7, 0x9D72, 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, + 0xC4DB, 0x9D76, 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, + 0x9D7A, 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, 0xC4E8, + 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, 0xC4EC, 0x9D8C, + 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, 0xC4F0, 0xBEB2, 0xC4F1, + 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, + 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, + 0xBEB6, 0xC4FB, 0x9D96, 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, + 0xC4FF, 0xBEB7, 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, + 0x9D9B, 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, + 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, 0xC50C, + 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, 0xC510, 0xBEBB, + 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, 0xC514, 0xBEBC, 0xC515, + 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, 0xC518, 0x9DAD, 0xC519, 0x9DAE, + 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, + 0x9DB2, 0xC51F, 0x9DB3, 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, + 0xC523, 0x9DB7, 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, + 0x9DBB, 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, 0xC530, + 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, 0xC534, 0x9DC4, + 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, 0xC538, 0xBEC2, 0xC539, + 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, + 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, + 0x9DCE, 0xC543, 0x9DCF, 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, + 0xC547, 0x9DD1, 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, + 0x9DD2, 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, + 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, 0xC554, + 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, 0xC558, 0xBED2, + 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, 0xC55C, 0x9DDA, 0xC55D, + 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, 0xC560, 0xBED6, 0xC561, 0xBED7, + 0xC562, 0x9DDC, 0xC563, 0x9DDD, 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, + 0x9DDF, 0xC567, 0x9DE0, 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, + 0xC56B, 0x9DE3, 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, + 0x9DE7, 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, 0xC578, + 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, 0xC57C, 0xBEDF, + 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, 0xC580, 0xBEE1, 0xC581, + 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, 0xC584, 0xBEE2, 0xC585, 0x9DF4, + 0xC586, 0x9DF5, 0xC587, 0xBEE3, 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, + 0x9DF8, 0xC58B, 0x9DF9, 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, + 0xC58F, 0xBEE6, 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, + 0x9DFD, 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, + 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, 0xC59C, + 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, 0xC5A0, 0xBEEC, + 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, 0xC5A4, 0x9E4B, 0xC5A5, + 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, + 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, + 0x9E54, 0xC5AF, 0x9E55, 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, + 0xC5B3, 0x9E59, 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, + 0x9E61, 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, 0xC5C0, + 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, 0xC5C4, 0xBEF6, + 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, 0xC5C8, 0xBEFA, 0xC5C9, + 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, + 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, + 0x9E6B, 0xC5D3, 0x9E6C, 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, + 0xC5D7, 0x9E6F, 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, + 0x9E72, 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, + 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, 0xC5E4, + 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, 0xC5E8, 0x9E81, + 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, 0xC5EC, 0xBFA9, 0xC5ED, + 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, + 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, + 0xBFAE, 0xC5F7, 0xBFAF, 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, + 0xC5FB, 0x9E8D, 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, + 0xBFB3, 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, 0xC608, + 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, 0xC60C, 0xBFBA, + 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, 0xC610, 0xBFBB, 0xC611, + 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, 0xC614, 0x9E9A, 0xC615, 0x9E9B, + 0xC616, 0x9E9C, 0xC617, 0x9E9D, 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, + 0x9E9E, 0xC61B, 0xBFBE, 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, + 0xC61F, 0x9EA1, 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, + 0x9EA5, 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, + 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, 0xC62C, + 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, 0xC630, 0xBFC6, + 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, 0xC634, 0xBFC8, 0xC635, + 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, 0xC638, 0x9EAF, 0xC639, 0xBFCB, + 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, + 0x9EB3, 0xC63F, 0x9EB4, 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, + 0xC643, 0x9EB6, 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, + 0x9EB9, 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, 0xC650, + 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, 0xC654, 0xBFD4, + 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, 0xC658, 0x9EC4, 0xC659, + 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, + 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, + 0x9ECB, 0xC663, 0x9ECC, 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, + 0xC667, 0x9ED0, 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, + 0x9ED4, 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, + 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, 0xC674, + 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, 0xC678, 0xBFDC, + 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, 0xC67C, 0xBFDE, 0xC67D, + 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, 0xC680, 0xBFDF, 0xC681, 0x9EE3, + 0xC682, 0x9EE4, 0xC683, 0x9EE5, 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, + 0x9EE8, 0xC687, 0x9EE9, 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, + 0xC68B, 0xBFE2, 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, + 0x9EED, 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, 0xC698, + 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, 0xC69C, 0xBFE7, + 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, 0xC6A0, 0x9EFA, 0xC6A1, + 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, + 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, + 0x9F42, 0xC6AB, 0x9F43, 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, + 0xC6AF, 0x9F47, 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, + 0x9F49, 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, + 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, 0xC6BC, + 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, 0xC6C0, 0xBFF2, + 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, 0xC6C4, 0x9F53, 0xC6C5, + 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, + 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, + 0x9F5A, 0xC6CF, 0x9F61, 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, + 0xC6D3, 0x9F64, 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, + 0x9F67, 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, 0xC6E0, + 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, 0xC6E4, 0x9F70, + 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, 0xC6E8, 0xBFFE, 0xC6E9, + 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, + 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, + 0x9F7A, 0xC6F3, 0x9F81, 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, + 0xC6F7, 0x9F85, 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, + 0x9F87, 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, + 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, 0xC704, + 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, 0xC708, 0xC0A9, + 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, 0xC70C, 0xC0AA, 0xC70D, + 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, 0xC710, 0x9F97, 0xC711, 0x9F98, + 0xC712, 0x9F99, 0xC713, 0x9F9A, 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, + 0x9F9B, 0xC717, 0xC0AD, 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, + 0xC71B, 0x9F9E, 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, + 0x9FA2, 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, 0xC728, + 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, 0xC72C, 0x9FAB, + 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, 0xC730, 0xC0B3, 0xC731, + 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, 0xC734, 0x9FB0, 0xC735, 0xC0B6, + 0xC736, 0x9FB1, 0xC737, 0xC0B7, 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, + 0x9FB4, 0xC73B, 0x9FB5, 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, + 0xC73F, 0x9FB7, 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, + 0x9FBA, 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, + 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, 0xC74C, + 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, 0xC750, 0x9FC2, + 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, 0xC754, 0xC0C3, 0xC755, + 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, 0xC758, 0xC0C7, 0xC759, 0x9FC3, + 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, + 0x9FC7, 0xC75F, 0x9FC8, 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, + 0xC763, 0x9FCB, 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, + 0x9FCF, 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, 0xC770, + 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, 0xC774, 0xC0CC, + 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, 0xC778, 0xC0CE, 0xC779, + 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, + 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, + 0x9FE2, 0xC783, 0xC0D2, 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, + 0xC787, 0xC0D5, 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, + 0x9FE4, 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, + 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, 0xC794, + 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, 0xC798, 0xC0DF, + 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, 0xC79C, 0x9FED, 0xC79D, + 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, + 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, + 0xC0E6, 0xC7A7, 0x9FF2, 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, + 0xC7AB, 0x9FF6, 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, + 0x9FF8, 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, 0xC7B8, + 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, 0xC7BC, 0xC0EB, + 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, 0xC7C0, 0xC0EE, 0xC7C1, + 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, 0xC7C4, 0xA048, 0xC7C5, 0xA049, + 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, + 0xA04C, 0xC7CB, 0xA04D, 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, + 0xC7CF, 0xA04F, 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, + 0xA052, 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, + 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, 0xC7DC, + 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, 0xC7E0, 0xA063, + 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, 0xC7E4, 0xC0F7, 0xC7E5, + 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, + 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, + 0xA06E, 0xC7EF, 0xA06F, 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, + 0xC7F3, 0xA073, 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, + 0xA077, 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, 0xC800, + 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, 0xC804, 0xC0FC, + 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, 0xC808, 0xC0FD, 0xC809, + 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, 0xC80C, 0xA08D, 0xC80D, 0xA08E, + 0xC80E, 0xA08F, 0xC80F, 0xA090, 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, + 0xA091, 0xC813, 0xC1A3, 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, + 0xC817, 0xA093, 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, + 0xA097, 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, + 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, 0xC824, + 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, 0xC828, 0xA0A0, + 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, 0xC82C, 0xC1AA, 0xC82D, + 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, 0xC830, 0xA0A5, 0xC831, 0xC1AD, + 0xC832, 0xA0A6, 0xC833, 0xA0A7, 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, + 0xA0AA, 0xC837, 0xA0AB, 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, + 0xC83B, 0xA0AE, 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, + 0xA0B1, 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, 0xC848, + 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, 0xC84C, 0xC1B3, + 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, 0xC850, 0xA0BD, 0xC851, + 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, 0xC854, 0xC1B5, 0xC855, 0xA0C1, + 0xC856, 0xA0C2, 0xC857, 0xA0C3, 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, + 0xA0C6, 0xC85B, 0xA0C7, 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, + 0xC85F, 0xA0CB, 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, + 0xA0CF, 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, + 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, 0xC86C, + 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, 0xC870, 0xC1B6, + 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, 0xC874, 0xC1B8, 0xC875, + 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, 0xC878, 0xC1B9, 0xC879, 0xA0E1, + 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, + 0xA0E5, 0xC87F, 0xA0E6, 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, + 0xC883, 0xC1BD, 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, + 0xC1C0, 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, 0xC890, + 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, 0xC894, 0xC1C4, + 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, 0xC898, 0xA0F5, 0xC899, + 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, + 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, + 0xA0FC, 0xC8A3, 0xA0FD, 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, + 0xC8A7, 0xA143, 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, + 0xA146, 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, + 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, 0xC8B4, + 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, 0xC8B8, 0xA153, + 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, 0xC8BC, 0xC1C9, 0xC8BD, + 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, 0xC8C0, 0xA159, 0xC8C1, 0xA15A, + 0xC8C2, 0xA161, 0xC8C3, 0xA162, 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, + 0xA164, 0xC8C7, 0xA165, 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, + 0xC8CB, 0xA168, 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, + 0xA16B, 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, 0xC8D8, + 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, 0xC8DC, 0xA174, + 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, 0xC8E0, 0xC1D2, 0xC8E1, + 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, + 0xC8E6, 0xA181, 0xC8E7, 0xA182, 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, + 0xA185, 0xC8EB, 0xA186, 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, + 0xC8EF, 0xA18A, 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, + 0xA18E, 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, + 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, 0xC8FC, + 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, 0xC900, 0xC1D8, + 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, 0xC904, 0xC1D9, 0xC905, + 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, 0xC908, 0xA19C, 0xC909, 0xA19D, + 0xC90A, 0xA19E, 0xC90B, 0xA19F, 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, + 0xA1A0, 0xC90F, 0xC1DE, 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, + 0xC913, 0xA243, 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, + 0xA247, 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, 0xC920, + 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, 0xC924, 0xA253, + 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, 0xC928, 0xA257, 0xC929, + 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, 0xC92C, 0xC1E1, 0xC92D, 0xA261, + 0xC92E, 0xA262, 0xC92F, 0xA263, 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, + 0xA266, 0xC933, 0xA267, 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, + 0xC937, 0xA26A, 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, + 0xA26E, 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, + 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, 0xC944, + 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, 0xC948, 0xA281, + 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, 0xC94C, 0xA285, 0xC94D, + 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, 0xC950, 0xC1E3, 0xC951, 0xC1E4, + 0xC952, 0xA289, 0xC953, 0xA28A, 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, + 0xA28C, 0xC957, 0xA28D, 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, + 0xC95B, 0xA290, 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, + 0xA294, 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, 0xC968, + 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, 0xC96C, 0xC1EA, + 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, 0xC970, 0xC1EB, 0xC971, + 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, 0xC974, 0xC1EC, 0xC975, 0xA344, + 0xC976, 0xA345, 0xC977, 0xA346, 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, + 0xA349, 0xC97B, 0xA34A, 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, + 0xC97F, 0xA34D, 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, + 0xA351, 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, + 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, 0xC98C, + 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, 0xC990, 0xC1F1, + 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, 0xC994, 0xA364, 0xC995, + 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, 0xC998, 0xC1F2, 0xC999, 0xC1F3, + 0xC99A, 0xA368, 0xC99B, 0xC1F4, 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, + 0xA36A, 0xC99F, 0xA36B, 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, + 0xC9A3, 0xA36F, 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, + 0xA373, 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, 0xC9B0, + 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, 0xC9B4, 0xA386, + 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, 0xC9B8, 0xA38A, 0xC9B9, + 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, + 0xC9BE, 0xA390, 0xC9BF, 0xA391, 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, + 0xA392, 0xC9C3, 0xA393, 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, + 0xC9C7, 0xC1F9, 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, + 0xA397, 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, + 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, 0xC9D4, + 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, 0xC9D8, 0xA39F, + 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, 0xC9DC, 0xC2A5, 0xC9DD, + 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, + 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, + 0xA446, 0xC9E7, 0xC2AA, 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, + 0xC9EB, 0xA44A, 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, + 0xC2AD, 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, 0xC9F8, + 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, 0xC9FC, 0xC2B2, + 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, 0xCA00, 0xC2B3, 0xCA01, + 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, 0xCA04, 0xA45A, 0xCA05, 0xA461, + 0xCA06, 0xA462, 0xCA07, 0xA463, 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, + 0xA464, 0xCA0B, 0xC2B6, 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, + 0xCA0F, 0xA466, 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, + 0xA46A, 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, + 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, 0xCA1C, + 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, 0xCA20, 0xA475, + 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, 0xCA24, 0xA479, 0xCA25, + 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, 0xCA28, 0xA483, 0xCA29, 0xC2BB, + 0xCA2A, 0xA484, 0xCA2B, 0xA485, 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, + 0xA488, 0xCA2F, 0xA489, 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, + 0xCA33, 0xA48D, 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, + 0xA491, 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, 0xCA40, + 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, 0xCA44, 0xA49E, + 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, 0xCA48, 0xA542, 0xCA49, + 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, + 0xCA4E, 0xA546, 0xCA4F, 0xA547, 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, + 0xA549, 0xCA53, 0xA54A, 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, + 0xCA57, 0xA54D, 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, + 0xA551, 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, + 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, 0xCA64, + 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, 0xCA68, 0xC2C5, + 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, 0xCA6C, 0xA562, 0xCA6D, + 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, 0xCA70, 0xA566, 0xCA71, 0xA567, + 0xCA72, 0xA568, 0xCA73, 0xA569, 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, + 0xA56C, 0xCA77, 0xA56D, 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, + 0xCA7B, 0xA571, 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, + 0xA574, 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, 0xCA88, + 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, 0xCA8C, 0xA586, + 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, 0xCA90, 0xA58A, 0xCA91, + 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, 0xCA94, 0xA58E, 0xCA95, 0xA58F, + 0xCA96, 0xA590, 0xCA97, 0xA591, 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, + 0xA593, 0xCA9B, 0xA594, 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, + 0xCA9F, 0xA598, 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, + 0xA59C, 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, + 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, 0xCAAC, + 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, 0xCAB0, 0xA649, + 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, 0xCAB4, 0xA64D, 0xCAB5, + 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, 0xCAB8, 0xA651, 0xCAB9, 0xA652, + 0xCABA, 0xA653, 0xCABB, 0xA654, 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, + 0xA655, 0xCABF, 0xA656, 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, + 0xCAC3, 0xA659, 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, + 0xA662, 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, 0xCAD0, + 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, 0xCAD4, 0xA66A, + 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, 0xCAD8, 0xC2D2, 0xCAD9, + 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, 0xCADC, 0xA670, 0xCADD, 0xA671, + 0xCADE, 0xA672, 0xCADF, 0xA673, 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, + 0xA675, 0xCAE3, 0xA676, 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, + 0xCAE7, 0xA67A, 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, + 0xA684, 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, + 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, 0xCAF4, + 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, 0xCAF8, 0xA68F, + 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, 0xCAFC, 0xA693, 0xCAFD, + 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, 0xCB00, 0xA697, 0xCB01, 0xA698, + 0xCB02, 0xA699, 0xCB03, 0xA69A, 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, + 0xA69D, 0xCB07, 0xA69E, 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, + 0xCB0B, 0xA741, 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, + 0xA745, 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, 0xCB18, + 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, 0xCB1C, 0xA74F, + 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, 0xCB20, 0xC2DB, 0xCB21, + 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, 0xCB24, 0xA755, 0xCB25, 0xA756, + 0xCB26, 0xA757, 0xCB27, 0xA758, 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, + 0xA761, 0xCB2B, 0xA762, 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, + 0xCB2F, 0xA766, 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, + 0xA76A, 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, + 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, 0xCB3C, + 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, 0xCB40, 0xA777, + 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, 0xCB44, 0xA77A, 0xCB45, + 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, + 0xCB4A, 0xA784, 0xCB4B, 0xA785, 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, + 0xA787, 0xCB4F, 0xA788, 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, + 0xCB53, 0xA78B, 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, + 0xA78F, 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, 0xCB60, + 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, 0xCB64, 0xC2E5, + 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, 0xCB68, 0xA79C, 0xCB69, + 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, + 0xCB6E, 0xA842, 0xCB6F, 0xA843, 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, + 0xA846, 0xCB73, 0xA847, 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, + 0xCB77, 0xA84B, 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, + 0xA84D, 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, + 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, 0xCB84, + 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, 0xCB88, 0xA85A, + 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, 0xCB8C, 0xA864, 0xCB8D, + 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, 0xCB90, 0xA868, 0xCB91, 0xA869, + 0xCB92, 0xA86A, 0xCB93, 0xA86B, 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, + 0xA86E, 0xCB97, 0xA86F, 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, + 0xCB9B, 0xA873, 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, + 0xA876, 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, 0xCBA8, + 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, 0xCBAC, 0xA889, + 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, 0xCBB0, 0xA88D, 0xCBB1, + 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, 0xCBB4, 0xA891, 0xCBB5, 0xA892, + 0xCBB6, 0xA893, 0xCBB7, 0xA894, 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, + 0xA896, 0xCBBB, 0xA897, 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, + 0xCBBF, 0xA89B, 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, + 0xA89F, 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, + 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, 0xCBCC, + 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, 0xCBD0, 0xA94C, + 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, 0xCBD4, 0xC2EA, 0xCBD5, + 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, 0xCBD8, 0xA953, 0xCBD9, 0xA954, + 0xCBDA, 0xA955, 0xCBDB, 0xA956, 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, + 0xA959, 0xCBDF, 0xA95A, 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, + 0xCBE3, 0xA964, 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, + 0xC2EC, 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, 0xCBF0, + 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, 0xCBF4, 0xA972, + 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, 0xCBF8, 0xA976, 0xCBF9, + 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, 0xCBFC, 0xA97A, 0xCBFD, 0xA981, + 0xCBFE, 0xA982, 0xCBFF, 0xA983, 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, + 0xA986, 0xCC03, 0xA987, 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, + 0xCC07, 0xA98B, 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, + 0xA98F, 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, + 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, 0xCC14, + 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, 0xCC18, 0xA998, + 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, 0xCC1C, 0xC2F2, 0xCC1D, + 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, 0xCC20, 0xA99E, 0xCC21, 0xC2F4, + 0xCC22, 0xC2F5, 0xCC23, 0xA99F, 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, + 0xAA42, 0xCC27, 0xC2F6, 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, + 0xCC2B, 0xAA44, 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, + 0xAA46, 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, 0xCC38, + 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, 0xCC3C, 0xC3A1, + 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, 0xCC40, 0xAA50, 0xCC41, + 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, + 0xCC46, 0xAA54, 0xCC47, 0xAA55, 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, + 0xAA57, 0xCC4B, 0xAA58, 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, + 0xCC4F, 0xAA61, 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, + 0xAA65, 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, + 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, 0xCC5C, + 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, 0xCC60, 0xC3AD, + 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, 0xCC64, 0xC3AE, 0xCC65, + 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, 0xCC68, 0xC3B0, 0xCC69, 0xAA72, + 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, + 0xAA77, 0xCC6F, 0xAA78, 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, + 0xCC73, 0xAA81, 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, + 0xAA84, 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, 0xCC80, + 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, 0xCC84, 0xAA91, + 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, 0xCC88, 0xAA95, 0xCC89, + 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, + 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, + 0xAA9F, 0xCC93, 0xAAA0, 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, + 0xCC97, 0xAB44, 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, + 0xAB46, 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, + 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, 0xCCA4, + 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, 0xCCA8, 0xC3B7, + 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, 0xCCAC, 0xC3BA, 0xCCAD, + 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, + 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, + 0xAB58, 0xCCB7, 0xAB59, 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, + 0xCCBB, 0xAB62, 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, + 0xAB65, 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, 0xCCC8, + 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, 0xCCCC, 0xAB6E, + 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, 0xCCD0, 0xC3C4, 0xCCD1, + 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, + 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, + 0xAB7A, 0xCCDB, 0xAB81, 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, + 0xCCDF, 0xAB85, 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, + 0xAB89, 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, + 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, 0xCCEC, + 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, 0xCCF0, 0xC3C8, + 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, 0xCCF4, 0xAB97, 0xCCF5, + 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, + 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, + 0xAC41, 0xCCFF, 0xAC42, 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, + 0xCD03, 0xAC45, 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, + 0xAC49, 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, 0xCD10, + 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, 0xCD14, 0xAC52, + 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, 0xCD18, 0xC3CE, 0xCD19, + 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, + 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, + 0xAC62, 0xCD23, 0xAC63, 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, + 0xCD27, 0xAC66, 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, + 0xAC69, 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, + 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, 0xCD34, + 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, 0xCD38, 0xAC75, + 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, 0xCD3C, 0xAC78, 0xCD3D, + 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, 0xCD40, 0xAC82, 0xCD41, 0xAC83, + 0xCD42, 0xAC84, 0xCD43, 0xAC85, 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, + 0xAC88, 0xCD47, 0xAC89, 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, + 0xCD4B, 0xAC8D, 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, + 0xAC91, 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, 0xCD58, + 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, 0xCD5C, 0xC3D6, + 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, 0xCD60, 0xC3D7, 0xCD61, + 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, 0xCD64, 0xC3D8, 0xCD65, 0xAD44, + 0xCD66, 0xAD45, 0xCD67, 0xAD46, 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, + 0xAD49, 0xCD6B, 0xAD4A, 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, + 0xCD6F, 0xC3DB, 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, + 0xAD4E, 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, + 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, 0xCD7C, + 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, 0xCD80, 0xAD5A, + 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, 0xCD84, 0xAD64, 0xCD85, + 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, 0xCD88, 0xC3DE, 0xCD89, 0xAD68, + 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, + 0xAD6D, 0xCD8F, 0xAD6E, 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, + 0xCD93, 0xAD72, 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, + 0xAD74, 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, 0xCDA0, + 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, 0xCDA4, 0xC3E3, + 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, 0xCDA8, 0xAD86, 0xCDA9, + 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, + 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, + 0xAD8E, 0xCDB3, 0xAD8F, 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, + 0xCDB7, 0xAD93, 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, + 0xAD97, 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, + 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, 0xCDC4, + 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, 0xCDC8, 0xAE43, + 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, 0xCDCC, 0xC3E9, 0xCDCD, + 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, + 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, + 0xAE4F, 0xCDD7, 0xAE50, 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, + 0xCDDB, 0xAE54, 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, + 0xAE58, 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, 0xCDE8, + 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, 0xCDEC, 0xC3EC, + 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, 0xCDF0, 0xC3ED, 0xCDF1, + 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, + 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, + 0xAE74, 0xCDFB, 0xC3F0, 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, + 0xCDFF, 0xAE77, 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, + 0xAE81, 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, + 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, 0xCE0C, + 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, 0xCE10, 0xAE8B, + 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, 0xCE14, 0xC3F5, 0xCE15, + 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, 0xCE18, 0xAE92, 0xCE19, 0xC3F6, + 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, + 0xAE97, 0xCE1F, 0xAE98, 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, + 0xCE23, 0xAE9A, 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, + 0xAE9D, 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, 0xCE30, + 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, 0xCE34, 0xAF46, + 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, 0xCE38, 0xAF49, 0xCE39, + 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, + 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, + 0xAF53, 0xCE43, 0xAF54, 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, + 0xCE47, 0xAF58, 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, + 0xAF62, 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, + 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, 0xCE54, + 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, 0xCE58, 0xC4A1, + 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, 0xCE5C, 0xC4A3, 0xCE5D, + 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, + 0xCE62, 0xAF73, 0xCE63, 0xAF74, 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, + 0xAF77, 0xCE67, 0xAF78, 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, + 0xCE6B, 0xC4A9, 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, + 0xAF82, 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, 0xCE78, + 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, 0xCE7C, 0xC4AE, + 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, 0xCE80, 0xAF8F, 0xCE81, + 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, + 0xCE86, 0xAF93, 0xCE87, 0xC4B1, 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, + 0xAF95, 0xCE8B, 0xAF96, 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, + 0xCE8F, 0xAF9A, 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, + 0xAF9C, 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, + 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, 0xCE9C, + 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, 0xCEA0, 0xC4B7, + 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, 0xCEA4, 0xC4BA, 0xCEA5, + 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, + 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, + 0xB04E, 0xCEAF, 0xB04F, 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, + 0xCEB3, 0xB053, 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, + 0xB057, 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, 0xCEC0, + 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, 0xCEC4, 0xB069, + 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, 0xCEC8, 0xB06D, 0xCEC9, + 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, 0xCECC, 0xB071, 0xCECD, 0xB072, + 0xCECE, 0xB073, 0xCECF, 0xB074, 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, + 0xB077, 0xCED3, 0xB078, 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, + 0xCED7, 0xB082, 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, + 0xB086, 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, + 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, 0xCEE4, + 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, 0xCEE8, 0xC4C1, + 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, 0xCEEC, 0xC4C3, 0xCEED, + 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, 0xCEF0, 0xB096, 0xCEF1, 0xB097, + 0xCEF2, 0xB098, 0xCEF3, 0xB099, 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, + 0xB09A, 0xCEF7, 0xC4C6, 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, + 0xCEFB, 0xB09C, 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, + 0xB0A0, 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, 0xCF08, + 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, 0xCF0C, 0xB149, + 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, 0xCF10, 0xC4CD, 0xCF11, + 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, 0xCF14, 0xB14E, 0xCF15, 0xC4D0, + 0xCF16, 0xB14F, 0xCF17, 0xB150, 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, + 0xB153, 0xCF1B, 0xB154, 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, + 0xCF1F, 0xB157, 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, + 0xB15A, 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, + 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, 0xCF2C, + 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, 0xCF30, 0xC4D7, + 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, 0xCF34, 0xB16B, 0xCF35, + 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, 0xCF38, 0xC4D9, 0xCF39, 0xB16F, + 0xCF3A, 0xB170, 0xCF3B, 0xB171, 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, + 0xB174, 0xCF3F, 0xB175, 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, + 0xCF43, 0xB179, 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, + 0xB183, 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, 0xCF50, + 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, 0xCF54, 0xC4DA, + 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, 0xCF58, 0xC4DC, 0xCF59, + 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, + 0xCF5E, 0xB196, 0xCF5F, 0xB197, 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, + 0xB19A, 0xCF63, 0xB19B, 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, + 0xCF67, 0xC4E0, 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, + 0xB19F, 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, + 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, 0xCF74, + 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, 0xCF78, 0xC4E5, + 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, 0xCF7C, 0xB24C, 0xCF7D, + 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, 0xCF80, 0xC4E6, 0xCF81, 0xB250, + 0xCF82, 0xB251, 0xCF83, 0xB252, 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, + 0xB254, 0xCF87, 0xB255, 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, + 0xCF8B, 0xB259, 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, + 0xB262, 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, 0xCF98, + 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, 0xCF9C, 0xB26F, + 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, 0xCFA0, 0xB273, 0xCFA1, + 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, 0xCFA4, 0xB276, 0xCFA5, 0xB277, + 0xCFA6, 0xB278, 0xCFA7, 0xB279, 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, + 0xB281, 0xCFAB, 0xB282, 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, + 0xCFAF, 0xB286, 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, + 0xB289, 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, + 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, 0xCFBC, + 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, 0xCFC0, 0xB296, + 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, 0xCFC4, 0xC4EC, 0xCFC5, + 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, + 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, + 0xB343, 0xCFCF, 0xB344, 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, + 0xCFD3, 0xB348, 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, + 0xB34C, 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, 0xCFE0, + 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, 0xCFE4, 0xC4EF, + 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, 0xCFE8, 0xC4F0, 0xCFE9, + 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, 0xCFEC, 0xB363, 0xCFED, 0xB364, + 0xCFEE, 0xB365, 0xCFEF, 0xB366, 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, + 0xB367, 0xCFF3, 0xC4F3, 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, + 0xCFF7, 0xB36A, 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, + 0xB36E, 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, + 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, 0xD004, + 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, 0xD008, 0xB378, + 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, 0xD00C, 0xB382, 0xD00D, + 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, 0xD010, 0xB386, 0xD011, 0xC4F8, + 0xD012, 0xB387, 0xD013, 0xB388, 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, + 0xB38B, 0xD017, 0xB38C, 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, + 0xD01B, 0xB38F, 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, + 0xB393, 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, 0xD028, + 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, 0xD02C, 0xB3A0, + 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, 0xD030, 0xB443, 0xD031, + 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, 0xD034, 0xC4FB, 0xD035, 0xC4FC, + 0xD036, 0xB447, 0xD037, 0xB448, 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, + 0xB44A, 0xD03B, 0xB44B, 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, + 0xD03F, 0xB44E, 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, + 0xB452, 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, + 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, 0xD04C, + 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, 0xD050, 0xC5A5, + 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, 0xD054, 0xC5A6, 0xD055, + 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, 0xD058, 0xC5A7, 0xD059, 0xB467, + 0xD05A, 0xB468, 0xD05B, 0xB469, 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, + 0xB46C, 0xD05F, 0xB46D, 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, + 0xD063, 0xB470, 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, + 0xB474, 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, 0xD070, + 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, 0xD074, 0xC5AC, + 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, 0xD078, 0xB487, 0xD079, + 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, + 0xD07E, 0xB48B, 0xD07F, 0xB48C, 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, + 0xB48E, 0xD083, 0xB48F, 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, + 0xD087, 0xB493, 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, + 0xB497, 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, + 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, 0xD094, + 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, 0xD098, 0xB544, + 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, 0xD09C, 0xB548, 0xD09D, + 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, + 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, + 0xB550, 0xD0A7, 0xB551, 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, + 0xD0AB, 0xB554, 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, + 0xB557, 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, 0xD0B8, + 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, 0xD0BC, 0xB566, + 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, 0xD0C0, 0xC5B8, 0xD0C1, + 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, + 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, + 0xB56F, 0xD0CB, 0xB570, 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, + 0xD0CF, 0xB574, 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, + 0xC5BF, 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, + 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, 0xD0DC, + 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, 0xD0E0, 0xC5C4, + 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, 0xD0E4, 0xC5C5, 0xD0E5, + 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, + 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, + 0xB58E, 0xD0EF, 0xC5C8, 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, + 0xD0F3, 0xB590, 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, + 0xB594, 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, 0xD100, + 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, 0xD104, 0xB5A0, + 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, 0xD108, 0xB644, 0xD109, + 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, 0xD10C, 0xB648, 0xD10D, 0xC5CC, + 0xD10E, 0xB649, 0xD10F, 0xB64A, 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, + 0xB64D, 0xD113, 0xB64E, 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, + 0xD117, 0xB652, 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, + 0xB656, 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, + 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, 0xD124, + 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, 0xD128, 0xB669, + 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, 0xD12C, 0xB66D, 0xD12D, + 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, 0xD130, 0xC5CD, 0xD131, 0xC5CE, + 0xD132, 0xB671, 0xD133, 0xB672, 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, + 0xB674, 0xD137, 0xB675, 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, + 0xD13B, 0xB677, 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, + 0xB681, 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, 0xD148, + 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, 0xD14C, 0xC5D7, + 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, 0xD150, 0xC5D9, 0xD151, + 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, 0xD154, 0xC5DA, 0xD155, 0xB68E, + 0xD156, 0xB68F, 0xD157, 0xB690, 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, + 0xB693, 0xD15B, 0xB694, 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, + 0xD15F, 0xC5DD, 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, + 0xB698, 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, + 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, 0xD16C, + 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, 0xD170, 0xB743, + 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, 0xD174, 0xB747, 0xD175, + 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, 0xD178, 0xB74B, 0xD179, 0xB74C, + 0xD17A, 0xB74D, 0xD17B, 0xB74E, 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, + 0xB750, 0xD17F, 0xB751, 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, + 0xD183, 0xB755, 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, + 0xB758, 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, 0xD190, + 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, 0xD194, 0xB76A, + 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, 0xD198, 0xB76E, 0xD199, + 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, 0xD19C, 0xB772, 0xD19D, 0xB773, + 0xD19E, 0xB774, 0xD19F, 0xB775, 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, + 0xB776, 0xD1A3, 0xB777, 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, + 0xD1A7, 0xB77A, 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, + 0xB783, 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, + 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, 0xD1B4, + 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, 0xD1B8, 0xB78C, + 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, 0xD1BC, 0xC5ED, 0xD1BD, + 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, + 0xD1C2, 0xB793, 0xD1C3, 0xB794, 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, + 0xB797, 0xD1C7, 0xB798, 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, + 0xD1CB, 0xB79C, 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, + 0xB7A0, 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, 0xD1D8, + 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, 0xD1DC, 0xB84C, + 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, 0xD1E0, 0xB850, 0xD1E1, + 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, 0xD1E4, 0xB854, 0xD1E5, 0xB855, + 0xD1E6, 0xB856, 0xD1E7, 0xB857, 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, + 0xB85A, 0xD1EB, 0xB861, 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, + 0xD1EF, 0xB865, 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, + 0xB869, 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, + 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, 0xD1FC, + 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, 0xD200, 0xB874, + 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, 0xD204, 0xB878, 0xD205, + 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, 0xD208, 0xB881, 0xD209, 0xC5F3, + 0xD20A, 0xB882, 0xD20B, 0xB883, 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, + 0xB886, 0xD20F, 0xB887, 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, + 0xD213, 0xB88A, 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, + 0xB88E, 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, 0xD220, + 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, 0xD224, 0xB89B, + 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, 0xD228, 0xB89F, 0xD229, + 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, + 0xD22E, 0xB943, 0xD22F, 0xB944, 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, + 0xB946, 0xD233, 0xB947, 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, + 0xD237, 0xB94A, 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, + 0xB94E, 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, + 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, 0xD244, + 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, 0xD248, 0xC5FD, + 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, 0xD24C, 0xB95A, 0xD24D, + 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, 0xD250, 0xB964, 0xD251, 0xB965, + 0xD252, 0xB966, 0xD253, 0xB967, 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, + 0xB96A, 0xD257, 0xB96B, 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, + 0xD25B, 0xB96F, 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, + 0xB972, 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, 0xD268, + 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, 0xD26C, 0xB984, + 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, 0xD270, 0xB988, 0xD271, + 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, 0xD274, 0xB98C, 0xD275, 0xB98D, + 0xD276, 0xB98E, 0xD277, 0xB98F, 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, + 0xB992, 0xD27B, 0xB993, 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, + 0xD27F, 0xB997, 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, + 0xB999, 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, + 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, 0xD28C, + 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, 0xD290, 0xC6A6, + 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, 0xD294, 0xBA46, 0xD295, + 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, 0xD298, 0xBA49, 0xD299, 0xBA4A, + 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, + 0xBA4E, 0xD29F, 0xBA4F, 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, + 0xD2A3, 0xBA52, 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, + 0xBA55, 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, 0xD2B0, + 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, 0xD2B4, 0xBA66, + 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, 0xD2B8, 0xC6AE, 0xD2B9, + 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, + 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, + 0xC6B3, 0xD2C3, 0xBA6F, 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, + 0xD2C7, 0xBA73, 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, + 0xC6B6, 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, + 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, 0xD2D4, + 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, 0xD2D8, 0xC6B8, + 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, 0xD2DC, 0xC6B9, 0xD2DD, + 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, + 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, + 0xBA90, 0xD2E7, 0xBA91, 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, + 0xD2EB, 0xBA95, 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, + 0xBA99, 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, 0xD2F8, + 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, 0xD2FC, 0xBB42, + 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, 0xD300, 0xC6C0, 0xD301, + 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, 0xD304, 0xBB47, 0xD305, 0xC6C3, + 0xD306, 0xBB48, 0xD307, 0xBB49, 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, + 0xBB4C, 0xD30B, 0xBB4D, 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, + 0xD30F, 0xBB4E, 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, + 0xBB51, 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, + 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, 0xD31C, + 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, 0xD320, 0xC6CD, + 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, 0xD324, 0xBB61, 0xD325, + 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, 0xD328, 0xC6D0, 0xD329, 0xC6D1, + 0xD32A, 0xBB64, 0xD32B, 0xBB65, 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, + 0xBB67, 0xD32F, 0xBB68, 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, + 0xD333, 0xBB6B, 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, + 0xBB6F, 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, 0xD340, + 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, 0xD344, 0xC6D9, + 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, 0xD348, 0xBB79, 0xD349, + 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, 0xD34C, 0xBB83, 0xD34D, 0xBB84, + 0xD34E, 0xBB85, 0xD34F, 0xBB86, 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, + 0xBB89, 0xD353, 0xBB8A, 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, + 0xD357, 0xBB8E, 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, + 0xBB92, 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, + 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, 0xD364, + 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, 0xD368, 0xBB9F, + 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, 0xD36C, 0xBC43, 0xD36D, + 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, 0xD370, 0xBC47, 0xD371, 0xBC48, + 0xD372, 0xBC49, 0xD373, 0xBC4A, 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, + 0xBC4D, 0xD377, 0xBC4E, 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, + 0xD37B, 0xBC52, 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, + 0xBC54, 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, 0xD388, + 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, 0xD38C, 0xC6DF, + 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, 0xD390, 0xC6E2, 0xD391, + 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, 0xD394, 0xBC68, 0xD395, 0xBC69, + 0xD396, 0xBC6A, 0xD397, 0xBC6B, 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, + 0xBC6C, 0xD39B, 0xBC6D, 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, + 0xD39F, 0xBC70, 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, + 0xBC73, 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, + 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, 0xD3AC, + 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, 0xD3B0, 0xBC82, + 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, 0xD3B4, 0xC6EC, 0xD3B5, + 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, + 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, + 0xBC8D, 0xD3BF, 0xBC8E, 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, + 0xD3C3, 0xBC92, 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, + 0xBC94, 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, 0xD3D0, + 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, 0xD3D4, 0xBC9E, + 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, 0xD3D8, 0xC6F4, 0xD3D9, + 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, + 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, + 0xBD4A, 0xD3E3, 0xC6F6, 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, + 0xD3E7, 0xBD4E, 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, + 0xBD52, 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, + 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, 0xD3F4, + 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, 0xD3F8, 0xBD61, + 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, 0xD3FC, 0xC6FB, 0xD3FD, + 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, 0xD400, 0xBD66, 0xD401, 0xC6FE, + 0xD402, 0xBD67, 0xD403, 0xBD68, 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, + 0xBD6B, 0xD407, 0xBD6C, 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, + 0xD40B, 0xBD6F, 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, + 0xBD73, 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, 0xD418, + 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, 0xD41C, 0xBD86, + 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, 0xD420, 0xBD89, 0xD421, + 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, 0xD424, 0xBD8D, 0xD425, 0xBD8E, + 0xD426, 0xBD8F, 0xD427, 0xBD90, 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, + 0xBD93, 0xD42B, 0xBD94, 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, + 0xD42F, 0xBD98, 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, + 0xBD9C, 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, + 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, 0xD43C, + 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, 0xD440, 0xC7A3, + 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, 0xD444, 0xC7A4, 0xD445, + 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, 0xD448, 0xBE4F, 0xD449, 0xBE50, + 0xD44A, 0xBE51, 0xD44B, 0xBE52, 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, + 0xBE55, 0xD44F, 0xBE56, 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, + 0xD453, 0xBE5A, 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, + 0xBE64, 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, 0xD460, + 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, 0xD464, 0xC7A7, + 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, 0xD468, 0xBE72, 0xD469, + 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, 0xD46C, 0xBE76, 0xD46D, 0xC7A8, + 0xD46E, 0xBE77, 0xD46F, 0xC7A9, 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, + 0xBE7A, 0xD473, 0xBE81, 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, + 0xD477, 0xBE85, 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, + 0xBE87, 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, + 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, 0xD484, + 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, 0xD488, 0xC7B0, + 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, 0xD48C, 0xBE91, 0xD48D, + 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, 0xD490, 0xBE94, 0xD491, 0xBE95, + 0xD492, 0xBE96, 0xD493, 0xBE97, 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, + 0xBE99, 0xD497, 0xBE9A, 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, + 0xD49B, 0xBE9E, 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, + 0xBF42, 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, 0xD4A8, + 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, 0xD4AC, 0xBF4E, + 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, 0xD4B0, 0xBF52, 0xD4B1, + 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, + 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, + 0xBF62, 0xD4BB, 0xBF63, 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, + 0xD4BF, 0xBF67, 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, + 0xBF6B, 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, + 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, 0xD4CC, + 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, 0xD4D0, 0xC7B7, + 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, 0xD4D4, 0xC7B8, 0xD4D5, + 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, + 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, + 0xBF88, 0xD4DF, 0xC7BA, 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, + 0xD4E3, 0xBF8C, 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, + 0xBF90, 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, 0xD4F0, + 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, 0xD4F4, 0xBF9A, + 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, 0xD4F8, 0xC7BE, 0xD4F9, + 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, + 0xD4FE, 0xC041, 0xD4FF, 0xC042, 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, + 0xC045, 0xD503, 0xC046, 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, + 0xD507, 0xC049, 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, + 0xC04C, 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, + 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, 0xD514, + 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, 0xD518, 0xC055, + 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, 0xD51C, 0xC059, 0xD51D, + 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, 0xD520, 0xC063, 0xD521, 0xC064, + 0xD522, 0xC065, 0xD523, 0xC066, 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, + 0xC069, 0xD527, 0xC06A, 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, + 0xD52B, 0xC06E, 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, + 0xC072, 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, 0xD538, + 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, 0xD53C, 0xC7C7, + 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, 0xD540, 0xC7C9, 0xD541, + 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, 0xD544, 0xC7CA, 0xD545, 0xC08A, + 0xD546, 0xC08B, 0xD547, 0xC08C, 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, + 0xC08F, 0xD54B, 0xC090, 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, + 0xD54F, 0xC7CD, 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, + 0xC094, 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, + 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, 0xD55C, + 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, 0xD560, 0xC7D2, + 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, 0xD564, 0xC141, 0xD565, + 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, 0xD568, 0xC7D4, 0xD569, 0xC7D5, + 0xD56A, 0xC144, 0xD56B, 0xC7D6, 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, + 0xC146, 0xD56F, 0xC147, 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, + 0xD573, 0xC14B, 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, + 0xC14D, 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, 0xD580, + 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, 0xD584, 0xC7DC, + 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, 0xD588, 0xC7DF, 0xD589, + 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, 0xD58C, 0xC161, 0xD58D, 0xC162, + 0xD58E, 0xC163, 0xD58F, 0xC164, 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, + 0xC166, 0xD593, 0xC167, 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, + 0xD597, 0xC16B, 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, + 0xC16F, 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, + 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, 0xD5A4, + 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, 0xD5A8, 0xC181, + 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, 0xD5AC, 0xC185, 0xD5AD, + 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, 0xD5B0, 0xC189, 0xD5B1, 0xC18A, + 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, + 0xC18F, 0xD5B7, 0xC190, 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, + 0xD5BB, 0xC194, 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, + 0xC198, 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, 0xD5C8, + 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, 0xD5CC, 0xC7E5, + 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, 0xD5D0, 0xC7E6, 0xD5D1, + 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, 0xD5D4, 0xC248, 0xD5D5, 0xC249, + 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, + 0xC24C, 0xD5DB, 0xC7EA, 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, + 0xD5DF, 0xC24F, 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, + 0xC253, 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, + 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, 0xD5EC, + 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, 0xD5F0, 0xC262, + 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, 0xD5F4, 0xC7F0, 0xD5F5, + 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, + 0xD5FA, 0xC268, 0xD5FB, 0xC269, 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, + 0xC26C, 0xD5FF, 0xC26D, 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, + 0xD603, 0xC26F, 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, + 0xC272, 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, 0xD610, + 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, 0xD614, 0xC7FB, + 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, 0xD618, 0xC283, 0xD619, + 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, 0xD61C, 0xC7FD, 0xD61D, 0xC287, + 0xD61E, 0xC288, 0xD61F, 0xC289, 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, + 0xC28B, 0xD623, 0xC28C, 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, + 0xD627, 0xC28F, 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, + 0xC293, 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, + 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, 0xD634, + 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, 0xD638, 0xC8A3, + 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, 0xD63C, 0xC8A5, 0xD63D, + 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, 0xD640, 0xC8A6, 0xD641, 0xC344, + 0xD642, 0xC345, 0xD643, 0xC346, 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, + 0xC348, 0xD647, 0xC349, 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, + 0xD64B, 0xC8AA, 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, + 0xC34D, 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, 0xD658, + 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, 0xD65C, 0xC8B0, + 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, 0xD660, 0xC359, 0xD661, + 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, 0xD664, 0xC363, 0xD665, 0xC364, + 0xD666, 0xC365, 0xD667, 0xC8B1, 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, + 0xC367, 0xD66B, 0xC368, 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, + 0xD66F, 0xC36C, 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, + 0xC36E, 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, + 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, 0xD67C, + 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, 0xD680, 0xC37A, + 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, 0xD684, 0xC383, 0xD685, + 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, 0xD688, 0xC386, 0xD689, 0xC387, + 0xD68A, 0xC388, 0xD68B, 0xC389, 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, + 0xC38A, 0xD68F, 0xC38B, 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, + 0xD693, 0xC38E, 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, + 0xC391, 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, 0xD6A0, + 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, 0xD6A4, 0xC39B, + 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, 0xD6A8, 0xC8BF, 0xD6A9, + 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, + 0xD6AE, 0xC443, 0xD6AF, 0xC444, 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, + 0xC446, 0xD6B3, 0xC447, 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, + 0xD6B7, 0xC44B, 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, + 0xC8C3, 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, + 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, 0xD6C4, + 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, 0xD6C8, 0xC8C6, + 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, 0xD6CC, 0xC8C7, 0xD6CD, + 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, + 0xD6D2, 0xC465, 0xD6D3, 0xC466, 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, + 0xC468, 0xD6D7, 0xC8CA, 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, + 0xD6DB, 0xC46B, 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, + 0xC46F, 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, 0xD6E8, + 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, 0xD6EC, 0xC479, + 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, 0xD6F0, 0xC8CF, 0xD6F1, + 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, + 0xD6F6, 0xC487, 0xD6F7, 0xC488, 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, + 0xC48B, 0xD6FB, 0xC48C, 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, + 0xD6FF, 0xC48E, 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, + 0xC491, 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, + 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, 0xD70C, + 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, 0xD710, 0xC49D, + 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, 0xD714, 0xC4A0, 0xD715, + 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, 0xD718, 0xC8D6, 0xD719, 0xC8D7, + 0xD71A, 0xC544, 0xD71B, 0xC545, 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, + 0xC547, 0xD71F, 0xC548, 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, + 0xD723, 0xC54B, 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, + 0xC54F, 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, 0xD730, + 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, 0xD734, 0xC8DE, + 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, 0xD738, 0xC8E0, 0xD739, + 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, 0xD73C, 0xC8E1, 0xD73D, 0xC563, + 0xD73E, 0xC564, 0xD73F, 0xC565, 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, + 0xC568, 0xD743, 0xC569, 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, + 0xD747, 0xC8E3, 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, + 0xC56E, 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, + 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, 0xD754, + 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, 0xD758, 0xC8EA, + 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, 0xD75C, 0xC578, 0xD75D, + 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, 0xD760, 0xC8EC, 0xD761, 0xC8ED, + 0xD762, 0xC582, 0xD763, 0xC8EE, 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, + 0xC584, 0xD767, 0xC585, 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, + 0xD76B, 0xC588, 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, + 0xC58B, 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, 0xD778, + 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, 0xD77C, 0xC8F4, + 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, 0xD780, 0xC598, 0xD781, + 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, 0xD784, 0xC59B, 0xD785, 0xC59C, + 0xD786, 0xC59D, 0xD787, 0xC59E, 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, + 0xC59F, 0xD78B, 0xC5A0, 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, + 0xD78F, 0xC643, 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, + 0xC646, 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, + 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, 0xD79C, + 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, 0xD7A0, 0xC64F, + 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, 0xF900, 0xCBD0, 0xF901, + 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, 0xF904, 0xCDE8, 0xF905, 0xCEAD, + 0xF906, 0xCFFB, 0xF907, 0xD0A2, 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, + 0xD0DD, 0xF90B, 0xD1D4, 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, + 0xF90F, 0xD1DC, 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, + 0xD1E0, 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, 0xF91C, + 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, 0xF920, 0xD1F2, + 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, 0xF924, 0xD1FD, 0xF925, + 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, 0xF928, 0xD2A7, 0xF929, 0xD2A8, + 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, + 0xD2B2, 0xF92F, 0xD2BE, 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, + 0xF933, 0xD2C6, 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, + 0xD2CA, 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, + 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, 0xF940, + 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, 0xF944, 0xD2D9, + 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, 0xF948, 0xD2E1, 0xF949, + 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, + 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, + 0xD2F0, 0xF953, 0xD2F1, 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, + 0xF957, 0xD2F5, 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, + 0xD4FC, 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, 0xF964, + 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, 0xF968, 0xDDF4, + 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, 0xF96C, 0xDFE1, 0xF96D, + 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, 0xF970, 0xE1ED, 0xF971, 0xE3F5, + 0xF972, 0xE4A1, 0xF973, 0xE4A9, 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, + 0xE5B2, 0xF977, 0xE5B9, 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, + 0xF97B, 0xE5CE, 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, + 0xE5FA, 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, + 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, 0xF988, + 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, 0xF98C, 0xE6B8, + 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, 0xF990, 0xE6C7, 0xF991, + 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, 0xF994, 0xE6D9, 0xF995, 0xE6DC, + 0xF996, 0xE6DF, 0xF997, 0xE6E1, 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, + 0xE6E6, 0xF99B, 0xE6E8, 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, + 0xF99F, 0xE6EF, 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, + 0xE6F6, 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, 0xF9AC, + 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, 0xF9B0, 0xE7C7, + 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, 0xF9B4, 0xE7D0, 0xF9B5, + 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, + 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, + 0xE8F7, 0xF9BF, 0xE8F9, 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, + 0xF9C3, 0xE9AC, 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, + 0xEAE5, 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, + 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, 0xF9D0, + 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, 0xF9D4, 0xEBC2, + 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, 0xF9D8, 0xEBCF, 0xF9D9, + 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, + 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, + 0xECB1, 0xF9E3, 0xECB2, 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, + 0xF9E7, 0xECC0, 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, + 0xECC9, 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, 0xF9F4, + 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, 0xF9F8, 0xEDA2, + 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, 0xF9FC, 0xF2BD, 0xF9FD, + 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, + 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, + 0xF8DB, 0xFA07, 0xF8F0, 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, + 0xFA0B, 0xFCA9, 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, + 0xA3A4, 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, 0xFF0D, + 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, 0xFF11, 0xA3B1, + 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, 0xFF15, 0xA3B5, 0xFF16, + 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, + 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, + 0xA3BF, 0xFF20, 0xA3C0, 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, + 0xFF24, 0xA3C4, 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, + 0xA3C8, 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, 0xFF31, + 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, 0xFF35, 0xA3D5, + 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, 0xFF39, 0xA3D9, 0xFF3A, + 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, + 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, + 0xA3E3, 0xFF44, 0xA3E4, 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, + 0xFF48, 0xA3E8, 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, + 0xA3EC, 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, 0xFF55, + 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, 0xFF59, 0xA3F9, + 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, 0xFF5D, 0xA3FD, 0xFF5E, + 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, + 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, 0, 0 }; + +/// Korean --> Unicode pairs +static const WCHAR oem2uni949[] + = { 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, 0x8145, + 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, 0x8149, 0xAC0F, + 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, 0x814D, 0xAC21, 0x814E, + 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, 0x8151, 0xAC26, 0x8152, 0xAC27, + 0x8153, 0xAC28, 0x8154, 0xAC29, 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, + 0xAC2E, 0x8158, 0xAC32, 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, + 0x8162, 0xAC36, 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, + 0xAC3D, 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, + 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, 0x816F, + 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, 0x8173, 0xAC4C, + 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, 0x8177, 0xAC51, 0x8178, + 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, 0x8181, 0xAC56, 0x8182, 0xAC57, + 0x8183, 0xAC59, 0x8184, 0xAC5A, 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, + 0xAC5E, 0x8188, 0xAC5F, 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, + 0x818C, 0xAC63, 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, + 0xAC67, 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, 0x8199, + 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, 0x819D, 0xAC79, + 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, 0x81A1, 0xAC7E, 0x81A2, + 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, 0x81A5, 0xAC88, 0x81A6, 0xAC8D, + 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, + 0xAC93, 0x81AC, 0xAC95, 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, + 0x81B0, 0xAC99, 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, + 0xACA2, 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, + 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, 0x81BD, + 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, 0x81C1, 0xACB5, + 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, 0x81C5, 0xACBE, 0x81C6, + 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, 0x81C9, 0xACC3, 0x81CA, 0xACC5, + 0x81CB, 0xACC6, 0x81CC, 0xACC7, 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, + 0xACCB, 0x81D0, 0xACCD, 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, + 0x81D4, 0xACD1, 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, + 0xACD6, 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, 0x81E1, + 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, 0x81E5, 0xACE9, + 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, 0x81E9, 0xACF2, 0x81EA, + 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, 0x81ED, 0xACF9, 0x81EE, 0xACFA, + 0x81EF, 0xACFB, 0x81F0, 0xACFE, 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, + 0xAD02, 0x81F4, 0xAD03, 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, + 0x81F8, 0xAD09, 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, + 0xAD10, 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, + 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, 0x8247, + 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, 0x824B, 0xAD21, + 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, 0x824F, 0xAD25, 0x8250, + 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, 0x8253, 0xAD2A, 0x8254, 0xAD2B, + 0x8255, 0xAD2E, 0x8256, 0xAD2F, 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, + 0xAD32, 0x825A, 0xAD33, 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, + 0x8264, 0xAD3A, 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, + 0xAD3F, 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, 0x8271, + 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, 0x8275, 0xAD51, + 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, 0x8279, 0xAD56, 0x827A, + 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, 0x8283, 0xAD5B, 0x8284, 0xAD5C, + 0x8285, 0xAD5D, 0x8286, 0xAD5E, 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, + 0xAD62, 0x828A, 0xAD64, 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, + 0x828E, 0xAD68, 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, + 0xAD6E, 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, + 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, 0x829B, + 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, 0x829F, 0xAD86, + 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, 0x82A3, 0xAD8D, 0x82A4, + 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, 0x82A7, 0xAD92, 0x82A8, 0xAD93, + 0x82A9, 0xAD94, 0x82AA, 0xAD95, 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, + 0xAD98, 0x82AE, 0xAD99, 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, + 0x82B2, 0xAD9F, 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, + 0xADA3, 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, 0x82BF, + 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, 0x82C3, 0xADB1, + 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, 0x82C7, 0xADB5, 0x82C8, + 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, 0x82CB, 0xADBA, 0x82CC, 0xADBB, + 0x82CD, 0xADBC, 0x82CE, 0xADBD, 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, + 0xADC2, 0x82D2, 0xADC3, 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, + 0x82D6, 0xADC9, 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, + 0xADCD, 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, + 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, 0x82E3, + 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, 0x82E7, 0xADDE, + 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, 0x82EB, 0xADE3, 0x82EC, + 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, 0x82EF, 0xADE8, 0x82F0, 0xADE9, + 0x82F1, 0xADEA, 0x82F2, 0xADEB, 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, + 0xADEE, 0x82F6, 0xADEF, 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, + 0x82FA, 0xADF3, 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, + 0xADF7, 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, 0x8349, + 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, 0x834D, 0xAE0E, + 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, 0x8351, 0xAE12, 0x8352, + 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, 0x8355, 0xAE17, 0x8356, 0xAE18, + 0x8357, 0xAE19, 0x8358, 0xAE1A, 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, + 0xAE1D, 0x8362, 0xAE1E, 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, + 0x8366, 0xAE22, 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, + 0xAE26, 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, + 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, 0x8373, + 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, 0x8377, 0xAE36, + 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, 0x8381, 0xAE3D, 0x8382, + 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, 0x8385, 0xAE44, 0x8386, 0xAE47, + 0x8387, 0xAE48, 0x8388, 0xAE49, 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, + 0xAE51, 0x838C, 0xAE52, 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, + 0x8390, 0xAE58, 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, + 0xAE5E, 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, 0x839D, + 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, 0x83A1, 0xAE73, + 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, 0x83A5, 0xAE77, 0x83A6, + 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, 0x83A9, 0xAE80, 0x83AA, 0xAE81, + 0x83AB, 0xAE82, 0x83AC, 0xAE83, 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, + 0xAE88, 0x83B0, 0xAE89, 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, + 0x83B4, 0xAE8E, 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, + 0xAE92, 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, + 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, 0x83C1, + 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, 0x83C5, 0xAE9F, + 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, 0x83C9, 0xAEA3, 0x83CA, + 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, + 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, + 0xAEAD, 0x83D4, 0xAEAE, 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, + 0x83D8, 0xAEB2, 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, + 0xAEB6, 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, 0x83E5, + 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, 0x83E9, 0xAEC8, + 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, 0x83ED, 0xAECE, 0x83EE, + 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, 0x83F1, 0xAED5, 0x83F2, 0xAED6, + 0x83F3, 0xAED7, 0x83F4, 0xAEDA, 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, + 0xAEDE, 0x83F8, 0xAEDF, 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, + 0x83FC, 0xAEE3, 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, + 0xAEE7, 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, + 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, 0x844B, + 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, 0x844F, 0xAEF9, + 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, 0x8453, 0xAEFE, 0x8454, + 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, 0x8457, 0xAF02, 0x8458, 0xAF03, + 0x8459, 0xAF04, 0x845A, 0xAF05, 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, + 0xAF0A, 0x8464, 0xAF0B, 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, + 0x8468, 0xAF11, 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, + 0xAF15, 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, 0x8475, + 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, 0x8479, 0xAF22, + 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, 0x8483, 0xAF26, 0x8484, + 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, 0x8487, 0xAF2A, 0x8488, 0xAF2B, + 0x8489, 0xAF2E, 0x848A, 0xAF2F, 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, + 0xAF35, 0x848E, 0xAF36, 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, + 0x8492, 0xAF3A, 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, + 0xAF44, 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, + 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, 0x849F, + 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, 0x84A3, 0xAF54, + 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, 0x84A7, 0xAF58, 0x84A8, + 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, + 0x84AD, 0xAF60, 0x84AE, 0xAF61, 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, + 0xAF66, 0x84B2, 0xAF67, 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, + 0x84B6, 0xAF6B, 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, + 0xAF6F, 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, 0x84C3, + 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, 0x84C7, 0xAF7D, + 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, 0x84CB, 0xAF82, 0x84CC, + 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, 0x84CF, 0xAF87, 0x84D0, 0xAF89, + 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, + 0xAF8E, 0x84D6, 0xAF8F, 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, + 0x84DA, 0xAF96, 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, + 0xAF9A, 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, + 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, 0x84E7, + 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, 0x84EB, 0xAFA8, + 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, 0x84EF, 0xAFAC, 0x84F0, + 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, + 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, + 0xAFB6, 0x84FA, 0xAFB7, 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, + 0x84FE, 0xAFBE, 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, + 0xAFC3, 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, 0x854D, + 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, 0x8551, 0xAFD7, + 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, 0x8555, 0xAFDB, 0x8556, + 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, 0x8559, 0xAFE0, 0x855A, 0xAFE1, + 0x8561, 0xAFE2, 0x8562, 0xAFE3, 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, + 0xAFE6, 0x8566, 0xAFE7, 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, + 0x856A, 0xAFED, 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, + 0xAFF3, 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, + 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, 0x8577, + 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, 0x8581, 0xB005, + 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, 0x8585, 0xB009, 0x8586, + 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, 0x8589, 0xB00E, 0x858A, 0xB00F, + 0x858B, 0xB011, 0x858C, 0xB012, 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, + 0xB016, 0x8590, 0xB017, 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, + 0x8594, 0xB01B, 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, + 0xB021, 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, 0x85A1, + 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, 0x85A5, 0xB02F, + 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, 0x85A9, 0xB033, 0x85AA, + 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, 0x85AD, 0xB037, 0x85AE, 0xB038, + 0x85AF, 0xB039, 0x85B0, 0xB03A, 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, + 0xB03D, 0x85B4, 0xB03E, 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, + 0x85B8, 0xB042, 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, + 0xB049, 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, + 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, 0x85C5, + 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, 0x85C9, 0xB05F, + 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, 0x85CD, 0xB063, 0x85CE, + 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, 0x85D1, 0xB067, 0x85D2, 0xB068, + 0x85D3, 0xB069, 0x85D4, 0xB06A, 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, + 0xB06D, 0x85D8, 0xB06E, 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, + 0x85DC, 0xB072, 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, + 0xB076, 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, 0x85E9, + 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, 0x85ED, 0xB087, + 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, 0x85F1, 0xB08B, 0x85F2, + 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, 0x85F5, 0xB093, 0x85F6, 0xB094, + 0x85F7, 0xB095, 0x85F8, 0xB096, 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, + 0xB09D, 0x85FC, 0xB09E, 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, + 0x8642, 0xB0A6, 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, + 0xB0B2, 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, + 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, 0x864F, + 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, 0x8653, 0xB0C6, + 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, 0x8657, 0xB0CD, 0x8658, + 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, 0x8661, 0xB0D3, 0x8662, 0xB0D5, + 0x8663, 0xB0D6, 0x8664, 0xB0D7, 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, + 0xB0DB, 0x8668, 0xB0DC, 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, + 0x866C, 0xB0E1, 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, + 0xB0E6, 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, 0x8679, + 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, 0x8683, 0xB0F3, + 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, 0x8687, 0xB0F7, 0x8688, + 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, 0x868B, 0xB0FB, 0x868C, 0xB0FC, + 0x868D, 0xB0FD, 0x868E, 0xB0FE, 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, + 0xB101, 0x8692, 0xB102, 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, + 0x8696, 0xB106, 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, + 0xB10E, 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, + 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, 0x86A3, + 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, 0x86A7, 0xB126, + 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, 0x86AB, 0xB12B, 0x86AC, + 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, 0x86AF, 0xB130, 0x86B0, 0xB131, + 0x86B1, 0xB132, 0x86B2, 0xB133, 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, + 0xB13B, 0x86B6, 0xB13C, 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, + 0x86BA, 0xB142, 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, + 0xB147, 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, 0x86C7, + 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, 0x86CB, 0xB15A, + 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, 0x86CF, 0xB15F, 0x86D0, + 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, 0x86D3, 0xB164, 0x86D4, 0xB165, + 0x86D5, 0xB166, 0x86D6, 0xB167, 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, + 0xB16A, 0x86DA, 0xB16B, 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, + 0x86DE, 0xB16F, 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, + 0xB173, 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, + 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, 0x86EB, + 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, 0x86EF, 0xB185, + 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, 0x86F3, 0xB18C, 0x86F4, + 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, 0x86F7, 0xB191, 0x86F8, 0xB195, + 0x86F9, 0xB196, 0x86FA, 0xB197, 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, + 0xB19B, 0x86FE, 0xB19D, 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, + 0x8744, 0xB1A1, 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, + 0xB1A5, 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, 0x8751, + 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, 0x8755, 0xB1B3, + 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, 0x8759, 0xB1B7, 0x875A, + 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, 0x8763, 0xB1BB, 0x8764, 0xB1BC, + 0x8765, 0xB1BD, 0x8766, 0xB1BE, 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, + 0xB1C1, 0x876A, 0xB1C2, 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, + 0x876E, 0xB1C6, 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, + 0xB1CA, 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, + 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, 0x8781, + 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, 0x8785, 0xB1DA, + 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, 0x8789, 0xB1E1, 0x878A, + 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, 0x878D, 0xB1E5, 0x878E, 0xB1E6, + 0x878F, 0xB1E7, 0x8790, 0xB1EA, 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, + 0xB1EE, 0x8794, 0xB1EF, 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, + 0x8798, 0xB1F4, 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, + 0xB1F8, 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, 0x87A5, + 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, 0x87A9, 0xB20D, + 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, 0x87AD, 0xB211, 0x87AE, + 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, 0x87B1, 0xB218, 0x87B2, 0xB21A, + 0x87B3, 0xB21B, 0x87B4, 0xB21C, 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, + 0xB21F, 0x87B8, 0xB221, 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, + 0x87BC, 0xB225, 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, + 0xB229, 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, + 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, 0x87C9, + 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, 0x87CD, 0xB237, + 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, 0x87D1, 0xB23B, 0x87D2, + 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, 0x87D5, 0xB240, 0x87D6, 0xB241, + 0x87D7, 0xB242, 0x87D8, 0xB243, 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, + 0xB246, 0x87DC, 0xB247, 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, + 0x87E0, 0xB24B, 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, + 0xB24F, 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, 0x87ED, + 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, 0x87F1, 0xB25E, + 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, 0x87F5, 0xB263, 0x87F6, + 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, 0x87F9, 0xB267, 0x87FA, 0xB26A, + 0x87FB, 0xB26B, 0x87FC, 0xB26C, 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, + 0xB26F, 0x8842, 0xB270, 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, + 0x8846, 0xB276, 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, + 0xB27A, 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, + 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, 0x8853, + 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, 0x8857, 0xB28B, + 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, 0x8861, 0xB28F, 0x8862, + 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, 0x8865, 0xB296, 0x8866, 0xB297, + 0x8867, 0xB29B, 0x8868, 0xB29C, 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, + 0xB29F, 0x886C, 0xB2A2, 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, + 0x8870, 0xB2A9, 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, + 0xB2AF, 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, 0x8883, + 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, 0x8887, 0xB2BE, + 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, 0x888B, 0xB2C2, 0x888C, + 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, 0x888F, 0xB2C6, 0x8890, 0xB2C7, + 0x8891, 0xB2CA, 0x8892, 0xB2CB, 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, + 0xB2CF, 0x8896, 0xB2D1, 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, + 0x889A, 0xB2D6, 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, + 0xB2DE, 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, + 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, 0x88A7, + 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, 0x88AB, 0xB2FD, + 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, 0x88AF, 0xB305, 0x88B0, + 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, 0x88B3, 0xB30A, 0x88B4, 0xB30B, + 0x88B5, 0xB30C, 0x88B6, 0xB30D, 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, + 0xB312, 0x88BA, 0xB316, 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, + 0x88BE, 0xB31A, 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, + 0xB31F, 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, 0x88CB, + 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, 0x88CF, 0xB32C, + 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, 0x88D3, 0xB330, 0x88D4, + 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, 0x88D7, 0xB334, 0x88D8, 0xB335, + 0x88D9, 0xB336, 0x88DA, 0xB337, 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, + 0xB33A, 0x88DE, 0xB33B, 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, + 0x88E2, 0xB33F, 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, + 0xB343, 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, + 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, 0x88EF, + 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, 0x88F3, 0xB350, + 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, 0x88F7, 0xB357, 0x88F8, + 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, 0x88FB, 0xB360, 0x88FC, 0xB361, + 0x88FD, 0xB362, 0x88FE, 0xB363, 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, + 0xB36A, 0x8944, 0xB36C, 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, + 0x8948, 0xB373, 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, + 0xB379, 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, 0x8955, + 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, 0x8959, 0xB38B, + 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, 0x8963, 0xB391, 0x8964, + 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, 0x8967, 0xB396, 0x8968, 0xB397, + 0x8969, 0xB398, 0x896A, 0xB399, 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, + 0xB39C, 0x896E, 0xB39D, 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, + 0x8972, 0xB3A3, 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, + 0xB3A7, 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, + 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, 0x8985, + 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, 0x8989, 0xB3B6, + 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, 0x898D, 0xB3BA, 0x898E, + 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, 0x8991, 0xB3BE, 0x8992, 0xB3BF, + 0x8993, 0xB3C0, 0x8994, 0xB3C1, 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, + 0xB3C6, 0x8998, 0xB3C7, 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, + 0x899C, 0xB3CF, 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, + 0xB3D6, 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, 0x89A9, + 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, 0x89AD, 0xB3EA, + 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, 0x89B1, 0xB3EE, 0x89B2, + 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, + 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, + 0xB3F8, 0x89BC, 0xB3F9, 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, + 0x89C0, 0xB3FE, 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, + 0xB402, 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, + 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, 0x89CD, + 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, 0x89D1, 0xB40F, + 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, 0x89D5, 0xB414, 0x89D6, + 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, 0x89D9, 0xB419, 0x89DA, 0xB41A, + 0x89DB, 0xB41B, 0x89DC, 0xB41D, 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, + 0xB421, 0x89E0, 0xB422, 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, + 0x89E4, 0xB426, 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, + 0xB42D, 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, 0x89F1, + 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, 0x89F5, 0xB43B, + 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, 0x89F9, 0xB43F, 0x89FA, + 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, 0x89FD, 0xB443, 0x89FE, 0xB444, + 0x8A41, 0xB445, 0x8A42, 0xB446, 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, + 0xB449, 0x8A46, 0xB44A, 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, + 0x8A4A, 0xB44E, 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, + 0xB455, 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, + 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, 0x8A57, + 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, 0x8A61, 0xB467, + 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, 0x8A65, 0xB46B, 0x8A66, + 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, 0x8A69, 0xB470, 0x8A6A, 0xB471, + 0x8A6B, 0xB472, 0x8A6C, 0xB473, 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, + 0xB476, 0x8A70, 0xB477, 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, + 0x8A74, 0xB47B, 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, + 0xB47F, 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, 0x8A87, + 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, 0x8A8B, 0xB48E, + 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, 0x8A8F, 0xB492, 0x8A90, + 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, 0x8A93, 0xB496, 0x8A94, 0xB497, + 0x8A95, 0xB498, 0x8A96, 0xB499, 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, + 0xB49C, 0x8A9A, 0xB49E, 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, + 0x8A9E, 0xB4A2, 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, + 0xB4A7, 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, + 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, 0x8AAB, + 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, 0x8AAF, 0xB4B8, + 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, 0x8AB3, 0xB4BD, 0x8AB4, + 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, + 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, + 0xB4CA, 0x8ABE, 0xB4CB, 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, + 0x8AC2, 0xB4CF, 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, + 0xB4D4, 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, 0x8ACF, + 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, 0x8AD3, 0xB4E8, + 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, 0x8AD7, 0xB4EE, 0x8AD8, + 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, + 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, + 0xB4FB, 0x8AE2, 0xB4FC, 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, + 0x8AE6, 0xB500, 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, + 0xB504, 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, + 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, 0x8AF3, + 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, 0x8AF7, 0xB511, + 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, 0x8AFB, 0xB517, 0x8AFC, + 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, 0x8B41, 0xB51E, 0x8B42, 0xB51F, + 0x8B43, 0xB520, 0x8B44, 0xB521, 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, + 0xB526, 0x8B48, 0xB52B, 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, + 0x8B4C, 0xB52F, 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, + 0xB536, 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, 0x8B59, + 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, 0x8B63, 0xB549, + 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, 0x8B67, 0xB551, 0x8B68, + 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, 0x8B6B, 0xB556, 0x8B6C, 0xB557, + 0x8B6D, 0xB558, 0x8B6E, 0xB559, 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, + 0xB55E, 0x8B72, 0xB562, 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, + 0x8B76, 0xB566, 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, + 0xB56A, 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, + 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, 0x8B89, + 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, 0x8B8D, 0xB577, + 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, 0x8B91, 0xB57B, 0x8B92, + 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, 0x8B95, 0xB57F, 0x8B96, 0xB580, + 0x8B97, 0xB581, 0x8B98, 0xB582, 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, + 0xB585, 0x8B9C, 0xB586, 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, + 0x8BA0, 0xB58A, 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, + 0xB58E, 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, 0x8BAD, + 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, 0x8BB1, 0xB59B, + 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, 0x8BB5, 0xB59F, 0x8BB6, + 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, + 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, + 0xB5AF, 0x8BC0, 0xB5B2, 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, + 0x8BC4, 0xB5B9, 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, + 0xB5C1, 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, + 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, 0x8BD1, + 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, 0x8BD5, 0xB5D4, + 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, 0x8BD9, 0xB5D9, 0x8BDA, + 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, + 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, + 0xB5E3, 0x8BE4, 0xB5E4, 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, + 0x8BE8, 0xB5E8, 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, + 0xB5ED, 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, 0x8BF5, + 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, 0x8BF9, 0xB5FA, + 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, 0x8BFD, 0xB5FE, 0x8BFE, + 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, 0x8C43, 0xB602, 0x8C44, 0xB603, + 0x8C45, 0xB604, 0x8C46, 0xB605, 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, + 0xB608, 0x8C4A, 0xB609, 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, + 0x8C4E, 0xB60D, 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, + 0xB613, 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, + 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, 0x8C61, + 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, 0x8C65, 0xB622, + 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, 0x8C69, 0xB627, 0x8C6A, + 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, + 0x8C6F, 0xB62E, 0x8C70, 0xB62F, 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, + 0xB632, 0x8C74, 0xB633, 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, + 0x8C78, 0xB638, 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, + 0xB63C, 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, 0x8C8B, + 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, 0x8C8F, 0xB64A, + 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, 0x8C93, 0xB64E, 0x8C94, + 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, 0x8C97, 0xB652, 0x8C98, 0xB653, + 0x8C99, 0xB654, 0x8C9A, 0xB655, 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, + 0xB658, 0x8C9E, 0xB659, 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, + 0x8CA2, 0xB65D, 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, + 0xB661, 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, + 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, 0x8CAF, + 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, 0x8CB3, 0xB670, + 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, 0x8CB7, 0xB674, 0x8CB8, + 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, 0x8CBB, 0xB678, 0x8CBC, 0xB679, + 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, + 0xB67E, 0x8CC2, 0xB67F, 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, + 0x8CC6, 0xB683, 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, + 0xB687, 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, 0x8CD3, + 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, 0x8CD7, 0xB694, + 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, 0x8CDB, 0xB698, 0x8CDC, + 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, + 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, + 0xB6A6, 0x8CE6, 0xB6A7, 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, + 0x8CEA, 0xB6AD, 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, + 0xB6B2, 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, + 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, 0x8CF7, + 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, 0x8CFB, 0xB6BF, + 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, 0x8D41, 0xB6C3, 0x8D42, + 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, + 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, + 0xB6CD, 0x8D4C, 0xB6CE, 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, + 0x8D50, 0xB6D2, 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, + 0xB6D7, 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, 0x8D63, + 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, 0x8D67, 0xB6E4, + 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, 0x8D6B, 0xB6E8, 0x8D6C, + 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, + 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, + 0xB6F3, 0x8D76, 0xB6F5, 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, + 0x8D7A, 0xB6FA, 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, + 0xB6FE, 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, + 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, 0x8D8D, + 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, 0x8D91, 0xB70E, + 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, 0x8D95, 0xB712, 0x8D96, + 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, 0x8D99, 0xB716, 0x8D9A, 0xB717, + 0x8D9B, 0xB718, 0x8D9C, 0xB719, 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, + 0xB71C, 0x8DA0, 0xB71D, 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, + 0x8DA4, 0xB721, 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, + 0xB725, 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, 0x8DB1, + 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, 0x8DB5, 0xB737, + 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, 0x8DB9, 0xB73E, 0x8DBA, + 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, 0x8DBD, 0xB742, 0x8DBE, 0xB743, + 0x8DBF, 0xB745, 0x8DC0, 0xB746, 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, + 0xB74A, 0x8DC4, 0xB74B, 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, + 0x8DC8, 0xB750, 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, + 0xB756, 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, + 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, 0x8DD5, + 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, 0x8DD9, 0xB765, + 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, 0x8DDD, 0xB76A, 0x8DDE, + 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, + 0x8DE3, 0xB772, 0x8DE4, 0xB774, 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, + 0xB778, 0x8DE8, 0xB779, 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, + 0x8DEC, 0xB77F, 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, + 0xB785, 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, 0x8DF9, + 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, 0x8DFD, 0xB79D, + 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, 0x8E43, 0xB7A2, 0x8E44, + 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, + 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, + 0xB7B1, 0x8E4E, 0xB7B2, 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, + 0x8E52, 0xB7B9, 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, + 0xB7BD, 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, + 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, 0x8E65, + 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, 0x8E69, 0xB7CC, + 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, 0x8E6D, 0xB7D0, 0x8E6E, + 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, + 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, + 0xB7DA, 0x8E78, 0xB7DB, 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, + 0x8E82, 0xB7DF, 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, + 0xB7E3, 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, 0x8E8F, + 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, 0x8E93, 0xB7F3, + 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, 0x8E97, 0xB7F8, 0x8E98, + 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, + 0x8E9D, 0xB803, 0x8E9E, 0xB804, 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, + 0xB80A, 0x8EA2, 0xB80B, 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, + 0x8EA6, 0xB811, 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, + 0xB815, 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, + 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, 0x8EB3, + 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, 0x8EB7, 0xB829, + 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, 0x8EBB, 0xB82E, 0x8EBC, + 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, 0x8EBF, 0xB832, 0x8EC0, 0xB833, + 0x8EC1, 0xB836, 0x8EC2, 0xB83A, 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, + 0xB83D, 0x8EC6, 0xB83E, 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, + 0x8ECA, 0xB843, 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, + 0xB848, 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, 0x8ED7, + 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, 0x8EDB, 0xB857, + 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, 0x8EDF, 0xB85B, 0x8EE0, + 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, 0x8EE3, 0xB862, 0x8EE4, 0xB863, + 0x8EE5, 0xB865, 0x8EE6, 0xB866, 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, + 0xB869, 0x8EEA, 0xB86A, 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, + 0x8EEE, 0xB872, 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, + 0xB876, 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, + 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, 0x8EFB, + 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, 0x8F41, 0xB885, + 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, 0x8F45, 0xB889, 0x8F46, + 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, 0x8F49, 0xB88E, 0x8F4A, 0xB88F, + 0x8F4B, 0xB890, 0x8F4C, 0xB891, 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, + 0xB894, 0x8F50, 0xB895, 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, + 0x8F54, 0xB899, 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, + 0xB89D, 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, 0x8F67, + 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, 0x8F6B, 0xB8AB, + 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, 0x8F6F, 0xB8AF, 0x8F70, + 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, + 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, + 0xB8BC, 0x8F7A, 0xB8BD, 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, + 0x8F84, 0xB8C4, 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, + 0xB8C9, 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, + 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, 0x8F91, + 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, 0x8F95, 0xB8D9, + 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, 0x8F99, 0xB8DE, 0x8F9A, + 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, + 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, + 0xB8ED, 0x8FA4, 0xB8EE, 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, + 0x8FA8, 0xB8F3, 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, + 0xB8F7, 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, 0x8FB5, + 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, 0x8FB9, 0xB909, + 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, 0x8FBD, 0xB90D, 0x8FBE, + 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, 0x8FC1, 0xB911, 0x8FC2, 0xB912, + 0x8FC3, 0xB913, 0x8FC4, 0xB914, 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, + 0xB917, 0x8FC8, 0xB919, 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, + 0x8FCC, 0xB91D, 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, + 0xB922, 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, + 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, 0x8FD9, + 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, 0x8FDD, 0xB92F, + 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, 0x8FE1, 0xB933, 0x8FE2, + 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, 0x8FE5, 0xB937, 0x8FE6, 0xB938, + 0x8FE7, 0xB939, 0x8FE8, 0xB93A, 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, + 0xB93F, 0x8FEC, 0xB941, 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, + 0x8FF0, 0xB946, 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, + 0xB94A, 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, 0x8FFD, + 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, 0x9043, 0xB95D, + 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, 0x9047, 0xB962, 0x9048, + 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, 0x904B, 0xB966, 0x904C, 0xB967, + 0x904D, 0xB96A, 0x904E, 0xB96C, 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, + 0xB970, 0x9052, 0xB971, 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, + 0x9056, 0xB977, 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, + 0xB97D, 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, + 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, 0x9069, + 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, 0x906D, 0xB991, + 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, 0x9071, 0xB995, 0x9072, + 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, 0x9075, 0xB999, 0x9076, 0xB99A, + 0x9077, 0xB99B, 0x9078, 0xB99C, 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, + 0xB99F, 0x9082, 0xB9A0, 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, + 0x9086, 0xB9A4, 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, + 0xB9A8, 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, 0x9093, + 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, 0x9097, 0xB9B9, + 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, 0x909B, 0xB9C0, 0x909C, + 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, 0x909F, 0xB9C5, 0x90A0, 0xB9C6, + 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, + 0xB9D3, 0x90A6, 0xB9D4, 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, + 0x90AA, 0xB9DA, 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, + 0xB9E2, 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, + 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, 0x90B7, + 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, 0x90BB, 0xB9F6, + 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, 0x90BF, 0xB9FE, 0x90C0, + 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, 0x90C3, 0xBA04, 0x90C4, 0xBA05, + 0x90C5, 0xBA06, 0x90C6, 0xBA07, 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, + 0xBA0B, 0x90CA, 0xBA0C, 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, + 0x90CE, 0xBA10, 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, + 0xBA14, 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, 0x90DB, + 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, 0x90DF, 0xBA22, + 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, 0x90E3, 0xBA26, 0x90E4, + 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, + 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, + 0xBA30, 0x90EE, 0xBA31, 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, + 0x90F2, 0xBA35, 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, + 0xBA3B, 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, + 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, 0x9141, + 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, 0x9145, 0xBA50, + 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, 0x9149, 0xBA57, 0x914A, + 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, 0x914D, 0xBA5D, 0x914E, 0xBA5E, + 0x914F, 0xBA5F, 0x9150, 0xBA60, 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, + 0xBA63, 0x9154, 0xBA66, 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, + 0x9158, 0xBA6D, 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, + 0xBA73, 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, 0x916B, + 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, 0x916F, 0xBA82, + 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, 0x9173, 0xBA8A, 0x9174, + 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, 0x9177, 0xBA8F, 0x9178, 0xBA90, + 0x9179, 0xBA91, 0x917A, 0xBA92, 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, + 0xBA95, 0x9184, 0xBA96, 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, + 0x9188, 0xBA9A, 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, + 0xBA9E, 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, + 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, 0x9195, + 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, 0x9199, 0xBAAF, + 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, 0x919D, 0xBAB5, 0x919E, + 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, 0x91A1, 0xBABC, 0x91A2, 0xBABE, + 0x91A3, 0xBABF, 0x91A4, 0xBAC0, 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, + 0xBAC3, 0x91A8, 0xBAC5, 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, + 0x91AC, 0xBACA, 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, + 0xBACE, 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, 0x91B9, + 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, 0x91BD, 0xBADD, + 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, 0x91C1, 0xBAE1, 0x91C2, + 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, + 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, + 0xBAEB, 0x91CC, 0xBAEC, 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, + 0x91D0, 0xBAF0, 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, + 0xBAF4, 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, + 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, 0x91DD, + 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, 0x91E1, 0xBB03, + 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, 0x91E5, 0xBB08, 0x91E6, + 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, + 0x91EB, 0xBB10, 0x91EC, 0xBB12, 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, + 0xBB15, 0x91F0, 0xBB16, 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, + 0x91F4, 0xBB1B, 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, + 0xBB21, 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, 0x9243, + 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, 0x9247, 0xBB30, + 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, 0x924B, 0xBB37, 0x924C, + 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, 0x924F, 0xBB40, 0x9250, 0xBB41, + 0x9251, 0xBB42, 0x9252, 0xBB43, 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, + 0xBB4A, 0x9256, 0xBB4B, 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, + 0x925A, 0xBB52, 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, + 0xBB57, 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, + 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, 0x926D, + 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, 0x9271, 0xBB67, + 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, 0x9275, 0xBB6B, 0x9276, + 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, 0x9279, 0xBB70, 0x927A, 0xBB71, + 0x9281, 0xBB72, 0x9282, 0xBB73, 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, + 0xBB76, 0x9286, 0xBB77, 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, + 0x928A, 0xBB7B, 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, + 0xBB7F, 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, 0x9297, + 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, 0x929B, 0xBB8E, + 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, 0x929F, 0xBB93, 0x92A0, + 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, 0x92A3, 0xBB97, 0x92A4, 0xBB98, + 0x92A5, 0xBB99, 0x92A6, 0xBB9A, 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, + 0xBB9D, 0x92AA, 0xBB9E, 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, + 0x92AE, 0xBBA2, 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, + 0xBBA7, 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, + 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, 0x92BB, + 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, 0x92BF, 0xBBB8, + 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, 0x92C3, 0xBBBC, 0x92C4, + 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, + 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, + 0xBBC9, 0x92CE, 0xBBCA, 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, + 0x92D2, 0xBBCE, 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, + 0xBBD4, 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, 0x92DF, + 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, 0x92E3, 0xBBE1, + 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, 0x92E7, 0xBBE5, 0x92E8, + 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, + 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, + 0xBBEF, 0x92F2, 0xBBF0, 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, + 0x92F6, 0xBBF4, 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, + 0xBBFA, 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, + 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, 0x9345, + 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, 0x9349, 0xBC12, + 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, 0x934D, 0xBC20, 0x934E, + 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, 0x9351, 0xBC26, 0x9352, 0xBC28, + 0x9353, 0xBC2A, 0x9354, 0xBC2B, 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, + 0xBC2F, 0x9358, 0xBC32, 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, + 0x9362, 0xBC37, 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, + 0xBC3C, 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, 0x936F, + 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, 0x9373, 0xBC52, + 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, 0x9377, 0xBC56, 0x9378, + 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, 0x9381, 0xBC5A, 0x9382, 0xBC5B, + 0x9383, 0xBC5C, 0x9384, 0xBC5E, 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, + 0xBC61, 0x9388, 0xBC62, 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, + 0x938C, 0xBC66, 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, + 0xBC6A, 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, + 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, 0x9399, + 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, 0x939D, 0xBC77, + 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, 0x93A1, 0xBC7B, 0x93A2, + 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, 0x93A5, 0xBC7F, 0x93A6, 0xBC80, + 0x93A7, 0xBC81, 0x93A8, 0xBC82, 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, + 0xBC87, 0x93AC, 0xBC89, 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, + 0x93B0, 0xBC90, 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, + 0xBC96, 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, 0x93BD, + 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, 0x93C1, 0xBCAB, + 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, 0x93C5, 0xBCAF, 0x93C6, + 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, + 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, + 0xBCC1, 0x93D0, 0xBCC2, 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, + 0x93D4, 0xBCC7, 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, + 0xBCCB, 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, + 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, 0x93E1, + 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, 0x93E5, 0xBCDF, + 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, 0x93E9, 0xBCE3, 0x93EA, + 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, + 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, + 0xBCED, 0x93F4, 0xBCEE, 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, + 0x93F8, 0xBCF2, 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, + 0xBCFA, 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, 0x9447, + 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, 0x944B, 0xBD0C, + 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, 0x944F, 0xBD11, 0x9450, + 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, 0x9453, 0xBD16, 0x9454, 0xBD17, + 0x9455, 0xBD18, 0x9456, 0xBD19, 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, + 0xBD1C, 0x945A, 0xBD1D, 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, + 0x9464, 0xBD21, 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, + 0xBD26, 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, + 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, 0x9471, + 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, 0x9475, 0xBD34, + 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, 0x9479, 0xBD38, 0x947A, + 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, 0x9483, 0xBD3C, 0x9484, 0xBD3D, + 0x9485, 0xBD3E, 0x9486, 0xBD3F, 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, + 0xBD43, 0x948A, 0xBD44, 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, + 0x948E, 0xBD4A, 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, + 0xBD4F, 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, 0x949B, + 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, 0x949F, 0xBD5F, + 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, 0x94A3, 0xBD63, 0x94A4, + 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, 0x94A7, 0xBD69, 0x94A8, 0xBD6A, + 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, + 0xBD6F, 0x94AE, 0xBD70, 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, + 0x94B2, 0xBD74, 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, + 0xBD78, 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, + 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, 0x94BF, + 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, 0x94C3, 0xBD8C, + 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, 0x94C7, 0xBD92, 0x94C8, + 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, 0x94CB, 0xBD98, 0x94CC, 0xBD9B, + 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, + 0xBDA1, 0x94D2, 0xBDA2, 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, + 0x94D6, 0xBDA7, 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, + 0xBDAB, 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, 0x94E3, + 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, 0x94E7, 0xBDBA, + 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, 0x94EB, 0xBDBE, 0x94EC, + 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, + 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, + 0xBDC8, 0x94F6, 0xBDC9, 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, + 0x94FA, 0xBDCD, 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, + 0xBDD1, 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, + 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, 0x9549, + 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, 0x954D, 0xBDE2, + 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, 0x9551, 0xBDE6, 0x9552, + 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, 0x9555, 0xBDEB, 0x9556, 0xBDEC, + 0x9557, 0xBDED, 0x9558, 0xBDEE, 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, + 0xBDF2, 0x9562, 0xBDF3, 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, + 0x9566, 0xBDF9, 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, + 0xBDFD, 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, 0x9573, + 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, 0x9577, 0xBE0F, + 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, 0x9581, 0xBE15, 0x9582, + 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, 0x9585, 0xBE19, 0x9586, 0xBE1A, + 0x9587, 0xBE1B, 0x9588, 0xBE1E, 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, + 0xBE22, 0x958C, 0xBE23, 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, + 0x9590, 0xBE27, 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, + 0xBE2B, 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, + 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, 0x959D, + 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, 0x95A1, 0xBE38, + 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, 0x95A5, 0xBE3C, 0x95A6, + 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, 0x95A9, 0xBE40, 0x95AA, 0xBE41, + 0x95AB, 0xBE42, 0x95AC, 0xBE43, 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, + 0xBE49, 0x95B0, 0xBE4A, 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, + 0x95B4, 0xBE50, 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, + 0xBE56, 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, 0x95C1, + 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, 0x95C5, 0xBE6C, + 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, 0x95C9, 0xBE72, 0x95CA, + 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, 0x95CD, 0xBE79, 0x95CE, 0xBE7A, + 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, + 0xBE83, 0x95D4, 0xBE85, 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, + 0x95D8, 0xBE89, 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, + 0xBE92, 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, + 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, 0x95E5, + 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, 0x95E9, 0xBEA1, + 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, 0x95ED, 0xBEA5, 0x95EE, + 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, + 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, + 0xBEB0, 0x95F8, 0xBEB1, 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, + 0x95FC, 0xBEB5, 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, + 0xBEB9, 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, 0x964B, + 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, 0x964F, 0xBEC6, + 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, 0x9653, 0xBECA, 0x9654, + 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, 0x9657, 0xBECE, 0x9658, 0xBECF, + 0x9659, 0xBED2, 0x965A, 0xBED3, 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, + 0xBED9, 0x9664, 0xBEDA, 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, + 0x9668, 0xBEDE, 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, + 0xBEE6, 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, + 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, 0x9675, + 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, 0x9679, 0xBEF4, + 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, 0x9683, 0xBEF8, 0x9684, + 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, 0x9687, 0xBEFC, 0x9688, 0xBEFD, + 0x9689, 0xBEFE, 0x968A, 0xBEFF, 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, + 0xBF03, 0x968E, 0xBF04, 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, + 0x9692, 0xBF0A, 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, + 0xBF0E, 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, 0x969F, + 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, 0x96A3, 0xBF20, + 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, 0x96A7, 0xBF24, 0x96A8, + 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, 0x96AB, 0xBF28, 0x96AC, 0xBF29, + 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, + 0xBF2E, 0x96B2, 0xBF2F, 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, + 0x96B6, 0xBF33, 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, + 0xBF37, 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, + 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, 0x96C3, + 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, 0x96C7, 0xBF47, + 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, 0x96CB, 0xBF4C, 0x96CC, + 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, 0x96CF, 0xBF52, 0x96D0, 0xBF53, + 0x96D1, 0xBF54, 0x96D2, 0xBF56, 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, + 0xBF59, 0x96D6, 0xBF5A, 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, + 0x96DA, 0xBF5E, 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, + 0xBF62, 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, 0x96E7, + 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, 0x96EB, 0xBF6F, + 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, 0x96EF, 0xBF73, 0x96F0, + 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, 0x96F3, 0xBF77, 0x96F4, 0xBF78, + 0x96F5, 0xBF79, 0x96F6, 0xBF7A, 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, + 0xBF7D, 0x96FA, 0xBF7E, 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, + 0x96FE, 0xBF82, 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, + 0xBF86, 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, + 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, 0x974D, + 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, 0x9751, 0xBF93, + 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, 0x9755, 0xBF98, 0x9756, + 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, 0x9759, 0xBF9C, 0x975A, 0xBF9D, + 0x9761, 0xBF9E, 0x9762, 0xBF9F, 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, + 0xBFA2, 0x9766, 0xBFA3, 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, + 0x976A, 0xBFA7, 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, + 0xBFAB, 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, 0x9777, + 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, 0x9781, 0xBFB9, + 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, 0x9785, 0xBFBD, 0x9786, + 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, 0x9789, 0xBFC1, 0x978A, 0xBFC2, + 0x978B, 0xBFC3, 0x978C, 0xBFC4, 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, + 0xBFC8, 0x9790, 0xBFC9, 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, + 0x9794, 0xBFCF, 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, + 0xBFD5, 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, + 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, 0x97A1, + 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, 0x97A5, 0xBFE5, + 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, 0x97A9, 0xBFE9, 0x97AA, + 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, 0x97AD, 0xBFED, 0x97AE, 0xBFEE, + 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, + 0xBFF3, 0x97B4, 0xBFF4, 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, + 0x97B8, 0xBFF8, 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, + 0xBFFC, 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, 0x97C5, + 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, 0x97C9, 0xC009, + 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, 0x97CD, 0xC00D, 0x97CE, + 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, 0x97D1, 0xC011, 0x97D2, 0xC012, + 0x97D3, 0xC013, 0x97D4, 0xC014, 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, + 0xC017, 0x97D8, 0xC018, 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, + 0x97DC, 0xC01C, 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, + 0xC020, 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, + 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, 0x97E9, + 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, 0x97ED, 0xC02D, + 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, 0x97F1, 0xC031, 0x97F2, + 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, 0x97F5, 0xC035, 0x97F6, 0xC036, + 0x97F7, 0xC037, 0x97F8, 0xC038, 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, + 0xC03B, 0x97FC, 0xC03D, 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, + 0x9842, 0xC041, 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, + 0xC045, 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, 0x984F, + 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, 0x9853, 0xC053, + 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, 0x9857, 0xC057, 0x9858, + 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, 0x9861, 0xC05D, 0x9862, 0xC05E, + 0x9863, 0xC05F, 0x9864, 0xC061, 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, + 0xC064, 0x9868, 0xC065, 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, + 0x986C, 0xC06B, 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, + 0xC06F, 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, + 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, 0x9879, + 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, 0x9883, 0xC07C, + 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, 0x9887, 0xC080, 0x9888, + 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, 0x988B, 0xC084, 0x988C, 0xC085, + 0x988D, 0xC086, 0x988E, 0xC087, 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, + 0xC08A, 0x9892, 0xC08B, 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, + 0x9896, 0xC08F, 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, + 0xC096, 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, 0x98A3, + 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, 0x98A7, 0xC0A8, + 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, 0x98AB, 0xC0AE, 0x98AC, + 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, + 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, + 0xC0C3, 0x98B6, 0xC0C4, 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, + 0x98BA, 0xC0CB, 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, + 0xC0D1, 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, + 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, 0x98C7, + 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, 0x98CB, 0xC0E3, + 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, 0x98CF, 0xC0EA, 0x98D0, + 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, + 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, + 0xC0F8, 0x98DA, 0xC0FA, 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, + 0x98DE, 0xC0FE, 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, + 0xC103, 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, 0x98EB, + 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, 0x98EF, 0xC113, + 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, 0x98F3, 0xC118, 0x98F4, + 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, 0x98F7, 0xC121, 0x98F8, 0xC122, + 0x98F9, 0xC125, 0x98FA, 0xC128, 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, + 0xC12B, 0x98FE, 0xC12E, 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, + 0x9944, 0xC135, 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, + 0xC13D, 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, + 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, 0x9951, + 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, 0x9955, 0xC150, + 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, 0x9959, 0xC156, 0x995A, + 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, 0x9963, 0xC15B, 0x9964, 0xC15D, + 0x9965, 0xC15E, 0x9966, 0xC15F, 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, + 0xC162, 0x996A, 0xC163, 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, + 0x996E, 0xC16C, 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, + 0xC171, 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, 0x9981, + 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, 0x9985, 0xC180, + 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, 0x9989, 0xC184, 0x998A, + 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, 0x998D, 0xC189, 0x998E, 0xC18A, + 0x998F, 0xC18B, 0x9990, 0xC18F, 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, + 0xC193, 0x9994, 0xC195, 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, + 0x9998, 0xC19A, 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, + 0xC1A2, 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, + 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, 0x99A5, + 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, 0x99A9, 0xC1B4, + 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, 0x99AD, 0xC1B8, 0x99AE, + 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, + 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, + 0xC1C3, 0x99B8, 0xC1C5, 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, + 0x99BC, 0xC1CA, 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, + 0xC1CF, 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, 0x99C9, + 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, 0x99CD, 0xC1DF, + 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, 0x99D1, 0xC1E5, 0x99D2, + 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, + 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, + 0xC1F2, 0x99DC, 0xC1F4, 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, + 0x99E0, 0xC1F8, 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, + 0xC1FE, 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, + 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, 0x99ED, + 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, 0x99F1, 0xC210, + 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, 0x99F5, 0xC215, 0x99F6, + 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, 0x99F9, 0xC21B, 0x99FA, 0xC21D, + 0x99FB, 0xC21E, 0x99FC, 0xC221, 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, + 0xC224, 0x9A42, 0xC225, 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, + 0x9A46, 0xC22C, 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, + 0xC235, 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, 0x9A53, + 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, 0x9A57, 0xC242, + 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, 0x9A61, 0xC246, 0x9A62, + 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, 0x9A65, 0xC24B, 0x9A66, 0xC24C, + 0x9A67, 0xC24D, 0x9A68, 0xC24E, 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, + 0xC253, 0x9A6C, 0xC255, 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, + 0x9A70, 0xC25A, 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, + 0xC25E, 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, + 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, 0x9A83, + 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, 0x9A87, 0xC26F, + 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, 0x9A8B, 0xC275, 0x9A8C, + 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, 0x9A8F, 0xC279, 0x9A90, 0xC27A, + 0x9A91, 0xC27B, 0x9A92, 0xC27E, 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, + 0xC283, 0x9A96, 0xC284, 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, + 0x9A9A, 0xC28A, 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, + 0xC28E, 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, 0x9AA7, + 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, 0x9AAB, 0xC29F, + 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, 0x9AAF, 0xC2A3, 0x9AB0, + 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, + 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, + 0xC2B2, 0x9ABA, 0xC2B3, 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, + 0x9ABE, 0xC2BB, 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, + 0xC2BF, 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, + 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, 0x9ACB, + 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, 0x9ACF, 0xC2CC, + 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, 0x9AD3, 0xC2D0, 0x9AD4, + 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, + 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, + 0xC2DA, 0x9ADE, 0xC2DB, 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, + 0x9AE2, 0xC2E2, 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, + 0xC2E8, 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, 0x9AEF, + 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, 0x9AF3, 0xC2FF, + 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, 0x9AF7, 0xC304, 0x9AF8, + 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, + 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, + 0xC312, 0x9B44, 0xC316, 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, + 0x9B48, 0xC31B, 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, + 0xC320, 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, + 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, 0x9B55, + 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, 0x9B59, 0xC331, + 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, 0x9B63, 0xC335, 0x9B64, + 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, 0x9B67, 0xC339, 0x9B68, 0xC33A, + 0x9B69, 0xC33B, 0x9B6A, 0xC33C, 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, + 0xC33F, 0x9B6E, 0xC340, 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, + 0x9B72, 0xC344, 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, + 0xC349, 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, 0x9B85, + 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, 0x9B89, 0xC356, + 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, 0x9B8D, 0xC35A, 0x9B8E, + 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, 0x9B91, 0xC35E, 0x9B92, 0xC35F, + 0x9B93, 0xC360, 0x9B94, 0xC361, 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, + 0xC364, 0x9B98, 0xC365, 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, + 0x9B9C, 0xC36B, 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, + 0xC371, 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, + 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, 0x9BA9, + 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, 0x9BAD, 0xC383, + 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, 0x9BB1, 0xC389, 0x9BB2, + 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, + 0x9BB7, 0xC390, 0x9BB8, 0xC391, 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, + 0xC394, 0x9BBC, 0xC395, 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, + 0x9BC0, 0xC399, 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, + 0xC39D, 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, 0x9BCD, + 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, 0x9BD1, 0xC3AA, + 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, 0x9BD5, 0xC3AE, 0x9BD6, + 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, + 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, + 0xC3B8, 0x9BE0, 0xC3B9, 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, + 0x9BE4, 0xC3BD, 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, + 0xC3C2, 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, + 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, 0x9BF1, + 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, 0x9BF5, 0xC3CF, + 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, 0x9BF9, 0xC3D3, 0x9BFA, + 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, + 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, + 0xC3E3, 0x9C46, 0xC3E4, 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, + 0x9C4A, 0xC3EA, 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, + 0xC3EF, 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, 0x9C57, + 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, 0x9C61, 0xC3FF, + 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, 0x9C65, 0xC403, 0x9C66, + 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, 0x9C69, 0xC407, 0x9C6A, 0xC409, + 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, + 0xC40E, 0x9C70, 0xC40F, 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, + 0x9C74, 0xC414, 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, + 0xC418, 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, + 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, 0x9C87, + 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, 0x9C8B, 0xC426, + 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, 0x9C8F, 0xC42A, 0x9C90, + 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, 0x9C93, 0xC42F, 0x9C94, 0xC431, + 0x9C95, 0xC432, 0x9C96, 0xC433, 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, + 0xC437, 0x9C9A, 0xC438, 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, + 0x9C9E, 0xC43E, 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, + 0xC442, 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, 0x9CAB, + 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, 0x9CAF, 0xC450, + 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, 0x9CB3, 0xC454, 0x9CB4, + 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, 0x9CB7, 0xC458, 0x9CB8, 0xC459, + 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, + 0xC45E, 0x9CBE, 0xC45F, 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, + 0x9CC2, 0xC463, 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, + 0xC46A, 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, + 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, 0x9CCF, + 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, 0x9CD3, 0xC47B, + 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, 0x9CD7, 0xC47F, 0x9CD8, + 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, 0x9CDB, 0xC484, 0x9CDC, 0xC485, + 0x9CDD, 0xC486, 0x9CDE, 0xC487, 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, + 0xC48A, 0x9CE2, 0xC48B, 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, + 0x9CE6, 0xC48F, 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, + 0xC493, 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, 0x9CF3, + 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, 0x9CF7, 0xC4A2, + 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, 0x9CFB, 0xC4A6, 0x9CFC, + 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, + 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, + 0xC4B0, 0x9D48, 0xC4B1, 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, + 0x9D4C, 0xC4B5, 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, + 0xC4BA, 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, + 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, 0x9D59, + 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, 0x9D63, 0xC4C8, + 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, 0x9D67, 0xC4CC, 0x9D68, + 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, + 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, + 0xC4D6, 0x9D72, 0xC4D7, 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, + 0x9D76, 0xC4DB, 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, + 0xC4DF, 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, 0x9D89, + 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, 0x9D8D, 0xC4ED, + 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, 0x9D91, 0xC4F3, 0x9D92, + 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, + 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, + 0xC503, 0x9D9C, 0xC504, 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, + 0x9DA0, 0xC508, 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, + 0xC50D, 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, + 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, 0x9DAD, + 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, 0x9DB1, 0xC51D, + 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, 0x9DB5, 0xC521, 0x9DB6, + 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, 0x9DB9, 0xC525, 0x9DBA, 0xC526, + 0x9DBB, 0xC527, 0x9DBC, 0xC52A, 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, + 0xC52E, 0x9DC0, 0xC52F, 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, + 0x9DC4, 0xC534, 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, + 0xC53A, 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, 0x9DD1, + 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, 0x9DD5, 0xC551, + 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, 0x9DD9, 0xC55B, 0x9DDA, + 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, 0x9DDD, 0xC563, 0x9DDE, 0xC565, + 0x9DDF, 0xC566, 0x9DE0, 0xC567, 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, + 0xC56B, 0x9DE4, 0xC56C, 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, + 0x9DE8, 0xC572, 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, + 0xC579, 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, + 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, 0x9DF5, + 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, 0x9DF9, 0xC58B, + 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, 0x9DFD, 0xC593, 0x9DFE, + 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, 0x9E43, 0xC59A, 0x9E44, 0xC59B, + 0x9E45, 0xC59D, 0x9E46, 0xC59E, 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, + 0xC5A2, 0x9E4A, 0xC5A3, 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, + 0x9E4E, 0xC5A7, 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, + 0xC5AC, 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, 0x9E61, + 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, 0x9E65, 0xC5C1, + 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, 0x9E69, 0xC5CD, 0x9E6A, + 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, + 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, + 0xC5DC, 0x9E74, 0xC5DD, 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, + 0x9E78, 0xC5E4, 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, + 0xC5E9, 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, + 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, 0x9E8B, + 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, 0x9E8F, 0xC603, + 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, 0x9E93, 0xC60B, 0x9E94, + 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, 0x9E97, 0xC611, 0x9E98, 0xC612, + 0x9E99, 0xC613, 0x9E9A, 0xC614, 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, + 0xC617, 0x9E9E, 0xC61A, 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, + 0x9EA2, 0xC620, 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, + 0xC626, 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, 0x9EAF, + 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, 0x9EB3, 0xC63E, + 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, 0x9EB7, 0xC645, 0x9EB8, + 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, + 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, + 0xC652, 0x9EC2, 0xC656, 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, + 0x9EC6, 0xC65A, 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, + 0xC661, 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, + 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, 0x9ED3, + 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, 0x9ED7, 0xC670, + 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, 0x9EDB, 0xC675, 0x9EDC, + 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, + 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, + 0xC683, 0x9EE6, 0xC684, 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, + 0x9EEA, 0xC68A, 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, + 0xC690, 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, 0x9EF7, + 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, 0x9EFB, 0xC6A1, + 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, 0x9F41, 0xC6A8, 0x9F42, + 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, + 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, + 0xC6B6, 0x9F4C, 0xC6B7, 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, + 0x9F50, 0xC6BE, 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, + 0xC6C6, 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, + 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, 0x9F63, + 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, 0x9F67, 0xC6D7, + 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, 0x9F6B, 0xC6DB, 0x9F6C, + 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, + 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, + 0xC6EB, 0x9F76, 0xC6ED, 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, + 0x9F7A, 0xC6F2, 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, + 0xC6F6, 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, 0x9F8D, + 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, 0x9F91, 0xC709, + 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, 0x9F95, 0xC70E, 0x9F96, + 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, 0x9F99, 0xC712, 0x9F9A, 0xC713, + 0x9F9B, 0xC716, 0x9F9C, 0xC718, 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, + 0xC71C, 0x9FA0, 0xC71D, 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, + 0x9FA4, 0xC723, 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, + 0xC729, 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, + 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, 0x9FB1, + 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, 0x9FB5, 0xC73B, + 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, 0x9FB9, 0xC742, 0x9FBA, + 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, 0x9FBD, 0xC747, 0x9FBE, 0xC748, + 0x9FBF, 0xC749, 0x9FC0, 0xC74B, 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, + 0xC759, 0x9FC4, 0xC75A, 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, + 0x9FC8, 0xC75F, 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, + 0xC764, 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, 0x9FD5, + 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, 0x9FD9, 0xC773, + 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, 0x9FDD, 0xC77A, 0x9FDE, + 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, 0x9FE1, 0xC781, 0x9FE2, 0xC782, + 0x9FE3, 0xC786, 0x9FE4, 0xC78B, 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, + 0xC78F, 0x9FE8, 0xC792, 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, + 0x9FEC, 0xC79B, 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, + 0xC79F, 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, + 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, 0x9FF9, + 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, 0x9FFD, 0xC7B6, + 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, 0xA043, 0xC7BA, 0xA044, + 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, 0xA047, 0xC7C3, 0xA048, 0xC7C4, + 0xA049, 0xC7C5, 0xA04A, 0xC7C6, 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, + 0xC7CB, 0xA04E, 0xC7CD, 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, + 0xA052, 0xC7D3, 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, + 0xC7D7, 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, 0xA065, + 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, 0xA069, 0xC7E7, + 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, 0xA06D, 0xC7ED, 0xA06E, + 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, 0xA071, 0xC7F1, 0xA072, 0xC7F2, + 0xA073, 0xC7F3, 0xA074, 0xC7F4, 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, + 0xC7F7, 0xA078, 0xC7F8, 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, + 0xA082, 0xC7FC, 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, + 0xC802, 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, + 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, 0xA08F, + 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, 0xA093, 0xC817, + 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, 0xA097, 0xC81B, 0xA098, + 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, 0xA09B, 0xC822, 0xA09C, 0xC823, + 0xA09D, 0xC825, 0xA09E, 0xC826, 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, + 0xC829, 0xA0A2, 0xC82A, 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, + 0xA0A6, 0xC832, 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, + 0xC836, 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, 0xA0B3, + 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, 0xA0B7, 0xC846, + 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, 0xA0BB, 0xC84E, 0xA0BC, + 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, 0xA0BF, 0xC852, 0xA0C0, 0xC853, + 0xA0C1, 0xC855, 0xA0C2, 0xC856, 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, + 0xC859, 0xA0C6, 0xC85A, 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, + 0xA0CA, 0xC85E, 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, + 0xC862, 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, + 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, 0xA0D7, + 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, 0xA0DB, 0xC86F, + 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, 0xA0DF, 0xC876, 0xA0E0, + 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, + 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, + 0xC888, 0xA0EA, 0xC889, 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, + 0xA0EE, 0xC890, 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, + 0xC895, 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, 0xA0FB, + 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, 0xA141, 0xC8A5, + 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, 0xA145, 0xC8AA, 0xA146, + 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, 0xA149, 0xC8AE, 0xA14A, 0xC8AF, + 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, + 0xC8B4, 0xA150, 0xC8B5, 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, + 0xA154, 0xC8B9, 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, + 0xC8BF, 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, + 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, 0xA167, + 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, 0xA16B, 0xC8CF, + 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, 0xA16F, 0xC8D3, 0xA170, + 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, 0xA173, 0xC8DB, 0xA174, 0xC8DC, + 0xA175, 0xC8DD, 0xA176, 0xC8DE, 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, + 0xC8E3, 0xA17A, 0xC8E5, 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, + 0xA184, 0xC8E9, 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, + 0xC8ED, 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, 0xA191, + 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, 0xA195, 0xC8FB, + 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, 0xA199, 0xC902, 0xA19A, + 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, 0xA19D, 0xC909, 0xA19E, 0xC90A, + 0xA19F, 0xC90B, 0xA1A0, 0xC90E, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, + 0x3002, 0xA1A4, 0x00B7, 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, + 0xFF3C, 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, + 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, 0xA1B5, + 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, 0xA1B9, 0x300D, + 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, 0xA1BD, 0x3011, 0xA1BE, + 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, 0xA1C1, 0x2260, 0xA1C2, 0x2264, + 0xA1C3, 0x2265, 0xA1C4, 0x221E, 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, + 0x2032, 0xA1C8, 0x2033, 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, + 0xA1CC, 0xFFE1, 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, + 0x2220, 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, 0xA1D9, + 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, 0xA1DD, 0x25CE, + 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, 0xA1E1, 0x25A0, 0xA1E2, + 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, 0xA1E5, 0x25BC, 0xA1E6, 0x2192, + 0xA1E7, 0x2190, 0xA1E8, 0x2191, 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, + 0x3013, 0xA1EC, 0x226A, 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, + 0xA1F0, 0x221D, 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, + 0x2208, 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, + 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, 0xA1FD, + 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, 0xA243, 0xC913, + 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, 0xA247, 0xC917, 0xA248, + 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, 0xA24B, 0xC91C, 0xA24C, 0xC91D, + 0xA24D, 0xC91E, 0xA24E, 0xC91F, 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, + 0xC922, 0xA252, 0xC923, 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, + 0xA256, 0xC927, 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, + 0xC92B, 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, 0xA269, + 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, 0xA26D, 0xC93A, + 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, 0xA271, 0xC93E, 0xA272, + 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, 0xA275, 0xC942, 0xA276, 0xC943, + 0xA277, 0xC944, 0xA278, 0xC945, 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, + 0xC948, 0xA282, 0xC949, 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, + 0xA286, 0xC94D, 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, + 0xC953, 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, + 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, 0xA293, + 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, 0xA297, 0xC965, + 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, 0xA29B, 0xC969, 0xA29C, + 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, 0xA29F, 0xC96E, 0xA2A0, 0xC96F, + 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, + 0x00B4, 0xA2A6, 0xFF5E, 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, + 0xA2AA, 0x02DA, 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, + 0x00A1, 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, 0xA2B7, + 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, 0xA2BB, 0x2664, + 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, 0xA2BF, 0x2667, 0xA2C0, + 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, + 0xA2C5, 0x25D1, 0xA2C6, 0x2592, 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, + 0x25A8, 0xA2CA, 0x25A7, 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, + 0xA2CE, 0x260F, 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, + 0x00B6, 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, + 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, 0xA2DB, + 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, 0xA2DF, 0x321C, + 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, 0xA2E3, 0x33C2, 0xA2E4, + 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, 0xA2E7, 0x00AE, 0xA341, 0xC971, + 0xA342, 0xC972, 0xA343, 0xC973, 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, + 0xC977, 0xA347, 0xC978, 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, + 0xA34B, 0xC97D, 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, + 0xC981, 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, 0xA358, + 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, 0xA362, 0xC992, + 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, 0xA366, 0xC996, 0xA367, + 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, 0xA36A, 0xC99E, 0xA36B, 0xC99F, + 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, + 0xC9A4, 0xA371, 0xC9A5, 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, + 0xA375, 0xC9A9, 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, + 0xC9AD, 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, + 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, 0xA388, + 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, 0xA38C, 0xC9BA, + 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, 0xA390, 0xC9BE, 0xA391, + 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, 0xA394, 0xC9C5, 0xA395, 0xC9C6, + 0xA396, 0xC9C9, 0xA397, 0xC9CB, 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, + 0xC9CE, 0xA39B, 0xC9CF, 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, + 0xA39F, 0xC9D8, 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, + 0xFF03, 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, 0xA3AC, + 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, 0xA3B0, 0xFF10, + 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, 0xA3B4, 0xFF14, 0xA3B5, + 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, + 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, + 0xFF1E, 0xA3BF, 0xFF1F, 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, + 0xA3C3, 0xFF23, 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, + 0xFF27, 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, 0xA3D0, + 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, 0xA3D4, 0xFF34, + 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, 0xA3D8, 0xFF38, 0xA3D9, + 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, + 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, + 0xFF42, 0xA3E3, 0xFF43, 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, + 0xA3E7, 0xFF47, 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, + 0xFF4B, 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, 0xA3F4, + 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, 0xA3F8, 0xFF58, + 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, 0xA3FC, 0xFF5C, 0xA3FD, + 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, 0xA442, 0xC9DF, 0xA443, 0xC9E1, + 0xA444, 0xC9E3, 0xA445, 0xC9E5, 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, + 0xC9E9, 0xA449, 0xC9EA, 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, + 0xA44D, 0xC9F3, 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, + 0xC9F7, 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, + 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, 0xA45A, + 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, 0xA464, 0xCA0A, + 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, 0xA468, 0xCA11, 0xA469, + 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, 0xA46C, 0xCA16, 0xA46D, 0xCA17, + 0xA46E, 0xCA19, 0xA46F, 0xCA1A, 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, + 0xCA1D, 0xA473, 0xCA1E, 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, + 0xA477, 0xCA22, 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, + 0xCA26, 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, 0xA48A, + 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, 0xA48E, 0xCA34, + 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, 0xA492, 0xCA38, 0xA493, + 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, 0xA496, 0xCA3C, 0xA497, 0xCA3D, + 0xA498, 0xCA3E, 0xA499, 0xCA3F, 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, + 0xCA42, 0xA49D, 0xCA43, 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, + 0xA4A1, 0x3131, 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, + 0x3135, 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, + 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, 0xA4AE, + 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, 0xA4B2, 0x3142, + 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, 0xA4B6, 0x3146, 0xA4B7, + 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, 0xA4BA, 0x314A, 0xA4BB, 0x314B, + 0xA4BC, 0x314C, 0xA4BD, 0x314D, 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, + 0x3150, 0xA4C1, 0x3151, 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, + 0xA4C5, 0x3155, 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, + 0x3159, 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, 0xA4D2, + 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, 0xA4D6, 0x3166, + 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, 0xA4DA, 0x316A, 0xA4DB, + 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, 0xA4DE, 0x316E, 0xA4DF, 0x316F, + 0xA4E0, 0x3170, 0xA4E1, 0x3171, 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, + 0x3174, 0xA4E5, 0x3175, 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, + 0xA4E9, 0x3179, 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, + 0x317D, 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, + 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, 0xA4F6, + 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, 0xA4FA, 0x318A, + 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, 0xA4FE, 0x318E, 0xA541, + 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, 0xA544, 0xCA4A, 0xA545, 0xCA4B, + 0xA546, 0xCA4E, 0xA547, 0xCA4F, 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, + 0xCA53, 0xA54B, 0xCA55, 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, + 0xA54F, 0xCA59, 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, + 0xCA62, 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, 0xA562, + 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, 0xA566, 0xCA70, + 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, 0xA56A, 0xCA74, 0xA56B, + 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, 0xA56E, 0xCA78, 0xA56F, 0xCA79, + 0xA570, 0xCA7A, 0xA571, 0xCA7B, 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, + 0xCA7F, 0xA575, 0xCA80, 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, + 0xA579, 0xCA85, 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, + 0xCA89, 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, + 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, 0xA58C, + 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, 0xA590, 0xCA96, + 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, 0xA594, 0xCA9B, 0xA595, + 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, 0xA598, 0xCA9F, 0xA599, 0xCAA0, + 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, + 0xCAA5, 0xA59F, 0xCAA6, 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, + 0xA5A3, 0x2172, 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, + 0x2176, 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, 0xA5B5, + 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, 0xA5B9, 0x2169, + 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, 0xA5C4, 0x0394, 0xA5C5, + 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, 0xA5C8, 0x0398, 0xA5C9, 0x0399, + 0xA5CA, 0x039A, 0xA5CB, 0x039B, 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, + 0x039E, 0xA5CF, 0x039F, 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, + 0xA5D3, 0x03A4, 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, + 0x03A8, 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, + 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, 0xA5E8, + 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, 0xA5EC, 0x03BC, + 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, 0xA5F0, 0x03C0, 0xA5F1, + 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, + 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, + 0xCAA9, 0xA643, 0xCAAA, 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, + 0xA647, 0xCAAE, 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, + 0xCAB2, 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, 0xA654, + 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, 0xA658, 0xCAC2, + 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, 0xA662, 0xCAC7, 0xA663, + 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, 0xA666, 0xCACB, 0xA667, 0xCACE, + 0xA668, 0xCAD0, 0xA669, 0xCAD2, 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, + 0xCAD6, 0xA66D, 0xCAD7, 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, + 0xA671, 0xCADD, 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, + 0xCAE2, 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, + 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, 0xA684, + 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, 0xA688, 0xCAF0, + 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, 0xA68C, 0xCAF5, 0xA68D, + 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, 0xA690, 0xCAF9, 0xA691, 0xCAFA, + 0xA692, 0xCAFB, 0xA693, 0xCAFC, 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, + 0xCAFF, 0xA697, 0xCB00, 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, + 0xA69B, 0xCB04, 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, + 0xCB09, 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, 0xA6A8, + 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, 0xA6AC, 0x2501, + 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, 0xA6B0, 0x251B, 0xA6B1, + 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, 0xA6B4, 0x252B, 0xA6B5, 0x253B, + 0xA6B6, 0x254B, 0xA6B7, 0x2520, 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, + 0x2537, 0xA6BB, 0x253F, 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, + 0xA6BF, 0x2538, 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, + 0x251A, 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, + 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, 0xA6CC, + 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, 0xA6D0, 0x252A, + 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, 0xA6D4, 0x2532, 0xA6D5, + 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, 0xA6D8, 0x253A, 0xA6D9, 0x253D, + 0xA6DA, 0x253E, 0xA6DB, 0x2540, 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, + 0x2544, 0xA6DF, 0x2545, 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, + 0xA6E3, 0x2549, 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, + 0xCB0D, 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, 0xA74C, + 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, 0xA750, 0xCB1D, + 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, 0xA754, 0xCB23, 0xA755, + 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, 0xA758, 0xCB27, 0xA759, 0xCB28, + 0xA75A, 0xCB29, 0xA761, 0xCB2A, 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, + 0xCB2D, 0xA765, 0xCB2E, 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, + 0xA769, 0xCB32, 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, + 0xCB36, 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, + 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, 0xA776, + 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, 0xA77A, 0xCB44, + 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, 0xA784, 0xCB4A, 0xA785, + 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, 0xA788, 0xCB4F, 0xA789, 0xCB51, + 0xA78A, 0xCB52, 0xA78B, 0xCB53, 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, + 0xCB56, 0xA78F, 0xCB57, 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, + 0xA793, 0xCB5E, 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, + 0xCB62, 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, 0xA7A0, + 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, 0xA7A4, 0x2113, + 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, 0xA7A8, 0x33A4, 0xA7A9, + 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, 0xA7AC, 0x339A, 0xA7AD, 0x339B, + 0xA7AE, 0x339C, 0xA7AF, 0x339D, 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, + 0x33A0, 0xA7B3, 0x33A1, 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, + 0xA7B7, 0x338E, 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, + 0x3389, 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, + 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, 0xA7C4, + 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, 0xA7C8, 0x33B9, + 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, 0xA7CC, 0x3383, 0xA7CD, + 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, + 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, + 0x3392, 0xA7D7, 0x3393, 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, + 0xA7DB, 0x33C1, 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, + 0x33D6, 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, 0xA7E8, + 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, 0xA7EC, 0x33C3, + 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, 0xA841, 0xCB6D, 0xA842, + 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, 0xA845, 0xCB71, 0xA846, 0xCB72, + 0xA847, 0xCB73, 0xA848, 0xCB74, 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, + 0xCB77, 0xA84C, 0xCB7A, 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, + 0xA850, 0xCB7E, 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, + 0xCB82, 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, + 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, 0xA863, + 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, 0xA867, 0xCB8F, + 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, 0xA86B, 0xCB93, 0xA86C, + 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, 0xA86F, 0xCB97, 0xA870, 0xCB98, + 0xA871, 0xCB99, 0xA872, 0xCB9A, 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, + 0xCB9E, 0xA876, 0xCB9F, 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, + 0xA87A, 0xCBA3, 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, + 0xCBA7, 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, 0xA88D, + 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, 0xA891, 0xCBB4, + 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, 0xA895, 0xCBB9, 0xA896, + 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, 0xA899, 0xCBBD, 0xA89A, 0xCBBE, + 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, + 0xCBC3, 0xA8A0, 0xCBC4, 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, + 0xA8A4, 0x0126, 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, + 0x00D8, 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, + 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, 0xA8B4, + 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, 0xA8B8, 0x3267, + 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, 0xA8BC, 0x326B, 0xA8BD, + 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, 0xA8C0, 0x326F, 0xA8C1, 0x3270, + 0xA8C2, 0x3271, 0xA8C3, 0x3272, 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, + 0x3275, 0xA8C7, 0x3276, 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, + 0xA8CB, 0x327A, 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, + 0x24D2, 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, 0xA8D8, + 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, 0xA8DC, 0x24DF, + 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, 0xA8E0, 0x24E3, 0xA8E1, + 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, + 0xA8E6, 0x24E9, 0xA8E7, 0x2460, 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, + 0x2463, 0xA8EB, 0x2464, 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, + 0xA8EF, 0x2468, 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, + 0x246C, 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, + 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, 0xA8FC, + 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, 0xA942, 0xCBC6, + 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, 0xA946, 0xCBCA, 0xA947, + 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, + 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, + 0xCBD5, 0xA951, 0xCBD6, 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, + 0xA955, 0xCBDA, 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, + 0xCBDE, 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, 0xA968, + 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, 0xA96C, 0xCBEE, + 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, 0xA970, 0xCBF2, 0xA971, + 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, 0xA974, 0xCBF6, 0xA975, 0xCBF7, + 0xA976, 0xCBF8, 0xA977, 0xCBF9, 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, + 0xCBFC, 0xA981, 0xCBFD, 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, + 0xA985, 0xCC01, 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, + 0xCC05, 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, + 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, 0xA992, + 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, 0xA996, 0xCC16, + 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, 0xA99A, 0xCC1A, 0xA99B, + 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, 0xA99E, 0xCC20, 0xA99F, 0xCC23, + 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, + 0x0127, 0xA9A5, 0x0131, 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, + 0xA9A9, 0x0142, 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, + 0x00FE, 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, 0xA9B6, + 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, 0xA9BA, 0x3209, + 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, 0xA9BE, 0x320D, 0xA9BF, + 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, 0xA9C2, 0x3211, 0xA9C3, 0x3212, + 0xA9C4, 0x3213, 0xA9C5, 0x3214, 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, + 0x3217, 0xA9C9, 0x3218, 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, + 0xA9CD, 0x249C, 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, + 0x24A0, 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, + 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, 0xA9DA, + 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, 0xA9DE, 0x24AD, + 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, 0xA9E2, 0x24B1, 0xA9E3, + 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, 0xA9E6, 0x24B5, 0xA9E7, 0x2474, + 0xA9E8, 0x2475, 0xA9E9, 0x2476, 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, + 0x2479, 0xA9ED, 0x247A, 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, + 0xA9F1, 0x247E, 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, + 0x2482, 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, 0xA9FE, + 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, 0xAA44, 0xCC2B, + 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, 0xAA48, 0xCC32, 0xAA49, + 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, + 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, + 0xCC42, 0xAA53, 0xCC43, 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, + 0xAA57, 0xCC4A, 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, + 0xCC4F, 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, + 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, 0xAA6A, + 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, 0xAA6E, 0xCC62, + 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, 0xAA72, 0xCC69, 0xAA73, + 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, + 0xAA78, 0xCC6F, 0xAA79, 0xCC71, 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, + 0xCC74, 0xAA83, 0xCC76, 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, + 0xAA87, 0xCC7A, 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, + 0xCC7E, 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, 0xAA94, + 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, 0xAA98, 0xCC8B, + 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, 0xAA9C, 0xCC8F, 0xAA9D, + 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, 0xAAA0, 0xCC93, 0xAAA1, 0x3041, + 0xAAA2, 0x3042, 0xAAA3, 0x3043, 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, + 0x3046, 0xAAA7, 0x3047, 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, + 0xAAAB, 0x304B, 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, + 0x304F, 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, + 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, 0xAAB8, + 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, 0xAABC, 0x305C, + 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, 0xAAC0, 0x3060, 0xAAC1, + 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, 0xAAC4, 0x3064, 0xAAC5, 0x3065, + 0xAAC6, 0x3066, 0xAAC7, 0x3067, 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, + 0x306A, 0xAACB, 0x306B, 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, + 0xAACF, 0x306F, 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, + 0x3073, 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, 0xAADC, + 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, 0xAAE0, 0x3080, + 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, 0xAAE4, 0x3084, 0xAAE5, + 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, 0xAAE8, 0x3088, 0xAAE9, 0x3089, + 0xAAEA, 0x308A, 0xAAEB, 0x308B, 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, + 0x308E, 0xAAEF, 0x308F, 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, + 0xAAF3, 0x3093, 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, + 0xCC97, 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, + 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, 0xAB4D, + 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, 0xAB51, 0xCCAA, + 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, 0xAB55, 0xCCB1, 0xAB56, + 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, + 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, + 0xCCBF, 0xAB66, 0xCCC0, 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, + 0xAB6A, 0xCCC6, 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, + 0xCCCC, 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, 0xAB77, + 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, 0xAB81, 0xCCDB, + 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, 0xAB85, 0xCCDF, 0xAB86, + 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, + 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, + 0xCCEA, 0xAB90, 0xCCEB, 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, + 0xAB94, 0xCCF1, 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, + 0xCCF5, 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, + 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, 0xABA1, + 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, 0xABA5, 0x30A5, + 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, 0xABA9, 0x30A9, 0xABAA, + 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, 0xABAD, 0x30AD, 0xABAE, 0x30AE, + 0xABAF, 0x30AF, 0xABB0, 0x30B0, 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, + 0x30B3, 0xABB4, 0x30B4, 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, + 0xABB8, 0x30B8, 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, + 0x30BC, 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, 0xABC5, + 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, 0xABC9, 0x30C9, + 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, 0xABCD, 0x30CD, 0xABCE, + 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, 0xABD1, 0x30D1, 0xABD2, 0x30D2, + 0xABD3, 0x30D3, 0xABD4, 0x30D4, 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, + 0x30D7, 0xABD8, 0x30D8, 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, + 0xABDC, 0x30DC, 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, + 0x30E0, 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, + 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, 0xABE9, + 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, 0xABED, 0x30ED, + 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, 0xABF1, 0x30F1, 0xABF2, + 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, 0xABF5, 0x30F5, 0xABF6, 0x30F6, + 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, + 0xCD03, 0xAC46, 0xCD04, 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, + 0xAC4A, 0xCD0A, 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, + 0xCD0F, 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, 0xAC57, + 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, 0xAC61, 0xCD21, + 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, 0xAC65, 0xCD26, 0xAC66, + 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, + 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, + 0xCD32, 0xAC70, 0xCD33, 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, + 0xAC74, 0xCD37, 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, + 0xCD3C, 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, + 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, 0xAC87, + 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, 0xAC8B, 0xCD49, + 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, 0xAC8F, 0xCD4D, 0xAC90, + 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, 0xAC93, 0xCD51, 0xAC94, 0xCD52, + 0xAC95, 0xCD53, 0xAC96, 0xCD54, 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, + 0xCD57, 0xAC9A, 0xCD58, 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, + 0xAC9E, 0xCD5D, 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, + 0x0411, 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, 0xACAB, + 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, 0xACAF, 0x041D, + 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, 0xACB3, 0x0421, 0xACB4, + 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, 0xACB7, 0x0425, 0xACB8, 0x0426, + 0xACB9, 0x0427, 0xACBA, 0x0428, 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, + 0x042B, 0xACBE, 0x042C, 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, + 0xACD1, 0x0430, 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, + 0x0434, 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, + 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, 0xACDE, + 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, 0xACE2, 0x0440, + 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, 0xACE6, 0x0444, 0xACE7, + 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, 0xACEA, 0x0448, 0xACEB, 0x0449, + 0xACEC, 0x044A, 0xACED, 0x044B, 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, + 0x044E, 0xACF1, 0x044F, 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, + 0xAD44, 0xCD65, 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, + 0xCD69, 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, 0xAD51, + 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, 0xAD55, 0xCD7B, + 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, 0xAD59, 0xCD7F, 0xAD5A, + 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, 0xAD63, 0xCD83, 0xAD64, 0xCD84, + 0xAD65, 0xCD85, 0xAD66, 0xCD86, 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, + 0xCD8A, 0xAD6A, 0xCD8B, 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, + 0xAD6E, 0xCD8F, 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, + 0xCD93, 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, + 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, 0xAD81, + 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, 0xAD85, 0xCDA6, + 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, 0xAD89, 0xCDAC, 0xAD8A, + 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, + 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, + 0xCDB7, 0xAD94, 0xCDB8, 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, + 0xAD98, 0xCDBC, 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, + 0xCDC0, 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, 0xAE45, + 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, 0xAE49, 0xCDCF, + 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, 0xAE4D, 0xCDD4, 0xAE4E, + 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, + 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, + 0xCDDE, 0xAE58, 0xCDDF, 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, + 0xAE62, 0xCDE3, 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, + 0xCDE7, 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, + 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, 0xAE6F, + 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, 0xAE73, 0xCDF7, + 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, 0xAE77, 0xCDFF, 0xAE78, + 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, 0xAE81, 0xCE03, 0xAE82, 0xCE05, + 0xAE83, 0xCE06, 0xAE84, 0xCE07, 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, + 0xCE0B, 0xAE88, 0xCE0D, 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, + 0xAE8C, 0xCE11, 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, + 0xCE16, 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, 0xAE99, + 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, 0xAE9D, 0xCE27, + 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, 0xAF41, 0xCE2C, 0xAF42, + 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, 0xAF45, 0xCE32, 0xAF46, 0xCE34, + 0xAF47, 0xCE36, 0xAF48, 0xCE37, 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, + 0xCE3A, 0xAF4C, 0xCE3B, 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, + 0xAF50, 0xCE3F, 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, + 0xCE43, 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, + 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, 0xAF63, + 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, 0xAF67, 0xCE50, + 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, 0xAF6B, 0xCE54, 0xAF6C, + 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, + 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, + 0xCE64, 0xAF76, 0xCE65, 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, + 0xAF7A, 0xCE6C, 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, + 0xCE71, 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, 0xAF8D, + 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, 0xAF91, 0xCE82, + 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, 0xAF95, 0xCE8A, 0xAF96, + 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, + 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, + 0xCE97, 0xAFA0, 0xCE99, 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, + 0xB044, 0xCE9D, 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, + 0xCEA6, 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, + 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, 0xB051, + 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, 0xB055, 0xCEB5, + 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, 0xB059, 0xCEB9, 0xB05A, + 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, 0xB063, 0xCEBD, 0xB064, 0xCEBE, + 0xB065, 0xCEBF, 0xB066, 0xCEC0, 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, + 0xCEC4, 0xB06A, 0xCEC5, 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, + 0xB06E, 0xCEC9, 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, + 0xCECD, 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, 0xB081, + 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, 0xB085, 0xCEDA, + 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, 0xB089, 0xCEDE, 0xB08A, + 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, + 0xB08F, 0xCEE6, 0xB090, 0xCEE7, 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, + 0xCEED, 0xB094, 0xCEEE, 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, + 0xB098, 0xCEF2, 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, + 0xCEFB, 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, + 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, 0xB0A5, + 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, 0xB0A9, 0xAC11, + 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, 0xB0AD, 0xAC15, 0xB0AE, + 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, + 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, + 0xAC2C, 0xB0B8, 0xAC2D, 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, + 0xB0BC, 0xAC38, 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, + 0xAC4B, 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, 0xB0C9, + 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, 0xB0CD, 0xAC83, + 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, 0xB0D1, 0xAC89, 0xB0D2, + 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, + 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, + 0xACA1, 0xB0DC, 0xACA8, 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, + 0xB0E0, 0xACAF, 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, + 0xACBB, 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, + 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, 0xB0ED, + 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, 0xB0F1, 0xACE8, + 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, 0xB0F5, 0xACF0, 0xB0F6, + 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, + 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, + 0xCF02, 0xB142, 0xCF03, 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, + 0xB146, 0xCF09, 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, + 0xCF0D, 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, 0xB153, + 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, 0xB157, 0xCF1F, + 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, 0xB161, 0xCF25, 0xB162, + 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, 0xB165, 0xCF29, 0xB166, 0xCF2A, + 0xB167, 0xCF2B, 0xB168, 0xCF2E, 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, + 0xCF34, 0xB16C, 0xCF35, 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, + 0xB170, 0xCF3A, 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, + 0xCF3E, 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, + 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, 0xB183, + 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, 0xB187, 0xCF4B, + 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, 0xB18B, 0xCF4F, 0xB18C, + 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, 0xB18F, 0xCF53, 0xB190, 0xCF56, + 0xB191, 0xCF57, 0xB192, 0xCF59, 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, + 0xCF5D, 0xB196, 0xCF5E, 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, + 0xB19A, 0xCF62, 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, + 0xCF6A, 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, 0xB1A7, + 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, 0xB1AB, 0xAD34, + 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, 0xB1AF, 0xAD44, 0xB1B0, + 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, + 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, + 0xAD6D, 0xB1BA, 0xAD70, 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, + 0xB1BE, 0xAD76, 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, + 0xAD7F, 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, + 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, 0xB1CB, + 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, 0xB1CF, 0xADC4, + 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, 0xB1D3, 0xADD3, 0xB1D4, + 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, + 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, + 0xAE08, 0xB1DE, 0xAE09, 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, + 0xB1E2, 0xAE30, 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, + 0xAE38, 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, 0xB1EF, + 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, 0xB1F3, 0xAE56, + 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, 0xB1F7, 0xAE60, 0xB1F8, + 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, + 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, + 0xCF6F, 0xB244, 0xCF72, 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, + 0xB248, 0xCF77, 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, + 0xCF7C, 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, + 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, 0xB255, + 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, 0xB259, 0xCF8B, + 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, 0xB263, 0xCF90, 0xB264, + 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, 0xB267, 0xCF94, 0xB268, 0xCF95, + 0xB269, 0xCF96, 0xB26A, 0xCF97, 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, + 0xCF9A, 0xB26E, 0xCF9B, 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, + 0xB272, 0xCF9F, 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, + 0xCFA4, 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, 0xB285, + 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, 0xB289, 0xCFB3, + 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, 0xB28D, 0xCFB7, 0xB28E, + 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, 0xB291, 0xCFBB, 0xB292, 0xCFBC, + 0xB293, 0xCFBD, 0xB294, 0xCFBE, 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, + 0xCFC1, 0xB298, 0xCFC2, 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, + 0xB29C, 0xCFC7, 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, + 0xCFCB, 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, + 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, 0xB2A9, + 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, 0xB2AD, 0xAECC, + 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, 0xB2B1, 0xAED1, 0xB2B2, + 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, + 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, + 0xAF07, 0xB2BC, 0xAF08, 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, + 0xB2C0, 0xAF2D, 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, + 0xAF3C, 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, 0xB2CD, + 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, 0xB2D1, 0xAF79, + 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, 0xB2D5, 0xAF90, 0xB2D6, + 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, + 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, + 0xAFC9, 0xB2E0, 0xAFCB, 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, + 0xB2E4, 0xAFDC, 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, + 0xAFF1, 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, + 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, 0xB2F1, + 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, 0xB2F5, 0xB045, + 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, 0xB2F9, 0xB04E, 0xB2FA, + 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, 0xB2FD, 0xB057, 0xB2FE, 0xB059, + 0xB341, 0xCFCC, 0xB342, 0xCFCD, 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, + 0xCFD0, 0xB346, 0xCFD1, 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, + 0xB34A, 0xCFD5, 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, + 0xCFD9, 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, 0xB357, + 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, 0xB361, 0xCFEA, + 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, 0xB365, 0xCFEE, 0xB366, + 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, 0xB369, 0xCFF6, 0xB36A, 0xCFF7, + 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, + 0xCFFD, 0xB370, 0xCFFE, 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, + 0xB374, 0xD003, 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, + 0xD008, 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, + 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, 0xB387, + 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, 0xB38B, 0xD016, + 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, 0xB38F, 0xD01B, 0xB390, + 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, 0xB393, 0xD01F, 0xB394, 0xD020, + 0xB395, 0xD021, 0xB396, 0xD022, 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, + 0xD025, 0xB39A, 0xD026, 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, + 0xB39E, 0xD02A, 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, + 0xB07C, 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, 0xB3AB, + 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, 0xB3AF, 0xB0A0, + 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, 0xB3B3, 0xB0A9, 0xB3B4, + 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, + 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, + 0xB0B8, 0xB3BE, 0xB0BC, 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, + 0xB3C2, 0xB0C8, 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, + 0xB0D4, 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, + 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, 0xB3CF, + 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, 0xB3D3, 0xB11B, + 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, 0xB3D7, 0xB124, 0xB3D8, + 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, 0xB3DB, 0xB134, 0xB3DC, 0xB135, + 0xB3DD, 0xB137, 0xB3DE, 0xB138, 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, + 0xB141, 0xB3E2, 0xB144, 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, + 0xB3E6, 0xB154, 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, + 0xB160, 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, 0xB3F3, + 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, 0xB3F7, 0xB198, + 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, 0xB3FB, 0xB1D0, 0xB3FC, + 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, 0xB441, 0xD02E, 0xB442, 0xD02F, + 0xB443, 0xD030, 0xB444, 0xD031, 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, + 0xD036, 0xB448, 0xD037, 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, + 0xB44C, 0xD03D, 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, + 0xD041, 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, + 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, 0xB459, + 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, 0xB463, 0xD053, + 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, 0xB467, 0xD059, 0xB468, + 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, 0xB46B, 0xD05D, 0xB46C, 0xD05E, + 0xB46D, 0xD05F, 0xB46E, 0xD061, 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, + 0xD064, 0xB472, 0xD065, 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, + 0xB476, 0xD069, 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, + 0xD06F, 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, 0xB489, + 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, 0xB48D, 0xD080, + 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, 0xB491, 0xD085, 0xB492, + 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, 0xB495, 0xD089, 0xB496, 0xD08A, + 0xB497, 0xD08B, 0xB498, 0xD08C, 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, + 0xD08F, 0xB49C, 0xD090, 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, + 0xB4A0, 0xD094, 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, + 0xB1EC, 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, + 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, 0xB4AD, + 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, 0xB4B1, 0xB219, + 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, 0xB4B5, 0xB258, 0xB4B6, + 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, 0xB4B9, 0xB269, 0xB4BA, 0xB274, + 0xB4BB, 0xB275, 0xB4BC, 0xB27C, 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, + 0xB289, 0xB4C0, 0xB290, 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, + 0xB4C4, 0xB299, 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, + 0xB2A3, 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, 0xB4D1, + 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, 0xB4D5, 0xB2D9, + 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, 0xB4D9, 0xB2E4, 0xB4DA, + 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, + 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, + 0xB2F4, 0xB4E4, 0xB2F5, 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, + 0xB4E8, 0xB2FA, 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, + 0xB301, 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, + 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, 0xB4F5, + 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, 0xB4F9, 0xB35B, + 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, 0xB4FD, 0xB364, 0xB4FE, + 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, 0xB543, 0xD097, 0xB544, 0xD098, + 0xB545, 0xD099, 0xB546, 0xD09A, 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, + 0xD09D, 0xB54A, 0xD09E, 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, + 0xB54E, 0xD0A2, 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, + 0xD0A9, 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, 0xB561, + 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, 0xB565, 0xD0BB, + 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, 0xB569, 0xD0BF, 0xB56A, + 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, + 0xB56F, 0xD0CA, 0xB570, 0xD0CB, 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, + 0xD0CE, 0xB574, 0xD0CF, 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, + 0xB578, 0xD0D8, 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, + 0xD0DE, 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, + 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, 0xB58B, + 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, 0xB58F, 0xD0F2, + 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, 0xB593, 0xD0F6, 0xB594, + 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, 0xB597, 0xD0FB, 0xB598, 0xD0FC, + 0xB599, 0xD0FD, 0xB59A, 0xD0FE, 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, + 0xD101, 0xB59E, 0xD102, 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, + 0xB5A2, 0xB369, 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, + 0xB371, 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, 0xB5AF, + 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, 0xB5B3, 0xB3A8, + 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, 0xB5B7, 0xB3C8, 0xB5B8, + 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, + 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, + 0xB3DD, 0xB5C2, 0xB3E0, 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, + 0xB5C6, 0xB410, 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, + 0xB428, 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, + 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, 0xB5D3, + 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, 0xB5D7, 0xB480, + 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, 0xB5DB, 0xB4A8, 0xB5DC, + 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, + 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, + 0xB4DC, 0xB5E6, 0xB4DD, 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, + 0xB5EA, 0xB4E6, 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, + 0xB4F1, 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, 0xB5F7, + 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, 0xB5FB, 0xB530, + 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, 0xB641, 0xD105, 0xB642, + 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, 0xB645, 0xD109, 0xB646, 0xD10A, + 0xB647, 0xD10B, 0xB648, 0xD10C, 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, + 0xD110, 0xB64C, 0xD111, 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, + 0xB650, 0xD115, 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, + 0xD119, 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, + 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, 0xB663, + 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, 0xB667, 0xD126, + 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, 0xB66B, 0xD12A, 0xB66C, + 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, 0xB66F, 0xD12E, 0xB670, 0xD12F, + 0xB671, 0xD132, 0xB672, 0xD133, 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, + 0xD137, 0xB676, 0xD139, 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, + 0xB67A, 0xD13E, 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, + 0xD147, 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, 0xB68D, + 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, 0xB691, 0xD158, + 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, 0xB695, 0xD15E, 0xB696, + 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, 0xB699, 0xD164, 0xB69A, 0xD165, + 0xB69B, 0xD166, 0xB69C, 0xD167, 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, + 0xD16B, 0xB6A0, 0xD16D, 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, + 0xB6A4, 0xB544, 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, + 0xB54D, 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, + 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, 0xB6B1, + 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, 0xB6B5, 0xB5AB, + 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, 0xB6B9, 0xB5B4, 0xB6BA, + 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, + 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, + 0xB5D0, 0xB6C4, 0xB5D1, 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, + 0xB6C8, 0xB611, 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, + 0xB62C, 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, 0xB6D5, + 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, 0xB6D9, 0xB6F0, + 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, 0xB6DD, 0xB701, 0xB6DE, + 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, + 0xB6E3, 0xB730, 0xB6E4, 0xB738, 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, + 0xB744, 0xB6E8, 0xB748, 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, + 0xB6EC, 0xB760, 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, + 0xB771, 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, + 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, 0xB6F9, + 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, 0xB6FD, 0xB796, + 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, 0xB743, 0xD170, 0xB744, + 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, 0xB747, 0xD174, 0xB748, 0xD175, + 0xB749, 0xD176, 0xB74A, 0xD177, 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, + 0xD17A, 0xB74E, 0xD17B, 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, + 0xB752, 0xD180, 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, + 0xD185, 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, 0xB765, + 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, 0xB769, 0xD193, + 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, 0xB76D, 0xD197, 0xB76E, + 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, 0xB771, 0xD19B, 0xB772, 0xD19C, + 0xB773, 0xD19D, 0xB774, 0xD19E, 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, + 0xD1A3, 0xB778, 0xD1A5, 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, + 0xB782, 0xD1AA, 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, + 0xD1AE, 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, + 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, 0xB78F, + 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, 0xB793, 0xD1C2, + 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, 0xB797, 0xD1C6, 0xB798, + 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, + 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, + 0xB798, 0xB7A2, 0xB799, 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, + 0xB7A6, 0xB7A9, 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, + 0xB7B4, 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, 0xB7B3, + 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, 0xB7B7, 0xB801, + 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, 0xB7BB, 0xB80C, 0xB7BC, + 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, + 0xB7C1, 0xB824, 0xB7C2, 0xB825, 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, + 0xB834, 0xB7C6, 0xB835, 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, + 0xB7CA, 0xB840, 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, + 0xB85C, 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, + 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, 0xB7D7, + 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, 0xB7DB, 0xB8B4, + 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, 0xB7DF, 0xB8C3, 0xB7E0, + 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, + 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, + 0xB8EC, 0xB7EA, 0xB8F0, 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, + 0xB7EE, 0xB8FD, 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, + 0xB93C, 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, 0xB7FB, + 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, 0xB841, 0xD1D0, + 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, 0xB845, 0xD1D4, 0xB846, + 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, 0xB849, 0xD1D9, 0xB84A, 0xD1DA, + 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, + 0xD1DF, 0xB850, 0xD1E0, 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, + 0xB854, 0xD1E4, 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, + 0xD1E8, 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, + 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, 0xB867, + 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, 0xB86B, 0xD1F6, + 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, 0xB86F, 0xD1FB, 0xB870, + 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, 0xB873, 0xD1FF, 0xB874, 0xD200, + 0xB875, 0xD201, 0xB876, 0xD202, 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, + 0xD205, 0xB87A, 0xD206, 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, + 0xB884, 0xD20C, 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, + 0xD211, 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, 0xB891, + 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, 0xB895, 0xD21E, + 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, 0xB899, 0xD222, 0xB89A, + 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, 0xB89D, 0xD226, 0xB89E, 0xD227, + 0xB89F, 0xD228, 0xB8A0, 0xD229, 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, + 0xB974, 0xB8A4, 0xB975, 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, + 0xB8A8, 0xB985, 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, + 0xB98D, 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, + 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, 0xB8B5, + 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, 0xB8B9, 0xB9CE, + 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, 0xB8BD, 0xB9D2, 0xB8BE, + 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, + 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, + 0xB9E8, 0xB8C8, 0xB9EC, 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, + 0xB8CC, 0xB9F8, 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, + 0xBA01, 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, 0xB8D9, + 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, 0xB8DD, 0xBA53, + 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, 0xB8E1, 0xBA5C, 0xB8E2, + 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, + 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, + 0xBA83, 0xB8EC, 0xBA84, 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, + 0xB8F0, 0xBAA8, 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, + 0xBAB0, 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, + 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, 0xB8FD, + 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, 0xB943, 0xD22E, + 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, 0xB947, 0xD233, 0xB948, + 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, 0xB94B, 0xD238, 0xB94C, 0xD239, + 0xB94D, 0xD23A, 0xB94E, 0xD23B, 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, + 0xD242, 0xB952, 0xD243, 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, + 0xB956, 0xD247, 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, + 0xD24C, 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, 0xB969, + 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, 0xB96D, 0xD259, + 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, 0xB971, 0xD25E, 0xB972, + 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, 0xB975, 0xD262, 0xB976, 0xD263, + 0xB977, 0xD265, 0xB978, 0xD266, 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, + 0xD269, 0xB982, 0xD26A, 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, + 0xB986, 0xD26E, 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, + 0xD272, 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, + 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, 0xB993, + 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, 0xB997, 0xD27F, + 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, 0xB99B, 0xD286, 0xB99C, + 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, 0xB99F, 0xD28B, 0xB9A0, 0xD28C, + 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, + 0xBB11, 0xB9A6, 0xBB18, 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, + 0xB9AA, 0xBB2B, 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, + 0xBB38, 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, 0xB9B7, + 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, 0xB9BB, 0xBB58, + 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, 0xB9BF, 0xBB88, 0xB9C0, + 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, + 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, + 0xBBC8, 0xB9CA, 0xBBD0, 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, + 0xB9CE, 0xBBFC, 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, + 0xBC08, 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, + 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, 0xB9DB, + 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, 0xB9DF, 0xBC1C, + 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, 0xB9E3, 0xBC24, 0xB9E4, + 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, + 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, + 0xBC41, 0xB9EE, 0xBC43, 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, + 0xB9F2, 0xBC4C, 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, + 0xBC84, 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, 0xBA41, + 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, 0xBA45, 0xD293, + 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, 0xBA49, 0xD298, 0xBA4A, + 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, + 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, + 0xD2A5, 0xBA54, 0xD2A6, 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, + 0xBA58, 0xD2AA, 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, + 0xD2AF, 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, + 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, 0xBA6B, + 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, 0xBA6F, 0xD2C3, + 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, 0xBA73, 0xD2C7, 0xBA74, + 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, + 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, + 0xD2D5, 0xBA84, 0xD2D6, 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, + 0xBA88, 0xD2DB, 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, + 0xD2E0, 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, 0xBA95, + 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, 0xBA99, 0xD2EF, + 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, 0xBA9D, 0xD2F6, 0xBA9E, + 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, + 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, + 0xBCA8, 0xBAA8, 0xBCB0, 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, + 0xBAAC, 0xBCB5, 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, + 0xBCC4, 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, + 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, 0xBAB9, + 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, 0xBABD, 0xBD04, + 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, 0xBAC1, 0xBD10, 0xBAC2, + 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, + 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, + 0xBD59, 0xBACC, 0xBD64, 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, + 0xBAD0, 0xBD84, 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, + 0xBD8A, 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, 0xBADD, + 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, 0xBAE1, 0xBDD8, + 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, 0xBAE5, 0xBDF4, 0xBAE6, + 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, + 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, + 0xBE1D, 0xBAF0, 0xBE1F, 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, + 0xBAF4, 0xBE4C, 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, + 0xBE57, 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, + 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, 0xBB43, + 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, 0xBB47, 0xD304, + 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, 0xBB4B, 0xD309, 0xBB4C, + 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, 0xBB4F, 0xD311, 0xBB50, 0xD312, + 0xBB51, 0xD313, 0xBB52, 0xD315, 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, + 0xD319, 0xBB56, 0xD31A, 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, + 0xBB5A, 0xD323, 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, + 0xD32A, 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, 0xBB6D, + 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, 0xBB71, 0xD33E, + 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, 0xBB75, 0xD342, 0xBB76, + 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, 0xBB79, 0xD348, 0xBB7A, 0xD349, + 0xBB81, 0xD34A, 0xBB82, 0xD34B, 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, + 0xD34E, 0xBB86, 0xD34F, 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, + 0xBB8A, 0xD353, 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, + 0xD357, 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, + 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, 0xBB97, + 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, 0xBB9B, 0xD364, + 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, 0xBB9F, 0xD368, 0xBBA0, + 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, + 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, + 0xBE7C, 0xBBAA, 0xBE7D, 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, + 0xBBAE, 0xBE8D, 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, + 0xBE98, 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, 0xBBBB, + 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, 0xBBBF, 0xBF01, + 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, 0xBBC3, 0xBF19, 0xBBC4, + 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, + 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, + 0xBF55, 0xBBCE, 0xBF94, 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, + 0xBBD2, 0xBFCD, 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, + 0xBFDF, 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, + 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, 0xBBDF, + 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, 0xBBE3, 0xC0A0, + 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, 0xBBE7, 0xC0AC, 0xBBE8, + 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, + 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, + 0xC0BF, 0xBBF2, 0xC0C0, 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, + 0xBBF6, 0xC0C9, 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, + 0xC0D9, 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, 0xBC45, + 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, 0xBC49, 0xD372, + 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, 0xBC4D, 0xD376, 0xBC4E, + 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, 0xBC51, 0xD37A, 0xBC52, 0xD37B, + 0xBC53, 0xD37E, 0xBC54, 0xD37F, 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, + 0xD383, 0xBC58, 0xD385, 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, + 0xBC62, 0xD389, 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, + 0xD392, 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, + 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, 0xBC6F, + 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, 0xBC73, 0xD3A3, + 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, 0xBC77, 0xD3A7, 0xBC78, + 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, + 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, + 0xD3B6, 0xBC88, 0xD3B7, 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, + 0xBC8C, 0xD3BD, 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, + 0xD3C1, 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, 0xBC99, + 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, 0xBC9D, 0xD3D3, + 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, 0xBCA1, 0xC0E5, 0xBCA2, + 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, + 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, + 0xC110, 0xBCAC, 0xC115, 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, + 0xBCB0, 0xC11F, 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, + 0xC126, 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, + 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, 0xBCBD, + 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, 0xBCC1, 0xC149, + 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, 0xBCC5, 0xC154, 0xBCC6, + 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, 0xBCC9, 0xC164, 0xBCCA, 0xC165, + 0xBCCB, 0xC167, 0xBCCC, 0xC168, 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, + 0xC174, 0xBCD0, 0xC178, 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, + 0xBCD4, 0xC18E, 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, + 0xC19C, 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, 0xBCE1, + 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, 0xBCE5, 0xC1D4, + 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, 0xBCE9, 0xC1E4, 0xBCEA, + 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, + 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, + 0xC20D, 0xBCF4, 0xC20F, 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, + 0xBCF8, 0xC21C, 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, + 0xC229, 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, + 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, 0xBD47, + 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, 0xBD4B, 0xD3E4, + 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, 0xBD4F, 0xD3E8, 0xBD50, + 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, + 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, + 0xD3F6, 0xBD5A, 0xD3F7, 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, + 0xBD64, 0xD3FB, 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, + 0xD403, 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, 0xBD71, + 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, 0xBD75, 0xD411, + 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, 0xBD79, 0xD415, 0xBD7A, + 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, 0xBD83, 0xD419, 0xBD84, 0xD41A, + 0xBD85, 0xD41B, 0xBD86, 0xD41C, 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, + 0xD420, 0xBD8A, 0xD421, 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, + 0xBD8E, 0xD425, 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, + 0xD429, 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, + 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, 0xBD9B, + 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, 0xBD9F, 0xD436, + 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, 0xBDA3, 0xC232, 0xBDA4, + 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, 0xBDA7, 0xC251, 0xBDA8, 0xC254, + 0xBDA9, 0xC258, 0xBDAA, 0xC260, 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, + 0xC26D, 0xBDAE, 0xC270, 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, + 0xBDB2, 0xC27F, 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, + 0xC290, 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, 0xBDBF, + 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, 0xBDC3, 0xC2DC, + 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, 0xBDC7, 0xC2E4, 0xBDC8, + 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, + 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, + 0xC2FC, 0xBDD2, 0xC300, 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, + 0xBDD6, 0xC30D, 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, + 0xC318, 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, + 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, 0xBDE3, + 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, 0xBDE7, 0xC379, + 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, 0xBDEB, 0xC388, 0xBDEC, + 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, + 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, + 0xC3E9, 0xBDF6, 0xC3ED, 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, + 0xBDFA, 0xC408, 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, + 0xC430, 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, 0xBE49, + 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, 0xBE4D, 0xD446, + 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, 0xBE51, 0xD44A, 0xBE52, + 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, 0xBE55, 0xD44E, 0xBE56, 0xD44F, + 0xBE57, 0xD450, 0xBE58, 0xD451, 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, + 0xD454, 0xBE62, 0xD455, 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, + 0xBE66, 0xD459, 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, + 0xD45E, 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, + 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, 0xBE73, + 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, 0xBE77, 0xD46E, + 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, 0xBE81, 0xD473, 0xBE82, + 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, 0xBE85, 0xD477, 0xBE86, 0xD47A, + 0xBE87, 0xD47B, 0xBE88, 0xD47D, 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, + 0xD483, 0xBE8C, 0xD484, 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, + 0xBE90, 0xD48A, 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, + 0xD490, 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, 0xBE9D, + 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, 0xBEA1, 0xC434, + 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, 0xBEA5, 0xC464, 0xBEA6, + 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, 0xBEA9, 0xC474, 0xBEAA, 0xC475, + 0xBEAB, 0xC479, 0xBEAC, 0xC480, 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, + 0xC4B8, 0xBEB0, 0xC4BC, 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, + 0xBEB4, 0xC4F4, 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, + 0xC500, 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, + 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, 0xBEC1, + 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, 0xBEC5, 0xC53D, + 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, 0xBEC9, 0xC549, 0xBECA, + 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, 0xBECD, 0xC54E, 0xBECE, 0xC553, + 0xBECF, 0xC554, 0xBED0, 0xC555, 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, + 0xC559, 0xBED4, 0xC55D, 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, + 0xBED8, 0xC564, 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, + 0xC573, 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, 0xBEE5, + 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, 0xBEE9, 0xC597, + 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, 0xBEED, 0xC5A9, 0xBEEE, + 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, + 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, + 0xC5C5, 0xBEF8, 0xC5C6, 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, + 0xBEFC, 0xC5CA, 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, + 0xD49F, 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, + 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, 0xBF4B, + 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, 0xBF4F, 0xD4AD, + 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, 0xBF53, 0xD4B1, 0xBF54, + 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, + 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, + 0xD4BB, 0xBF64, 0xD4BC, 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, + 0xBF68, 0xD4C0, 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, + 0xD4C4, 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, 0xBF75, + 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, 0xBF79, 0xD4D3, + 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, 0xBF83, 0xD4D8, 0xBF84, + 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, + 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, + 0xD4E4, 0xBF8E, 0xD4E5, 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, + 0xBF92, 0xD4EA, 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, + 0xD4EF, 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, + 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, 0xBF9F, + 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, 0xBFA3, 0xC5D4, + 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, 0xBFA7, 0xC5E3, 0xBFA8, + 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, + 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, + 0xC5FD, 0xBFB2, 0xC5FE, 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, + 0xBFB6, 0xC605, 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, + 0xC60C, 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, 0xBFC3, + 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, 0xBFC7, 0xC633, + 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, 0xBFCB, 0xC639, 0xBFCC, + 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, 0xBFCF, 0xC644, 0xBFD0, 0xC648, + 0xBFD1, 0xC650, 0xBFD2, 0xC651, 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, + 0xC655, 0xBFD6, 0xC65C, 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, + 0xBFDA, 0xC66F, 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, + 0xC67C, 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, + 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, 0xBFE7, + 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, 0xBFEB, 0xC6A9, + 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, 0xBFEF, 0xC6B8, 0xBFF0, + 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, + 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, + 0xC6D4, 0xBFFA, 0xC6DC, 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, + 0xBFFE, 0xC6E8, 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, + 0xD501, 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, 0xC04D, + 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, 0xC051, 0xD511, + 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, 0xC055, 0xD518, 0xC056, + 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, 0xC059, 0xD51C, 0xC05A, 0xD51D, + 0xC061, 0xD51E, 0xC062, 0xD51F, 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, + 0xD522, 0xC066, 0xD523, 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, + 0xC06A, 0xD527, 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, + 0xD52B, 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, + 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, 0xC077, + 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, 0xC081, 0xD538, + 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, 0xC085, 0xD53E, 0xC086, + 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, 0xC089, 0xD543, 0xC08A, 0xD545, + 0xC08B, 0xD546, 0xC08C, 0xD547, 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, + 0xD54A, 0xC090, 0xD54B, 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, + 0xC094, 0xD553, 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, + 0xD557, 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, 0xC0A1, + 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, 0xC0A5, 0xC6F9, + 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, 0xC0A9, 0xC708, 0xC0AA, + 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, 0xC0AD, 0xC717, 0xC0AE, 0xC719, + 0xC0AF, 0xC720, 0xC0B0, 0xC721, 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, + 0xC730, 0xC0B4, 0xC731, 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, + 0xC0B8, 0xC73C, 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, + 0xC74A, 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, + 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, 0xC0C5, + 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, 0xC0C9, 0xC760, + 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, 0xC0CD, 0xC775, 0xC0CE, + 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, 0xC0D1, 0xC77E, 0xC0D2, 0xC783, + 0xC0D3, 0xC784, 0xC0D4, 0xC785, 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, + 0xC789, 0xC0D8, 0xC78A, 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, + 0xC0DC, 0xC794, 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, + 0xC79A, 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, 0xC0E9, + 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, 0xC0ED, 0xC7BF, + 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, 0xC0F1, 0xC7C9, 0xC0F2, + 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, + 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, + 0xC801, 0xC0FC, 0xC804, 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, + 0xC142, 0xD566, 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, + 0xD56E, 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, + 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, 0xC14F, + 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, 0xC153, 0xD57F, + 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, 0xC157, 0xD583, 0xC158, + 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, 0xC161, 0xD58C, 0xC162, 0xD58D, + 0xC163, 0xD58E, 0xC164, 0xD58F, 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, + 0xD593, 0xC168, 0xD594, 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, + 0xC16C, 0xD598, 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, + 0xD59C, 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, 0xC179, + 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, 0xC183, 0xD5AA, + 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, 0xC187, 0xD5AE, 0xC188, + 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, + 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, + 0xD5B8, 0xC192, 0xD5B9, 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, + 0xC196, 0xD5BD, 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, + 0xD5C1, 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, + 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, 0xC1A3, + 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, 0xC1A7, 0xC81D, + 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, 0xC1AB, 0xC82D, 0xC1AC, + 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, 0xC1AF, 0xC83C, 0xC1B0, 0xC840, + 0xC1B1, 0xC848, 0xC1B2, 0xC849, 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, + 0xC854, 0xC1B6, 0xC870, 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, + 0xC1BA, 0xC87A, 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, + 0xC885, 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, 0xC1C7, + 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, 0xC1CB, 0xC8C4, + 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, 0xC1CF, 0xC8D5, 0xC1D0, + 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, + 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, + 0xC904, 0xC1DA, 0xC905, 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, + 0xC1DE, 0xC90F, 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, + 0xC934, 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, + 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, 0xC1EB, + 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, 0xC1EF, 0xC989, + 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, 0xC1F3, 0xC999, 0xC1F4, + 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, + 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, + 0xC9D1, 0xC1FE, 0xC9D3, 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, + 0xC244, 0xD5CE, 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, + 0xD5D4, 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, 0xC251, + 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, 0xC255, 0xD5E7, + 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, 0xC259, 0xD5ED, 0xC25A, + 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, 0xC263, 0xD5F1, 0xC264, 0xD5F2, + 0xC265, 0xD5F3, 0xC266, 0xD5F6, 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, + 0xD5FB, 0xC26A, 0xD5FC, 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, + 0xC26E, 0xD602, 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, + 0xD607, 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, + 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, 0xC281, + 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, 0xC285, 0xD61A, + 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, 0xC289, 0xD61F, 0xC28A, + 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, 0xC28D, 0xD625, 0xC28E, 0xD626, + 0xC28F, 0xD627, 0xC290, 0xD628, 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, + 0xD62B, 0xC294, 0xD62C, 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, + 0xC298, 0xD631, 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, + 0xD635, 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, 0xC2A5, + 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, 0xC2A9, 0xC9E4, + 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, 0xC2AD, 0xC9EF, 0xC2AE, + 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, + 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, + 0xCA0C, 0xC2B8, 0xCA0D, 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, + 0xC2BC, 0xCA4C, 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, + 0xCA5C, 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, + 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, 0xC2C9, + 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, 0xC2CD, 0xCACC, + 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, 0xC2D1, 0xCAD3, 0xC2D2, + 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, + 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, + 0xCB20, 0xC2DC, 0xCB21, 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, + 0xC2E0, 0xCB4C, 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, + 0xCB5D, 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, 0xC2ED, + 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, 0xC2F1, 0xCC14, + 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, 0xC2F5, 0xCC22, 0xC2F6, + 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, + 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, + 0xD63D, 0xC342, 0xD63E, 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, + 0xC346, 0xD643, 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, + 0xD64A, 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, + 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, 0xC353, + 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, 0xC357, 0xD65E, + 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, 0xC361, 0xD662, 0xC362, + 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, 0xC365, 0xD666, 0xC366, 0xD668, + 0xC367, 0xD66A, 0xC368, 0xD66B, 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, + 0xD66E, 0xC36C, 0xD66F, 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, + 0xC370, 0xD676, 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, + 0xD67A, 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, 0xC383, + 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, 0xC387, 0xD689, + 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, 0xC38B, 0xD68F, 0xC38C, + 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, 0xC38F, 0xD695, 0xC390, 0xD696, + 0xC391, 0xD697, 0xC392, 0xD698, 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, + 0xD69B, 0xC396, 0xD69C, 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, + 0xC39A, 0xD6A3, 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, + 0xD6A7, 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, + 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, 0xC3A7, + 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, 0xC3AB, 0xCC58, + 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, 0xC3AF, 0xCC66, 0xC3B0, + 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, + 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, + 0xCCAB, 0xC3BA, 0xCCAC, 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, + 0xC3BE, 0xCCB8, 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, + 0xCCC7, 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, 0xC3CB, + 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, 0xC3CF, 0xCD19, + 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, 0xC3D3, 0xCD28, 0xC3D4, + 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, + 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, + 0xCD78, 0xC3DE, 0xCD88, 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, + 0xC3E2, 0xCD9C, 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, + 0xCDA9, 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, + 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, 0xC3EF, + 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, 0xC3F3, 0xCE08, + 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, 0xC3F7, 0xCE20, 0xC3F8, + 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, + 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, + 0xD6AE, 0xC444, 0xD6AF, 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, + 0xC448, 0xD6B4, 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, + 0xD6B8, 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, 0xC455, + 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, 0xC459, 0xD6CA, + 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, 0xC463, 0xD6CF, 0xC464, + 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, 0xC467, 0xD6D5, 0xC468, 0xD6D6, + 0xC469, 0xD6D8, 0xC46A, 0xD6DA, 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, + 0xD6DD, 0xC46E, 0xD6DE, 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, + 0xC472, 0xD6E3, 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, + 0xD6E9, 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, + 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, 0xC485, + 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, 0xC489, 0xD6F8, + 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, 0xC48D, 0xD6FE, 0xC48E, + 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, 0xC491, 0xD703, 0xC492, 0xD705, + 0xC493, 0xD706, 0xC494, 0xD707, 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, + 0xD70A, 0xC498, 0xD70B, 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, + 0xC49C, 0xD70F, 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, + 0xD714, 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, 0xC4A9, + 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, 0xC4AD, 0xCE78, + 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, 0xC4B1, 0xCE87, 0xC4B2, + 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, + 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, + 0xCEA5, 0xC4BC, 0xCEAC, 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, + 0xC4C0, 0xCEE5, 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, + 0xCEF4, 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, + 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, 0xC4CD, + 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, 0xC4D1, 0xCF1C, + 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, 0xC4D5, 0xCF2D, 0xC4D6, + 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, + 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, + 0xCF65, 0xC4E0, 0xCF67, 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, + 0xC4E4, 0xCF74, 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, + 0xCF8C, 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, 0xC4F1, + 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, 0xC4F5, 0xCFFC, + 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, 0xC4F9, 0xD018, 0xC4FA, + 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, 0xC4FD, 0xD038, 0xC4FE, 0xD03C, + 0xC541, 0xD715, 0xC542, 0xD716, 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, + 0xD71B, 0xC546, 0xD71D, 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, + 0xC54A, 0xD722, 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, + 0xD726, 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, + 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, 0xC557, + 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, 0xC561, 0xD73A, + 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, 0xC565, 0xD73F, 0xC566, + 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, 0xC569, 0xD743, 0xC56A, 0xD745, + 0xC56B, 0xD746, 0xC56C, 0xD748, 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, + 0xD74C, 0xC570, 0xD74D, 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, + 0xC574, 0xD753, 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, + 0xD75C, 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, 0xC587, + 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, 0xC58B, 0xD76F, + 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, 0xC58F, 0xD775, 0xC590, + 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, 0xC593, 0xD779, 0xC594, 0xD77A, + 0xC595, 0xD77B, 0xC596, 0xD77E, 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, + 0xD782, 0xC59A, 0xD783, 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, + 0xC59E, 0xD787, 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, + 0xD045, 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, + 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, 0xC5AB, + 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, 0xC5AF, 0xD081, + 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, 0xC5B3, 0xD0AC, 0xC5B4, + 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, + 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, + 0xD0D0, 0xC5BE, 0xD0D1, 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, + 0xC5C2, 0xD0DC, 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, + 0xD0EC, 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, 0xC5CF, + 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, 0xC5D3, 0xD141, + 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, 0xC5D7, 0xD14C, 0xC5D8, + 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, + 0xC5DD, 0xD15F, 0xC5DE, 0xD161, 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, + 0xD17C, 0xC5E2, 0xD184, 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, + 0xC5E6, 0xD1A4, 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, + 0xD1B3, 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, + 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, 0xC5F3, + 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, 0xC5F7, 0xD230, + 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, 0xC5FB, 0xD23F, 0xC5FC, + 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, 0xC641, 0xD78D, 0xC642, 0xD78E, + 0xC643, 0xD78F, 0xC644, 0xD791, 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, + 0xD794, 0xC648, 0xD795, 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, + 0xC64C, 0xD79C, 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, + 0xD7A1, 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, 0xC6A7, + 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, 0xC6AB, 0xD2A4, + 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, 0xC6AF, 0xD2B9, 0xC6B0, + 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, + 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, + 0xD2DC, 0xC6BA, 0xD2E4, 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, + 0xC6BE, 0xD2F4, 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, + 0xD303, 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, + 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, 0xC6CB, + 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, 0xC6CF, 0xD325, + 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, 0xC6D3, 0xD330, 0xC6D4, + 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, + 0xC6D9, 0xD344, 0xC6DA, 0xD345, 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, + 0xD380, 0xC6DE, 0xD384, 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, + 0xC6E2, 0xD390, 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, + 0xD39C, 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, 0xC6EF, + 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, 0xC6F3, 0xD3D0, + 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, 0xC6F7, 0xD3EC, 0xC6F8, + 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, + 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, + 0xD440, 0xC7A4, 0xD444, 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, + 0xC7A8, 0xD46D, 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, + 0xD47C, 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, + 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, 0xC7B5, + 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, 0xC7B9, 0xD4DC, + 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, 0xC7BD, 0xD4F0, 0xC7BE, + 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, 0xC7C1, 0xD504, 0xC7C2, 0xD508, + 0xC7C3, 0xD50C, 0xC7C4, 0xD514, 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, + 0xD53C, 0xC7C8, 0xD53D, 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, + 0xC7CC, 0xD54D, 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, + 0xD559, 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, 0xC7D9, + 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, 0xC7DD, 0xD585, + 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, 0xC7E1, 0xD590, 0xC7E2, + 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, + 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, + 0xD5DD, 0xC7EC, 0xD5E4, 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, + 0xC7F0, 0xD5F4, 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, + 0xD600, 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, + 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, 0xC7FD, + 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, 0xC8A3, 0xD638, + 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, 0xC8A7, 0xD645, 0xC8A8, + 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, 0xC8AB, 0xD64D, 0xC8AC, 0xD651, + 0xC8AD, 0xD654, 0xC8AE, 0xD655, 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, + 0xD667, 0xC8B2, 0xD669, 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, + 0xC8B6, 0xD683, 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, + 0xD690, 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, 0xC8C3, + 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, 0xC8C7, 0xD6CC, + 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, 0xC8CB, 0xD6D9, 0xC8CC, + 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, + 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, + 0xD711, 0xC8D6, 0xD718, 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, + 0xC8DA, 0xD728, 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, + 0xD734, 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, + 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, 0xC8E7, + 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, 0xC8EB, 0xD759, + 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, 0xC8EF, 0xD765, 0xC8F0, + 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, 0xC8F3, 0xD774, 0xC8F4, 0xD77C, + 0xC8F5, 0xD77D, 0xC8F6, 0xD781, 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, + 0xD78C, 0xC8FA, 0xD790, 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, + 0xC8FE, 0xD79D, 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, + 0x50F9, 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, 0xCAAD, + 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, 0xCAB1, 0x73C2, + 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, 0xCAB5, 0x8304, 0xCAB6, + 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, + 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, + 0x5374, 0xCAC0, 0x5404, 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, + 0xCAC4, 0x73CF, 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, + 0x95A3, 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, + 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, 0xCAD1, + 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, 0xCAD5, 0x6F97, + 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, 0xCAD9, 0x7A08, 0xCADA, + 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, 0xCADD, 0x826E, 0xCADE, 0x8271, + 0xCADF, 0x8AEB, 0xCAE0, 0x9593, 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, + 0x66F7, 0xCAE4, 0x6E34, 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, + 0xCAE8, 0x8910, 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, + 0x574E, 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, 0xCAF5, + 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, 0xCAF9, 0x77B0, + 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, 0xCAFD, 0x9452, 0xCAFE, + 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, 0xCBA3, 0x7532, 0xCBA4, 0x80DB, + 0xCBA5, 0x9240, 0xCBA6, 0x9598, 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, + 0x59DC, 0xCBAA, 0x5CA1, 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, + 0xCBAE, 0x5F4A, 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, + 0x7586, 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, + 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, 0xCBBB, + 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, 0xCBBF, 0x4ECB, + 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, 0xCBC3, 0x584F, 0xCBC4, + 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, 0xCBC7, 0x6539, 0xCBC8, 0x69EA, + 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, + 0x7B87, 0xCBCE, 0x82A5, 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, + 0xCBD2, 0x958B, 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, + 0xF901, 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, 0xCBDF, + 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, 0xCBE3, 0x70AC, + 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, 0xCBE7, 0xF902, 0xCBE8, + 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, + 0xCBED, 0x5065, 0xCBEE, 0x5DFE, 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, + 0x6957, 0xCBF2, 0x8171, 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, + 0xCBF6, 0x9A2B, 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, + 0x6840, 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, + 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, 0xCCA5, + 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, 0xCCA9, 0x63ED, + 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, 0xCCAD, 0x6FC0, 0xCCAE, + 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, 0xCCB1, 0x5805, 0xCCB2, 0x727D, + 0xCCB3, 0x72AC, 0xCCB4, 0x7504, 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, + 0x80A9, 0xCCB8, 0x898B, 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, + 0xCCBC, 0x6289, 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, + 0x7F3A, 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, 0xCCC9, + 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, 0xCCCD, 0x52C1, + 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, 0xCCD1, 0x5883, 0xCCD2, + 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, + 0xCCD7, 0x656C, 0xCCD8, 0x666F, 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, + 0x6897, 0xCCDC, 0x6D87, 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, + 0xCCE0, 0x74A5, 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, + 0x78EC, 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, + 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, 0xCCED, + 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, 0xCCF1, 0x9803, + 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, 0xCCF5, 0x4FC2, 0xCCF6, + 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, + 0xCCFB, 0x60B8, 0xCCFC, 0x6212, 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, + 0x68E8, 0xCDA2, 0x6EAA, 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, + 0xCDA6, 0x7A3D, 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, + 0x8A08, 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, 0xCDB3, + 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, 0xCDB7, 0x5EAB, + 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, 0xCDBB, 0x6572, 0xCDBC, + 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, + 0xCDC1, 0x7690, 0xCDC2, 0x777E, 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, + 0x8003, 0xCDC6, 0x80A1, 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, + 0xCDCA, 0x83F0, 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, + 0x8AA5, 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, + 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, 0xCDD7, + 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, 0xCDDB, 0x8C37, + 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, 0xCDDF, 0x5D11, 0xCDE0, + 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, + 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, + 0x9AA8, 0xCDEA, 0x4F9B, 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, + 0xCDEE, 0x5B54, 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, + 0x62F1, 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, 0xCDFB, + 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, 0xCEA1, 0x79D1, + 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, 0xCEA5, 0x8DE8, 0xCEA6, + 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, + 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, + 0x5B98, 0xCEB0, 0x5BEC, 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, + 0xCEB4, 0x704C, 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, + 0x7F50, 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, + 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, 0xCEC1, + 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, 0xCEC5, 0x58D9, + 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, 0xCEC9, 0x709A, 0xCECA, + 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, 0xCECD, 0x80F1, 0xCECE, 0x945B, + 0xCECF, 0x5366, 0xCED0, 0x639B, 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, + 0x5080, 0xCED4, 0x584A, 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, + 0xCED8, 0x62D0, 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, + 0x7D18, 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, 0xCEE5, + 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, 0xCEE9, 0x6A4B, + 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, 0xCEED, 0x7D5E, 0xCEEE, + 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, + 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, + 0x9BAB, 0xCEF8, 0x4E18, 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, + 0xCEFC, 0x4FF1, 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, + 0x53E3, 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, + 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, 0xCFAB, + 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, 0xCFAF, 0x67E9, + 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, 0xCFB3, 0x6BEC, 0xCFB4, + 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, 0xCFB7, 0x72D7, 0xCFB8, 0x7396, + 0xCFB9, 0x7403, 0xCFBA, 0x77BF, 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, + 0x7D7F, 0xCFBE, 0x8009, 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, + 0xCFC2, 0x82DF, 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, + 0x8EC0, 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, 0xCFCF, + 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, 0xCFD3, 0x97A0, + 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, 0xCFD7, 0x7A98, 0xCFD8, + 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, 0xCFDB, 0x90E1, 0xCFDC, 0x5800, + 0xCFDD, 0x5C48, 0xCFDE, 0x6398, 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, + 0x5F13, 0xCFE2, 0x7A79, 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, + 0xCFE6, 0x5026, 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, + 0x5708, 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, + 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, 0xCFF3, + 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, 0xCFF7, 0x6F70, + 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, 0xCFFB, 0xF906, 0xCFFC, + 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, + 0xD0A3, 0x53EB, 0xD0A4, 0x572D, 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, + 0x69FB, 0xD0A8, 0x73EA, 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, + 0xD0AC, 0x7CFE, 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, + 0x9035, 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, 0xD0B9, + 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, 0xD0BD, 0x621F, + 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, 0xD0C1, 0x50C5, 0xD0C2, + 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, 0xD0C5, 0x65A4, 0xD0C6, 0x6839, + 0xD0C7, 0x69FF, 0xD0C8, 0x747E, 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, + 0x83EB, 0xD0CC, 0x89B2, 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, + 0xD0D0, 0xF909, 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, + 0x6611, 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, + 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, 0xD0DD, + 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, 0xD0E1, 0x6025, + 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, 0xD0E5, 0x7D66, 0xD0E6, + 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, + 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, + 0x5668, 0xD0F0, 0x573B, 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, + 0xD0F4, 0x5947, 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, + 0x5D0E, 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, 0xD1A3, + 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, 0xD1A7, 0x6B3A, + 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, 0xD1AB, 0x6DC7, 0xD1AC, + 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, 0xD1AF, 0x7482, 0xD1B0, 0x74A3, + 0xD1B1, 0x7578, 0xD1B2, 0x757F, 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, + 0x7941, 0xD1B6, 0x7947, 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, + 0xD1BA, 0x7D00, 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, + 0x802D, 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, + 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, 0xD1C7, + 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, 0xD1CB, 0x9E92, + 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, 0xD1CF, 0x62EE, 0xD1D0, + 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, 0xD1D3, 0x513A, 0xD1D4, 0xF90B, + 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, + 0x62CF, 0xD1DA, 0x62FF, 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, + 0xD1DE, 0xF911, 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, + 0xF914, 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, 0xD1EB, + 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, 0xD1EF, 0xF91E, + 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, 0xD1F3, 0x634F, 0xD1F4, + 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, 0xD1F7, 0x678F, 0xD1F8, 0x6960, + 0xD1F9, 0x6E73, 0xD1FA, 0xF922, 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, + 0xF924, 0xD1FE, 0xF925, 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, + 0xD2A4, 0x8872, 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, + 0xF929, 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, + 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, 0xD2B1, + 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, 0xD2B5, 0x649A, + 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, 0xD2B9, 0x62C8, 0xD2BA, + 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, + 0xD2BF, 0x5974, 0xD2C0, 0x5F29, 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, + 0xF931, 0xD2C4, 0xF932, 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, + 0xD2C8, 0xF935, 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, + 0x99D1, 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, 0xD2D5, + 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, 0xD2D9, 0xF944, + 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, 0xD2DD, 0x60F1, 0xD2DE, + 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, 0xD2E1, 0xF948, 0xD2E2, 0xF949, + 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, + 0xF94D, 0xD2E8, 0xF94E, 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, + 0xD2EC, 0x5AE9, 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, + 0xF952, 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, + 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, 0xD2F9, + 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, 0xD2FD, 0x591A, + 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, 0xD3A3, 0x4F46, 0xD3A4, + 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, + 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, + 0x77ED, 0xD3AE, 0x7AEF, 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, + 0xD3B2, 0x8892, 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, + 0x6FBE, 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, 0xD3BF, + 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, 0xD3C3, 0x75F0, + 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, 0xD3C7, 0x8983, 0xD3C8, + 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, 0xD3CB, 0x6C93, 0xD3CC, 0x7553, + 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, + 0x5802, 0xD3D2, 0x5858, 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, + 0xD3D6, 0x68E0, 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, + 0x9EE8, 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, + 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, 0xD3E3, + 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, 0xD3E7, 0x888B, + 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, 0xD3EB, 0x5B85, 0xD3EC, + 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, 0xD3EF, 0x5200, 0xD3F0, 0x5230, + 0xD3F1, 0x5716, 0xD3F2, 0x5835, 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, + 0x5C60, 0xD3F6, 0x5CF6, 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, + 0xD3FA, 0x60BC, 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, + 0x6843, 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, 0xD4A9, + 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, 0xD4AD, 0x89A9, + 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, 0xD4B1, 0x9003, 0xD4B2, + 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, 0xD4B5, 0x934D, 0xD4B6, 0x9676, + 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, + 0x72A2, 0xD4BC, 0x7368, 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, + 0xD4C0, 0x7E9B, 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, + 0x6566, 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, + 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, 0xD4CD, + 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, 0xD4D1, 0x52D5, + 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, 0xD4D5, 0x6850, 0xD4D6, + 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, + 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, + 0x515C, 0xD4E0, 0x6597, 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, + 0xD4E4, 0x7AC7, 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, + 0x9017, 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, 0xD4F1, + 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, 0xD4F5, 0x7B49, + 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, 0xD4F9, 0x9A30, 0xD4FA, + 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, 0xD4FD, 0x7669, 0xD4FE, 0x7F85, + 0xD5A1, 0x863F, 0xD5A2, 0x87BA, 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, + 0xF95C, 0xD5A6, 0x6D1B, 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, + 0xD5AA, 0x843D, 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, + 0xF95E, 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, + 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, 0xD5B7, + 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, 0xD5BB, 0x652C, + 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, 0xD5BF, 0x7E9C, 0xD5C0, + 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, + 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, + 0x72FC, 0xD5CA, 0x7405, 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, + 0xD5CE, 0x4F86, 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, + 0x51B7, 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, 0xD5DB, + 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, 0xD5DF, 0x8AD2, + 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, 0xD5E3, 0x5137, 0xD5E4, + 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, 0xD5E7, 0x616E, 0xD5E8, 0x623E, + 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, + 0x85DC, 0xD5EE, 0x8823, 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, + 0xD5F2, 0x9E97, 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, + 0x6B77, 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, + 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, 0xD6A1, + 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, 0xD6A5, 0x84EE, + 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, 0xD6A9, 0x51BD, 0xD6AA, + 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, + 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, + 0x7C3E, 0xD6B4, 0x7375, 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, + 0xD6B8, 0xF95F, 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, + 0x73B2, 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, 0xD6C5, + 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, 0xD6C9, 0x79AE, + 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, 0xD6CD, 0xF960, 0xD6CE, + 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, + 0xD6D3, 0x7210, 0xD6D4, 0x76E7, 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, + 0x865C, 0xD6D8, 0x8DEF, 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, + 0xD6DC, 0x9DFA, 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, + 0x7DA0, 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, + 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, 0xD6E9, + 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, 0xD6ED, 0x5121, + 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, 0xD6F1, 0x8CC2, 0xD6F2, + 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, + 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, + 0x7642, 0xD6FC, 0x77AD, 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, + 0xD7A2, 0x9B27, 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, + 0x5C62, 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, 0xD7AF, + 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, 0xD7B3, 0x67F3, + 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, 0xD7B7, 0x700F, 0xD7B8, + 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, 0xD7BB, 0x7624, 0xD7BC, 0x786B, + 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, + 0x9678, 0xD7C2, 0x4F96, 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, + 0xD7C6, 0x7DB8, 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, + 0x6817, 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, + 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, 0xD7D3, + 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, 0xD7D7, 0x5229, + 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, 0xD7DB, 0x5C65, 0xD7DC, + 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, + 0xD7E1, 0x72F8, 0xD7E2, 0x7406, 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, + 0x75E2, 0xD7E6, 0x7C6C, 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, + 0xD7EA, 0x88CF, 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, + 0x96E2, 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, 0xD7F7, + 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, 0xD7FB, 0x7433, + 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, 0xD8A1, 0x7ACB, 0xD8A2, + 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, 0xD8A5, 0x746A, 0xD8A6, 0x75F2, + 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, + 0x9EBB, 0xD8AC, 0x5BDE, 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, + 0xD8B0, 0x83AB, 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, + 0x5A29, 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, + 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, 0xD8BD, + 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, 0xD8C1, 0x883B, + 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, 0xD8C5, 0x551C, 0xD8C6, + 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, 0xD8C9, 0x8309, 0xD8CA, 0x896A, + 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, + 0x5FD9, 0xD8D0, 0x671B, 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, + 0xD8D4, 0x832B, 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, + 0x57CB, 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, 0xD8E1, + 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, 0xD8E5, 0x9B45, + 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, 0xD8E9, 0x9A40, 0xD8EA, + 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, 0xD8ED, 0x731B, 0xD8EE, 0x76F2, + 0xD8EF, 0x76DF, 0xD8F0, 0x840C, 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, + 0x514D, 0xD8F4, 0x5195, 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, + 0xD8F8, 0x7704, 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, + 0x9762, 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, + 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, 0xD9A7, + 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, 0xD9AB, 0x8317, + 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, 0xD9AF, 0x9298, 0xD9B0, + 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, 0xD9B3, 0x5192, 0xD9B4, 0x52DF, + 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, + 0x6479, 0xD9BA, 0x66AE, 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, + 0xD9BE, 0x6BDB, 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, + 0x7738, 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, 0xD9CB, + 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, 0xD9CF, 0x7A46, + 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, 0xD9D3, 0x5922, 0xD9D4, + 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, 0xD9D7, 0x5893, 0xD9D8, 0x5999, + 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, + 0x6E3A, 0xD9DE, 0x732B, 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, + 0xD9E2, 0x52D9, 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, + 0x620A, 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, + 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, 0xD9EF, + 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, 0xD9F3, 0x856A, + 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, 0xD9F7, 0x9D61, 0xD9F8, + 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, 0xD9FB, 0x520E, 0xD9FC, 0x543B, + 0xD9FD, 0x554F, 0xD9FE, 0x6587, 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, + 0x7D0B, 0xDAA4, 0x805E, 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, + 0xDAA8, 0x52FF, 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, + 0x5A9A, 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, 0xDAB5, + 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, 0xDAB9, 0x8587, + 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, 0xDABD, 0x9EF4, 0xDABE, + 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, 0xDAC1, 0x61AB, 0xDAC2, 0x654F, + 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, + 0x739F, 0xDAC8, 0x73C9, 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, + 0xDACC, 0x871C, 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, + 0x62CD, 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, + 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, 0xDAD9, + 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, 0xDADD, 0x8584, + 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, 0xDAE1, 0x4F34, 0xDAE2, + 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, 0xDAE5, 0x62CC, 0xDAE6, 0x642C, + 0xDAE7, 0x6500, 0xDAE8, 0x6591, 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, + 0x6F58, 0xDAEC, 0x73ED, 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, + 0xDAF0, 0x76FC, 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, + 0x7D46, 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, 0xDAFD, + 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, 0xDBA3, 0x91B1, + 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, 0xDBA7, 0x5023, 0xDBA8, + 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, + 0xDBAD, 0x5F77, 0xDBAE, 0x623F, 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, + 0x65C1, 0xDBB2, 0x6609, 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, + 0xDBB6, 0x78C5, 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, + 0x822B, 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, + 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, 0xDBC3, + 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, 0xDBC7, 0x5F98, + 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, 0xDBCB, 0x6E43, 0xDBCC, + 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, + 0xDBD1, 0x88F5, 0xDBD2, 0x8919, 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, + 0x914D, 0xDBD6, 0x966A, 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, + 0xDBDA, 0x67CF, 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, + 0x9B44, 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, 0xDBE7, + 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, 0xDBEB, 0x7F70, + 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, 0xDBEF, 0x68B5, 0xDBF0, + 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, + 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, + 0x5288, 0xDBFA, 0x58C1, 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, + 0xDBFE, 0x7656, 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, + 0x9739, 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, + 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, 0xDCAD, + 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, 0xDCB1, 0x5002, + 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, 0xDCB5, 0x661E, 0xDCB6, + 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, 0xDCB9, 0x70B3, 0xDCBA, 0x7501, + 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, + 0x9920, 0xDCC0, 0x9A08, 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, + 0xDCC4, 0x5BF6, 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, + 0x6E7A, 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, 0xDCD1, + 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, 0xDCD5, 0x5B93, + 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, 0xDCD9, 0x8179, 0xDCDA, + 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, 0xDCDD, 0x8986, 0xDCDE, 0x8F39, + 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, + 0x4E76, 0xDCE4, 0x4FF8, 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, + 0xDCE8, 0x5CF0, 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, + 0x71A2, 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, + 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, 0xDCF5, + 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, 0xDCF9, 0x526F, + 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, 0xDCFD, 0x592B, 0xDCFE, + 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, + 0xDDA5, 0xF966, 0xDDA6, 0x6276, 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, + 0x6D6E, 0xDDAA, 0x6EA5, 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, + 0xDDAE, 0x7F36, 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, + 0x8240, 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, 0xDDBB, + 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, 0xDDBF, 0x99D9, + 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, 0xDDC3, 0x5429, 0xDDC4, + 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, + 0xDDC9, 0x61A4, 0xDDCA, 0x626E, 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, + 0x711A, 0xDDCE, 0x76C6, 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, + 0xDDD2, 0x82AC, 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, + 0x4F5B, 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, + 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, 0xDDDF, + 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, 0xDDE3, 0x532A, + 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, 0xDDE7, 0x5E87, 0xDDE8, + 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, 0xDDEB, 0x6279, 0xDDEC, 0x6590, + 0xDDED, 0x6787, 0xDDEE, 0x69A7, 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, + 0x6BD7, 0xDDF2, 0x6BD8, 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, + 0xDDF6, 0x75FA, 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, + 0x79D8, 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, 0xDEA5, + 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, 0xDEA9, 0x9119, + 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, 0xDEAD, 0x56AC, 0xDEAE, + 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, + 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, + 0x73AD, 0xDEB8, 0x8CA7, 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, + 0xDEBC, 0x6C37, 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, + 0x4E8B, 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, + 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, 0xDEC9, + 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, 0xDECD, 0x58EB, + 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, 0xDED1, 0x5BFA, 0xDED2, + 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, 0xDED5, 0x5F99, 0xDED6, 0x601D, + 0xDED7, 0x6368, 0xDED8, 0x659C, 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, + 0x67FB, 0xDEDC, 0x68AD, 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, + 0xDEE0, 0x6E23, 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, + 0x793E, 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, 0xDEED, + 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, 0xDEF1, 0x8A50, + 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, 0xDEF5, 0x8D66, 0xDEF6, + 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, + 0xDEFB, 0x524A, 0xDEFC, 0xF969, 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, + 0x5098, 0xDFA2, 0x522A, 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, + 0xDFA6, 0x73CA, 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, + 0x849C, 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, + 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, 0xDFB3, + 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, 0xDFB7, 0x829F, + 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, 0xDFBB, 0x6F81, 0xDFBC, + 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, + 0xDFC1, 0x511F, 0xDFC2, 0x5546, 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, + 0x5B40, 0xDFC6, 0x5C19, 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, + 0xDFCA, 0x5EA0, 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, + 0x6A61, 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, 0xDFD7, + 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, 0xDFDB, 0x8CDE, + 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, 0xDFDF, 0x8CFD, 0xDFE0, + 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, 0xDFE3, 0x7D22, 0xDFE4, 0x8272, + 0xDFE5, 0x7272, 0xDFE6, 0x751F, 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, + 0x7B19, 0xDFEA, 0x5885, 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, + 0xDFEE, 0x5EB6, 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, + 0x637F, 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, + 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, 0xDFFB, + 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, 0xE0A1, 0x80E5, + 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, 0xE0A5, 0x8A93, 0xE0A6, + 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, 0xE0A9, 0x9F20, 0xE0AA, 0x5915, + 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, + 0x6673, 0xE0B0, 0x6790, 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, + 0xE0B4, 0x77F3, 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, + 0x932B, 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, 0xE0C1, + 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, 0xE0C5, 0x7444, + 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, 0xE0C9, 0x79AA, 0xE0CA, + 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, 0xE0CD, 0x817A, 0xE0CE, 0x81B3, + 0xE0CF, 0x8239, 0xE0D0, 0x861A, 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, + 0x8DE3, 0xE0D4, 0x9078, 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, + 0xE0D8, 0x9BAE, 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, + 0x6CC4, 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, + 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, 0xE0E5, + 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, 0xE0E9, 0x7E96, + 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, 0xE0ED, 0x965D, 0xE0EE, + 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, + 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, + 0x6210, 0xE0F8, 0x661F, 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, + 0xE0FC, 0x76DB, 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, + 0x8072, 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, 0xE1AB, + 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, 0xE1AF, 0x53EC, + 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, 0xE1B3, 0x5C0F, 0xE1B4, + 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, 0xE1B7, 0x6383, 0xE1B8, 0x6414, + 0xE1B9, 0x662D, 0xE1BA, 0x68B3, 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, + 0x6EAF, 0xE1BE, 0x701F, 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, + 0xE1C2, 0x758F, 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, + 0x7BE0, 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, + 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, 0xE1CF, + 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, 0xE1D3, 0x9A37, + 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, 0xE1D7, 0x6D91, 0xE1D8, + 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, 0xE1DB, 0x8D16, 0xE1DC, 0x901F, + 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, + 0x905C, 0xE1E2, 0x98E1, 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, + 0xE1E6, 0x677E, 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, + 0x9001, 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, 0xE1F3, + 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, 0xE1F7, 0x5782, + 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, 0xE1FB, 0x5CAB, 0xE1FC, + 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, 0xE2A1, 0x620D, 0xE2A2, 0x624B, + 0xE2A3, 0x6388, 0xE2A4, 0x641C, 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, + 0x6A39, 0xE2A8, 0x6B8A, 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, + 0xE2AC, 0x71E7, 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, + 0x74B2, 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, + 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, 0xE2B9, + 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, 0xE2BD, 0x8490, + 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, 0xE2C1, 0x8AB0, 0xE2C2, + 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, 0xE2C5, 0x9083, 0xE2C6, 0x916C, + 0xE2C7, 0x9296, 0xE2C8, 0x92B9, 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, + 0x96A8, 0xE2CC, 0x96D6, 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, + 0xE2D0, 0x9AD3, 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, + 0x5919, 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, 0xE2DD, + 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, 0xE2E1, 0x6042, + 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, 0xE2E5, 0x6A53, 0xE2E6, + 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, + 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, + 0x821C, 0xE2F0, 0x8340, 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, + 0xE2F4, 0x8AC4, 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, + 0x99B4, 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, + 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, 0xE3A3, + 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, 0xE3A7, 0x7FD2, + 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, 0xE3AB, 0x4E58, 0xE3AC, + 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, 0xE3AF, 0x627F, 0xE3B0, 0x6607, + 0xE3B1, 0x7E69, 0xE3B2, 0x8805, 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, + 0x5319, 0xE3B6, 0x5636, 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, + 0xE3BA, 0x5C4E, 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, + 0x6043, 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, 0xE3C7, + 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, 0xE3CB, 0x8A66, + 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, 0xE3CF, 0x8C7A, 0xE3D0, + 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, 0xE3D3, 0x606F, 0xE3D4, 0x62ED, + 0xE3D5, 0x690D, 0xE3D6, 0x6B96, 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, + 0x7BD2, 0xE3DA, 0x8755, 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, + 0xE3DE, 0x98FE, 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, + 0x547B, 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, + 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, 0xE3EB, + 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, 0xE3EF, 0x85AA, + 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, 0xE3F3, 0x8EAB, 0xE3F4, + 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, + 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, + 0x5FC3, 0xE3FE, 0x6C81, 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, + 0xE4A4, 0x751A, 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, + 0x5341, 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, 0xE4B1, + 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, 0xE4B5, 0x83AA, + 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, 0xE4B9, 0x963F, 0xE4BA, + 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, + 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, + 0x6115, 0xE4C4, 0x63E1, 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, + 0xE4C8, 0x9354, 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, + 0x5B89, 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, + 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, 0xE4D5, + 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, 0xE4D9, 0x95BC, + 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, 0xE4DD, 0x5EB5, 0xE4DE, + 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, + 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, + 0x592E, 0xE4E8, 0x600F, 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, + 0xE4EC, 0x9D26, 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, + 0x5D16, 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, 0xE4F9, + 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, 0xE4FD, 0x814B, + 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, 0xE5A3, 0x9DAF, 0xE5A4, + 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, 0xE5A7, 0x51B6, 0xE5A8, 0x591C, + 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, + 0x8036, 0xE5AE, 0xF974, 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, + 0xE5B2, 0xF976, 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, + 0x84BB, 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, + 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, 0xE5BF, + 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, 0xE5C3, 0x6698, + 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, 0xE5C7, 0x6D0B, 0xE5C8, + 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, 0xE5CB, 0x760D, 0xE5CC, 0x79B3, + 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, + 0x8944, 0xE5D2, 0xF97D, 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, + 0xE5D6, 0xF97E, 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, + 0x65BC, 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, 0xE5E3, + 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, 0xE5E7, 0x5043, + 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, 0xE5EB, 0x8A00, 0xE5EC, + 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, + 0xE5F1, 0x56B4, 0xE5F2, 0x5944, 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, + 0x5DAA, 0xE5F6, 0x696D, 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, + 0xE5FA, 0xF97F, 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, + 0xF982, 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, + 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, 0xE6A9, + 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, 0xE6AD, 0xF986, + 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, 0xE6B1, 0xF989, 0xE6B2, + 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, 0xE6B5, 0x5F79, 0xE6B6, 0x6613, + 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, + 0x8B6F, 0xE6BC, 0xF98D, 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, + 0xE6C0, 0x5827, 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, + 0xF98E, 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, 0xE6CD, + 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, 0xE6D1, 0x6F14, + 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, 0xE6D5, 0x7159, 0xE6D6, + 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, 0xE6D9, 0xF994, 0xE6DA, 0x784F, + 0xE6DB, 0x786F, 0xE6DC, 0xF995, 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, + 0xF996, 0xE6E0, 0x7E2F, 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, + 0xE6E4, 0xF998, 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, + 0xF99B, 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, + 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, 0xE6F1, + 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, 0xE6F5, 0xF9A2, + 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, 0xE6F9, 0xF9A5, 0xE6FA, + 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, 0xE6FD, 0x8276, 0xE6FE, 0x82D2, + 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, + 0x66C4, 0xE7A6, 0xF9A7, 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, + 0xE7AA, 0xF9A9, 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, + 0x5DB8, 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, 0xE7B7, + 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, 0xE7BB, 0x702F, + 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, 0xE7BF, 0xF9AD, 0xE7C0, + 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, + 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, + 0x8A60, 0xE7CA, 0x8FCE, 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, + 0xE7CE, 0x9719, 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, + 0x502A, 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, + 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, 0xE7DB, + 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, 0xE7DF, 0xF9B6, + 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, 0xE7E3, 0x8C6B, 0xE7E4, + 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, 0xE7E7, 0x9713, 0xE7E8, 0x9810, + 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, + 0x5348, 0xE7EE, 0x543E, 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, + 0xE7F2, 0x58BA, 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, + 0x609F, 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, 0xE8A1, + 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, 0xE8A5, 0x8708, + 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, 0xE8A9, 0x5C4B, 0xE8AA, + 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, + 0xE8AF, 0x7465, 0xE8B0, 0x761F, 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, + 0x860A, 0xE8B4, 0x5140, 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, + 0xE8B8, 0x7515, 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, + 0x96CD, 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, + 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, 0xE8C5, + 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, 0xE8C9, 0x68A1, + 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, 0xE8CD, 0x7413, 0xE8CE, + 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, + 0xE8D3, 0x8155, 0xE8D4, 0x839E, 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, + 0x9811, 0xE8D8, 0x66F0, 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, + 0xE8DC, 0x6C6A, 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, + 0x6B6A, 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, 0xE8E9, + 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, 0xE8ED, 0x5996, + 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, 0xE8F1, 0xF9BD, 0xE8F2, + 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, 0xE8F5, 0x6493, 0xE8F6, 0x64FE, + 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, + 0xF9C0, 0xE8FC, 0x71FF, 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, + 0xE9A2, 0x7AAF, 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, + 0x8170, 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, + 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, 0xE9AF, + 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, 0xE9B3, 0x8925, + 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, 0xE9B7, 0x5197, 0xE9B8, + 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, + 0xE9BD, 0x6142, 0xE9BE, 0x6995, 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, + 0x6EB6, 0xE9C2, 0x7194, 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, + 0xE9C6, 0x8073, 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, + 0x9394, 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, 0xE9D3, + 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, 0xE9D7, 0x611A, + 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, 0xE9DB, 0x7397, 0xE9DC, + 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, 0xE9DF, 0x7991, 0xE9E0, 0x79B9, + 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, + 0x865E, 0xE9E6, 0x8FC2, 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, + 0xE9EA, 0x9685, 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, + 0x5F67, 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, + 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, 0xE9F7, + 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, 0xE9FB, 0x7189, + 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, 0xEAA1, 0x904B, 0xEAA2, + 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, 0xEAA5, 0x851A, 0xEAA6, 0x9B31, + 0xEAA7, 0x4E90, 0xEAA8, 0x718A, 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, + 0x539F, 0xEAAC, 0x54E1, 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, + 0xEAB0, 0x5A9B, 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, + 0x613F, 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, 0xEABD, + 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, 0xEAC1, 0xF9C6, + 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, 0xEAC5, 0x6708, 0xEAC6, + 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, 0xEAC9, 0x5049, 0xEACA, 0x50DE, + 0xEACB, 0x5371, 0xEACC, 0x570D, 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, + 0x5C09, 0xEAD0, 0x6170, 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, + 0xEAD4, 0x744B, 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, + 0x8466, 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, + 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, 0xEAE1, + 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, 0xEAE5, 0xF9C7, + 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, 0xEAE9, 0x5BA5, 0xEAEA, + 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, 0xEAED, 0x60A0, 0xEAEE, 0x60DF, + 0xEAEF, 0x6108, 0xEAF0, 0x6109, 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, + 0x6709, 0xEAF4, 0xF9C8, 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, + 0xEAF8, 0x6961, 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, + 0xF9CA, 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, 0xEBA7, + 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, 0xEBAB, 0x7DAD, + 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, 0xEBAF, 0x8A98, 0xEBB0, + 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, 0xEBB3, 0x8E42, 0xEBB4, 0x904A, + 0xEBB5, 0x903E, 0xEBB6, 0x907A, 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, + 0x936E, 0xEBBA, 0xF9D0, 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, + 0xEBBE, 0x6BD3, 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, + 0xF9D4, 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, + 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, 0xEBCB, + 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, 0xEBCF, 0xF9D8, + 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, 0xEBD3, 0x807F, 0xEBD4, + 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, + 0xEBD9, 0x57A0, 0xEBDA, 0x6069, 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, + 0x8ABE, 0xEBDE, 0x9280, 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, + 0xEBE2, 0x6DEB, 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, + 0x98EE, 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, 0xEBEF, + 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, 0xEBF3, 0x61FF, + 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, 0xEBF7, 0x7591, 0xEBF8, + 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, 0xEBFB, 0x858F, 0xEBFC, 0x87FB, + 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, + 0x4E8C, 0xECA4, 0x4EE5, 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, + 0xECA8, 0x5937, 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, + 0x5F1B, 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, + 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, 0xECB5, + 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, 0xECB9, 0x79FB, + 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, 0xECBD, 0x8084, 0xECBE, + 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, + 0xECC3, 0x8CB3, 0xECC4, 0x9087, 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, + 0x98F4, 0xECC8, 0x990C, 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, + 0xECCC, 0x76CA, 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, + 0x8B1A, 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, 0xECD9, + 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, 0xECDD, 0xF9EE, + 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, 0xECE1, 0xF9F0, 0xECE2, + 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, 0xECE5, 0x976D, 0xECE6, 0x9777, + 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, + 0x4F7E, 0xECEC, 0x58F9, 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, + 0xECF0, 0x93B0, 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, + 0x598A, 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, + 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, 0xECFD, + 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, 0xEDA3, 0xF9F9, + 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, 0xEDA7, 0x82BF, 0xEDA8, + 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, + 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, + 0x6148, 0xEDB2, 0x6ECB, 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, + 0xEDB6, 0x74F7, 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, + 0x8005, 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, 0xEDC3, + 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, 0xEDC7, 0x707C, + 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, 0xEDCB, 0x828D, 0xEDCC, + 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, + 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, + 0x66AB, 0xEDD6, 0x6F5B, 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, + 0xEDDA, 0x96DC, 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, + 0x5834, 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, + 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, 0xEDE7, + 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, 0xEDEB, 0x6B0C, + 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, 0xEDEF, 0x7350, 0xEDF0, + 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, 0xEDF3, 0x8178, 0xEDF4, 0x81DF, + 0xEDF5, 0x81E7, 0xEDF6, 0x838A, 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, + 0x8594, 0xEDFA, 0x85CF, 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, + 0xEDFE, 0x9577, 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, + 0x5728, 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, 0xEEAD, + 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, 0xEEB1, 0x9F4B, + 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, 0xEEB5, 0x8ACD, 0xEEB6, + 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, 0xEEB9, 0x5132, 0xEEBA, 0x5480, + 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, + 0x696E, 0xEEC0, 0x6A17, 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, + 0xEEC4, 0x732A, 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, + 0x82E7, 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, + 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, 0xEED1, + 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, 0xEED5, 0x5AE1, + 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, 0xEED9, 0x6EF4, 0xEEDA, + 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, + 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, + 0x8B2B, 0xEEE4, 0x8CCA, 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, + 0xEEE8, 0x8FEA, 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, + 0x4F43, 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, 0xEEF5, + 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, 0xEEF9, 0x609B, + 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, 0xEEFD, 0x6C08, 0xEEFE, + 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, 0xEFA3, 0x7530, 0xEFA4, 0x7538, + 0xEFA5, 0x7551, 0xEFA6, 0x7672, 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, + 0x7BAD, 0xEFAA, 0x7BC6, 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, + 0xEFAE, 0x8F49, 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, + 0x942B, 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, + 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, 0xEFBB, + 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, 0xEFBF, 0x5360, + 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, 0xEFC3, 0x70B9, 0xEFC4, + 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, + 0xEFC9, 0x647A, 0xEFCA, 0x8776, 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, + 0x4EAD, 0xEFCE, 0x505C, 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, + 0xEFD2, 0x5B9A, 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, + 0x5F81, 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, 0xEFDF, + 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, 0xEFE3, 0x6DC0, + 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, 0xEFE7, 0x701E, 0xEFE8, + 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, 0xEFEB, 0x753A, 0xEFEC, 0x775B, + 0xEFED, 0x7887, 0xEFEE, 0x798E, 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, + 0x7CBE, 0xEFF2, 0x7D8E, 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, + 0xEFF6, 0x8C9E, 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, + 0x9266, 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, + 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, 0xF0A5, + 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, 0xF0A9, 0x5F1F, + 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, 0xF0AD, 0x6FDF, 0xF0AE, + 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, + 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, + 0x969B, 0xF0B8, 0x973D, 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, + 0xF0BC, 0x5146, 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, + 0x5F14, 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, 0xF0C9, + 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, 0xF0CD, 0x6F6E, + 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, 0xF0D1, 0x74AA, 0xF0D2, + 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, + 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, + 0x7E70, 0xF0DC, 0x8087, 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, + 0xF0E0, 0x8ABF, 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, + 0x906D, 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, + 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, 0xF0ED, + 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, 0xF0F1, 0x731D, + 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, 0xF0F5, 0x60B0, 0xF0F6, + 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, + 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, + 0x8E2A, 0xF1A2, 0x8E35, 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, + 0xF1A6, 0x5750, 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, + 0x7F6A, 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, 0xF1B3, + 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, 0xF1B7, 0x5EDA, + 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, 0xF1BB, 0x682A, 0xF1BC, + 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, + 0xF1C1, 0x73E0, 0xF1C2, 0x7587, 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, + 0x7D2C, 0xF1C6, 0x7DA2, 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, + 0xF1CA, 0x8A85, 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, + 0x9031, 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, + 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, 0xF1D7, + 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, 0xF1DB, 0x6659, + 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, 0xF1DF, 0x6FEC, 0xF1E0, + 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, 0xF1E3, 0x8822, 0xF1E4, 0x9021, + 0xF1E5, 0x9075, 0xF1E6, 0x96CB, 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, + 0x4E2D, 0xF1EA, 0x4EF2, 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, + 0xF1EE, 0x6ADB, 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, + 0x589E, 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, 0xF1FB, + 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, 0xF2A1, 0x54AB, + 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, 0xF2A5, 0x6301, 0xF2A6, + 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, 0xF2A9, 0x65E8, 0xF2AA, 0x667A, + 0xF2AB, 0x679D, 0xF2AC, 0x67B3, 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, + 0x6C9A, 0xF2B0, 0x6F2C, 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, + 0xF2B4, 0x7957, 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, + 0x81F3, 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, + 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, 0xF2C1, + 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, 0xF2C5, 0x8077, + 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, 0xF2C9, 0x632F, 0xF2CA, + 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, 0xF2CD, 0x686D, 0xF2CE, 0x699B, + 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, + 0x7468, 0xF2D4, 0x74A1, 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, + 0xF2D8, 0x771E, 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, + 0x7E1D, 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, 0xF2E5, + 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, 0xF2E9, 0x4F84, + 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, 0xF2ED, 0x5E19, 0xF2EE, + 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, + 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, + 0x8FED, 0xF2F8, 0x659F, 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, + 0xF2FC, 0x6F57, 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, + 0x96C6, 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, + 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, 0xF3AB, + 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, 0xF3AF, 0x78CB, + 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, 0xF3B3, 0x8ECA, 0xF3B4, + 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, 0xF3B7, 0x7740, 0xF3B8, 0x7A84, + 0xF3B9, 0x932F, 0xF3BA, 0x947F, 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, + 0x6FAF, 0xF3BE, 0x71E6, 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, + 0xF3C2, 0x7C12, 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, + 0x8B9A, 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, 0xF3CF, + 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, 0xF3D3, 0x6158, + 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, 0xF3D7, 0x7AD9, 0xF3D8, + 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, 0xF3DB, 0x5021, 0xF3DC, 0x5275, + 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, + 0x6134, 0xF3E2, 0x655E, 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, + 0xF3E6, 0x69CD, 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, + 0x7621, 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, + 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, 0xF3F3, + 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, 0xF3F7, 0x7DB5, + 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, 0xF3FB, 0x91F5, 0xF3FC, + 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, + 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, + 0xF9FF, 0xF4A8, 0x5254, 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, + 0xF4AC, 0x62D3, 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, + 0x7620, 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, 0xF4B9, + 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, 0xF4BD, 0x7394, + 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, 0xF4C1, 0x8CE4, 0xF4C2, + 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, 0xF4C5, 0x95E1, 0xF4C6, 0x9621, + 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, + 0x5FB9, 0xF4CC, 0x64A4, 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, + 0xF4D0, 0x8F4D, 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, + 0x6CBE, 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, + 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, 0xF4DD, + 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, 0xF4E1, 0x758A, + 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, 0xF4E5, 0x8F12, 0xF4E6, + 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, 0xF4E9, 0x807D, 0xF4EA, 0x83C1, + 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, + 0x5243, 0xF4F0, 0x66FF, 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, + 0xF4F4, 0x8AE6, 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, + 0x521D, 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, 0xF5A3, + 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, 0xF5A7, 0x7901, + 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, 0xF5AB, 0x8096, 0xF5AC, + 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, 0xF5AF, 0x8549, 0xF5B0, 0x8C82, + 0xF5B1, 0x8D85, 0xF5B2, 0x9162, 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, + 0x4FC3, 0xF5B6, 0x56D1, 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, + 0xF5BA, 0x89F8, 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, + 0x90A8, 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, + 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, 0xF5C7, + 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, 0xF5CB, 0x5D14, + 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, 0xF5CF, 0x63A8, 0xF5D0, + 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, + 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, + 0x8DA8, 0xF5DA, 0x8FFD, 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, + 0xF5DE, 0x9310, 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, + 0x9A36, 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, 0xF5EB, + 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, 0xF5EF, 0x9010, + 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, 0xF5F3, 0x51FA, 0xF5F4, + 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, + 0xF5F9, 0x87F2, 0xF5FA, 0x885D, 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, + 0x81B5, 0xF5FE, 0x8403, 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, + 0xF6A4, 0x5634, 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, + 0x7FE0, 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, + 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, 0xF6B1, + 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, 0xF6B5, 0x5C64, + 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, 0xF6B9, 0x5CD9, 0xF6BA, + 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, + 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, + 0x7A1A, 0xF6C4, 0x7A49, 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, + 0xF6C8, 0x81F4, 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, + 0x99B3, 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, 0xF6D5, + 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, 0xF6D9, 0x6D78, + 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, 0xF6DD, 0x937C, 0xF6DE, + 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, + 0xF6E3, 0x54A4, 0xF6E4, 0x553E, 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, + 0x60F0, 0xF6E8, 0x6253, 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, + 0xF6EC, 0x8235, 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, + 0x502C, 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, + 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, 0xF6F9, + 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, 0xF6FD, 0x7438, + 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, 0xF7A3, 0x5606, 0xF7A4, + 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, + 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, + 0x812B, 0xF7AE, 0x63A2, 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, + 0xF7B2, 0x5854, 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, + 0x5E11, 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, 0xF7BF, + 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, 0xF7C3, 0x80CE, + 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, 0xF7C7, 0x98B1, 0xF7C8, + 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, 0xF7CB, 0x6491, 0xF7CC, 0x6504, + 0xF7CD, 0x514E, 0xF7CE, 0x5410, 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, + 0x615F, 0xF7D2, 0x6876, 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, + 0xF7D6, 0x7D71, 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, + 0x817F, 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, + 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, 0xF7E3, + 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, 0xF7E7, 0x5761, + 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, 0xF7EB, 0x64AD, 0xF7EC, + 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, + 0xF7F1, 0x7436, 0xF7F2, 0x7834, 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, + 0x8DDB, 0xF7F6, 0x9817, 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, + 0xF7FA, 0x7248, 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, + 0x9211, 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, 0xF8A9, + 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, 0xF8AD, 0x7A17, + 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, 0xF8B1, 0x6F8E, 0xF8B2, + 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, + 0xF8B7, 0x6241, 0xF8B8, 0x7247, 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, + 0x7FE9, 0xF8BC, 0x904D, 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, + 0xF8C0, 0x576A, 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, + 0x8A55, 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, + 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, 0xF8CD, + 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, 0xF8D1, 0x530D, + 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, 0xF8D5, 0x5703, 0xF8D6, + 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, 0xF8D9, 0x62B1, 0xF8DA, 0x6355, + 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, + 0x7832, 0xF8E0, 0x80DE, 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, + 0xF8E4, 0x84B2, 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, + 0x92EA, 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, 0xF8F1, + 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, 0xF8F5, 0x6753, + 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, 0xF8F9, 0x7968, 0xF8FA, + 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, + 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, + 0x8C4A, 0xF9A6, 0x98A8, 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, + 0xF9AA, 0x75B2, 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, + 0x9642, 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, + 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, 0xF9B7, + 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, 0xF9BB, 0x4E0B, + 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, 0xF9BF, 0x5EC8, 0xF9C0, + 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, 0xF9C3, 0x8377, 0xF9C4, 0x8766, + 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, + 0x58D1, 0xF9CA, 0x5B78, 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, + 0xF9CE, 0x5BD2, 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, + 0x6C57, 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, 0xF9DB, + 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, 0xF9DF, 0x542B, + 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, 0xF9E3, 0x6ABB, 0xF9E4, + 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, 0xF9E7, 0x929C, 0xF9E8, 0x9677, + 0xF9E9, 0x9E79, 0xF9EA, 0x5408, 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, + 0x86E4, 0xF9EE, 0x95A4, 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, + 0xF9F2, 0x4F09, 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, + 0x6052, 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, + 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, 0xFAA1, + 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, 0xFAA5, 0x5055, + 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, 0xFAA9, 0x5B69, 0xFAAA, + 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, 0xFAAD, 0x6D77, 0xFAAE, 0x7023, + 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, + 0x9082, 0xFAB4, 0x99ED, 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, + 0xFAB8, 0x5016, 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, + 0x884C, 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, 0xFAC5, + 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, 0xFAC9, 0x8A31, + 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, 0xFACD, 0x8ED2, 0xFACE, + 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, 0xFAD1, 0x5955, 0xFAD2, 0x7200, + 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, + 0x5F26, 0xFAD8, 0x61F8, 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, + 0xFADC, 0x7384, 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, + 0x774D, 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, + 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, 0xFAE9, + 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, 0xFAED, 0x9801, + 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, 0xFAF1, 0x593E, 0xFAF2, + 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, 0xFAF5, 0x72F9, 0xFAF6, 0x8105, + 0xFAF7, 0x8107, 0xFAF8, 0x83A2, 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, + 0x4EA8, 0xFAFC, 0x5144, 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, + 0xFBA2, 0x6CC2, 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, + 0x70AF, 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, 0xFBAF, + 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, 0xFBB3, 0x60E0, + 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, 0xFBB7, 0x8E4A, 0xFBB8, + 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, 0xFBBB, 0x4E92, 0xFBBC, 0x547C, + 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, + 0x5F27, 0xFBC2, 0x6236, 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, + 0xFBC6, 0x6BEB, 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, + 0x6EF8, 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, + 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, 0xFBD3, + 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, 0xFBD7, 0x80E1, + 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, 0xFBDB, 0x864E, 0xFBDC, + 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, + 0xFBE1, 0x9800, 0xFBE2, 0x9865, 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, + 0x9177, 0xFBE6, 0x5A5A, 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, + 0xFBEA, 0x743F, 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, + 0x7B0F, 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, 0xFBF7, + 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, 0xFBFB, 0x5B05, + 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, 0xFCA1, 0x798D, 0xFCA2, + 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, + 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, + 0x652B, 0xFCAC, 0x78BA, 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, + 0xFCB0, 0x559A, 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, + 0x60A3, 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, + 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, 0xFCBD, + 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, 0xFCC1, 0x6ED1, + 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, 0xFCC5, 0x51F0, 0xFCC6, + 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, 0xFCC9, 0x60F6, 0xFCCA, 0x6130, + 0xFCCB, 0x614C, 0xFCCC, 0x6643, 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, + 0x6CC1, 0xFCD0, 0x6E5F, 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, + 0xFCD4, 0x749C, 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, + 0x8352, 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, 0xFCE1, + 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, 0xFCE5, 0x6703, + 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, 0xFCE9, 0x7070, 0xFCEA, + 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, 0xFCED, 0x8334, 0xFCEE, 0x86D4, + 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, + 0x5B96, 0xFCF4, 0x6A6B, 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, + 0xFCF8, 0x5B5D, 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, + 0x689F, 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, + 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, 0xFDA7, + 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, 0xFDAB, 0x55C5, + 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, 0xFDAF, 0x7166, 0xFDB0, + 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, 0xFDB3, 0x52F3, 0xFDB4, 0x5864, + 0xFDB5, 0x58CE, 0xFDB6, 0x7104, 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, + 0x85B0, 0xFDBA, 0x8A13, 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, + 0xFDBE, 0x6684, 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, + 0x5599, 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, 0xFDCB, + 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, 0xFDCF, 0x7566, + 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, 0xFDD3, 0x9DF8, 0xFDD4, + 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, + 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, + 0x75D5, 0xFDDE, 0x5403, 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, + 0xFDE2, 0x6B20, 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, + 0x6070, 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, + 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, 0xFDEF, + 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, 0xFDF3, 0x6198, + 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, 0xFDF7, 0x7199, 0xFDF8, + 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, + 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, 0, 0 }; +# endif + +/// Traditional Chinese +# if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0 +/// Unicode --> Big5 pairs +static const WCHAR uni2oem950[] + = { 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, 0x00B7, + 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, 0x02C9, 0xA3BC, + 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, 0x02D9, 0xA3BB, 0x0391, + 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, 0x0394, 0xA347, 0x0395, 0xA348, + 0x0396, 0xA349, 0x0397, 0xA34A, 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, + 0xA34D, 0x039B, 0xA34E, 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, + 0x039F, 0xA352, 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, + 0xA356, 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, + 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, 0x03B4, + 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, 0x03B8, 0xA363, + 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, 0x03BC, 0xA367, 0x03BD, + 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, 0x03C0, 0xA36B, 0x03C1, 0xA36C, + 0x03C3, 0xA36D, 0x03C4, 0xA36E, 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, + 0xA371, 0x03C8, 0xA372, 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, + 0x2018, 0xA1A5, 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, + 0xA14C, 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, 0x2109, + 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, 0x2163, 0xA2BC, + 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, 0x2167, 0xA2C0, 0x2168, + 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, 0x2191, 0xA1F4, 0x2192, 0xA1F7, + 0x2193, 0xA1F5, 0x2196, 0xA1F8, 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, + 0xA1FA, 0x2215, 0xA241, 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, + 0x2220, 0xA1E7, 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, + 0xA1E5, 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, + 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, 0x2267, + 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, 0x22BF, 0xA1E9, + 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, 0x2510, 0xA27B, 0x2514, + 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, 0x2524, 0xA274, 0x252C, 0xA273, + 0x2534, 0xA272, 0x253C, 0xA271, 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, + 0xF9F8, 0x2552, 0xF9E6, 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, + 0x2556, 0xF9F1, 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, + 0xF9E3, 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, 0x2561, + 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, 0x2565, 0xF9F0, + 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, 0x2569, 0xF9E4, 0x256A, + 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, 0x256C, 0xF9E1, 0x256D, 0xA27E, + 0x256D, 0xF9FA, 0x256E, 0xA2A1, 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, + 0xF9FD, 0x2570, 0xA2A2, 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, + 0x2573, 0xA2AE, 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, + 0xA264, 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, + 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, 0x258C, + 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, 0x2593, 0xF9FE, + 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, 0x25A1, 0xA1BC, 0x25B2, + 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, + 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, + 0xA2A8, 0x25E3, 0xA2A9, 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, + 0x2606, 0xA1B8, 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, + 0xA142, 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, 0x300E, + 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, 0x3012, 0xA245, + 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, 0x301E, 0xA1AA, 0x3021, + 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, 0x3024, 0xA2C6, 0x3025, 0xA2C7, + 0x3026, 0xA2C8, 0x3027, 0xA2C9, 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, + 0xA374, 0x3106, 0xA375, 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, + 0x310A, 0xA379, 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, + 0xA37D, 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, + 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, 0x3117, + 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, 0x311B, 0xA3AC, + 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, 0x311F, 0xA3B0, 0x3120, + 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, 0x3123, 0xA3B4, 0x3124, 0xA3B5, + 0x3125, 0xA3B6, 0x3126, 0xA3B7, 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, + 0xA3BA, 0x32A3, 0xA1C0, 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, + 0x339D, 0xA251, 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, + 0xA253, 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, 0x4E09, + 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, 0x4E0D, 0xA4A3, + 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, 0x4E11, 0xA4A1, 0x4E14, + 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, 0x4E18, 0xA543, 0x4E19, 0xA4FE, + 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, + 0xA4A4, 0x4E2E, 0xC950, 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, + 0x4E33, 0xCBB1, 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, + 0xC964, 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, + 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, 0x4E4F, + 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, 0x4E58, 0xADBC, + 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, 0x4E5E, 0xA45E, 0x4E5F, + 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, + 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, + 0xA4A9, 0x4E8B, 0xA8C6, 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, + 0x4E91, 0xA4AA, 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, + 0xA4AB, 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, 0x4EA6, + 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, 0x4EAD, 0xAB46, + 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, 0x4EB9, 0xF6D6, 0x4EBA, + 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, + 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, + 0xC953, 0x4ECA, 0xA4B5, 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, + 0x4ED5, 0xA54B, 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, + 0xA550, 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, + 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, 0x4EE5, + 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, 0x4EF1, 0xC9B0, + 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, 0x4EF5, 0xC9AE, 0x4EF6, + 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, + 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, + 0xC9B6, 0x4F08, 0xC9B3, 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, + 0x4F0D, 0xA5EE, 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, + 0xA5F0, 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, 0x4F2C, + 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, 0x4F33, 0xCA67, + 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, 0x4F3A, 0xA6F8, 0x4F3B, + 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, + 0x4F41, 0xCA64, 0x4F43, 0xA6FA, 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, + 0xA747, 0x4F49, 0xCA5D, 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, + 0x4F4F, 0xA6ED, 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, + 0xCA5E, 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, + 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, 0x4F5C, + 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, 0x4F60, 0xA741, + 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, 0x4F64, 0xCA5F, 0x4F67, + 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, + 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, + 0xCBB9, 0x4F75, 0xA8D6, 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, + 0x4F79, 0xCBC1, 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, + 0xCBB5, 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, 0x4F86, + 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, 0x4F8B, 0xA8D2, + 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, 0x4F91, 0xA8DD, 0x4F92, + 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, + 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, + 0xA8CC, 0x4F9E, 0xCBC7, 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, + 0x4FB3, 0xCDE8, 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, + 0xCDEE, 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, + 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, 0x4FC5, + 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, 0x4FCB, 0xCDE2, + 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, 0x4FD0, 0xAB57, 0x4FD1, + 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, + 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, + 0xCDE5, 0x4FDD, 0xAB4F, 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, + 0x4FE1, 0xAB48, 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, + 0xADD1, 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, 0x5000, + 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, 0x5009, 0xADDC, + 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, 0x500E, 0xD0DD, 0x500F, + 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, 0x5013, 0xD0CB, 0x5014, 0xADCF, + 0x5015, 0xD45B, 0x5016, 0xADC6, 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, + 0xADD4, 0x501A, 0xADCA, 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, + 0x501F, 0xADC9, 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, + 0xADC0, 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, + 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, 0x502D, + 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, 0x5033, 0xD0D1, + 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, 0x5040, 0xD463, 0x5041, + 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, 0x5046, 0xD462, 0x5047, 0xB0B2, + 0x5048, 0xD455, 0x5049, 0xB0B6, 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, + 0xB0B4, 0x504D, 0xD456, 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, + 0x5053, 0xD451, 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, + 0xD458, 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, 0x5064, + 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, 0x506A, 0xD44D, + 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, 0x506F, 0xB0C0, 0x5070, + 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, 0x5074, 0xB0BC, 0x5075, 0xB0BB, + 0x5076, 0xB0B8, 0x5077, 0xB0BD, 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, + 0xB3C8, 0x5082, 0xD85E, 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, + 0x508B, 0xD855, 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, + 0xB3C7, 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, + 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, 0x509C, + 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, 0x50A3, 0xD856, + 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, 0x50AF, 0xB6CD, 0x50B0, + 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, + 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, + 0xDCBF, 0x50BB, 0xB6CC, 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, + 0x50C1, 0xDCBE, 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, + 0xDCB6, 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, 0x50D3, + 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, 0x50D7, 0xE0F2, + 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, 0x50E0, 0xE0FE, 0x50E3, + 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, + 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, + 0xB9B0, 0x50EE, 0xB9AD, 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, + 0x50F3, 0xE0F4, 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, + 0xBBF9, 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, + 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, 0x5105, + 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, 0x5109, 0xBBFC, + 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, 0x5110, 0xBEAA, 0x5111, + 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, 0x5114, 0xBEA9, 0x5115, 0xBEAB, + 0x5117, 0xE8F6, 0x5118, 0xBEA8, 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, + 0xC076, 0x5120, 0xECBD, 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, + 0x5125, 0xECBA, 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, + 0xEFB8, 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, 0x5138, + 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, 0x513C, 0xC56B, + 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, 0x5141, 0xA4B9, 0x5143, + 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, 0x5146, 0xA5FC, 0x5147, 0xA5FB, + 0x5148, 0xA5FD, 0x5149, 0xA5FA, 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, + 0xA74B, 0x5152, 0xA8E0, 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, + 0x5159, 0xA259, 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, + 0xA25C, 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, + 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, 0x5169, + 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, 0x516E, 0xA4BC, + 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, 0x5177, 0xA8E3, 0x5178, + 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, 0x5187, 0xC94E, 0x5189, 0xA554, + 0x518A, 0xA555, 0x518D, 0xA641, 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, + 0xAB5F, 0x5193, 0xD0E0, 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, + 0x5198, 0xC955, 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, + 0xADDE, 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, 0x51BC, + 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, 0x51C5, 0xD0E3, + 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, 0x51CB, 0xADE4, 0x51CC, + 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, 0x51D0, 0xD468, 0x51D4, 0xD861, + 0x51D7, 0xDCC5, 0x51D8, 0xE140, 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, + 0xE8F9, 0x51E0, 0xA44C, 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, + 0x51F3, 0xB9B9, 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, + 0xA557, 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, + 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, 0x5209, + 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, 0x5210, 0xC9BF, + 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, 0x5216, 0xA647, 0x5217, + 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, 0x521E, 0xCA6D, 0x5221, 0xCA6E, + 0x5224, 0xA750, 0x5225, 0xA74F, 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, + 0xA752, 0x522E, 0xA8ED, 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, + 0x5233, 0xCBD2, 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, + 0xA8E9, 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, 0x524A, + 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, 0x524E, 0xAB62, + 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, 0x5256, 0xADE5, 0x525A, + 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, 0x525D, 0xADE9, 0x525E, 0xD0E9, + 0x525F, 0xD0EA, 0x5261, 0xD0E6, 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, + 0xB0C5, 0x526B, 0xD469, 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, + 0x526F, 0xB0C6, 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, + 0xB6D0, 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, + 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, 0x5282, + 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, 0x5288, 0xBC41, + 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, 0x528C, 0xE4F3, 0x528D, + 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, 0x5296, 0xF1ED, 0x5297, 0xF5C3, + 0x5298, 0xF5C2, 0x5299, 0xF7D1, 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, + 0xA55B, 0x52A3, 0xA648, 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, + 0x52AB, 0xA754, 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, + 0xA8F1, 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, 0x52CD, + 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, 0x52D6, 0xD46D, + 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, 0x52DB, 0xB3D4, 0x52DD, + 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, + 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, + 0xE4F5, 0x52F0, 0xBC45, 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, + 0x52F5, 0xC079, 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, + 0xA4C3, 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, + 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, 0x530B, + 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, 0x5310, 0xB0CB, + 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, 0x5316, 0xA4C6, 0x5317, + 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, 0x531C, 0xC96C, 0x531D, 0xA560, + 0x531F, 0xC9C2, 0x5320, 0xA64B, 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, + 0xA758, 0x532A, 0xADEA, 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, + 0x5331, 0xB9BC, 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, + 0xCBD8, 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, 0x5345, + 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, 0x5349, 0xA563, + 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, 0x5351, 0xA8F5, 0x5352, + 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, 0x5357, 0xAB6E, 0x535A, 0xB3D5, + 0x535C, 0xA452, 0x535E, 0xA4CB, 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, + 0xCA72, 0x5366, 0xA8F6, 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, + 0x5370, 0xA64C, 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, + 0xA75A, 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, + 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, 0x538A, + 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, 0x5394, 0xCBDA, + 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, 0x5399, 0xCDF8, 0x539A, + 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, 0x539E, 0xD0EF, 0x539F, 0xADEC, + 0x53A4, 0xD864, 0x53A5, 0xB3D6, 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, + 0xB9BD, 0x53B2, 0xBC46, 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, + 0x53C3, 0xB0D1, 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, + 0xA4CD, 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, 0x53E3, + 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, 0x53E8, 0xA56F, + 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, 0x53EC, 0xA56C, 0x53ED, + 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, 0x53F0, 0xA578, 0x53F1, 0xA577, + 0x53F2, 0xA576, 0x53F3, 0xA56B, 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, + 0xA57B, 0x53FC, 0xA570, 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, + 0x5406, 0xA65B, 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, + 0xA651, 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, + 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, 0x5418, + 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, 0x541D, 0xA75B, + 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, 0x5424, 0xCAA5, 0x5425, + 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, 0x5428, 0xCAA4, 0x5429, 0xA768, + 0x542A, 0xCA78, 0x542B, 0xA774, 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, + 0xA76D, 0x5430, 0xCA76, 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, + 0x5436, 0xA76F, 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, + 0xA76B, 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, 0x5446, + 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, 0x544E, 0xA760, + 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, 0x5461, 0xCBEA, 0x5462, + 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, 0x5465, 0xCBE4, 0x5466, 0xCBE7, + 0x5467, 0xCBEE, 0x5468, 0xA950, 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, + 0xCBE9, 0x5470, 0xCE49, 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, + 0x5474, 0xCBE6, 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, + 0xA941, 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, + 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, 0x5482, + 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, 0x5488, 0xCBE0, + 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, 0x548E, 0xA953, 0x5490, + 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, 0x5495, 0xA942, 0x5496, 0xA940, + 0x5498, 0xCBEC, 0x549A, 0xA94E, 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, + 0xCE4B, 0x54A5, 0xCDFD, 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, + 0x54A9, 0xABA7, 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, + 0xCDFC, 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, 0x54BA, + 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, 0x54BE, 0xCE4C, + 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, 0x54C2, 0xAB7B, 0x54C3, + 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, 0x54C6, 0xCE47, 0x54C7, 0xAB7A, + 0x54C8, 0xABA2, 0x54C9, 0xAB76, 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, + 0xCE44, 0x54DE, 0xCE4E, 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, + 0x54E4, 0xD0F6, 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, + 0xADEF, 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, + 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, 0x54F7, + 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, 0x54FC, 0xADF3, + 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, 0x5503, 0xD146, 0x5504, + 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, 0x5507, 0xAE42, 0x5508, 0xD0FA, + 0x5509, 0xADFC, 0x550A, 0xD140, 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, + 0xD145, 0x550F, 0xAE44, 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, + 0x5514, 0xADF8, 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, + 0xAE41, 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, 0x5533, + 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, 0x5537, 0xADF2, + 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, 0x553C, 0xD473, 0x553E, + 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, 0x5543, 0xB0D9, 0x5544, 0xB0D6, + 0x5545, 0xD47E, 0x5546, 0xB0D3, 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, + 0xD4AA, 0x554D, 0xD474, 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, + 0x5551, 0xD478, 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, + 0xB0E8, 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, + 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, 0x5566, + 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, 0x5577, 0xD86A, + 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, 0x557E, 0xB3EE, 0x557F, + 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, 0x5582, 0xB3DE, 0x5583, 0xB3E4, + 0x5584, 0xB5BD, 0x5587, 0xB3E2, 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, + 0xB3DB, 0x558B, 0xB3E3, 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, + 0x558F, 0xD86F, 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, + 0xB3E1, 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, 0x55A2, + 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, 0x55A6, 0xD877, + 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, 0x55AB, 0xB3F0, 0x55AC, + 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, + 0x55B3, 0xB3E5, 0x55B5, 0xD870, 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, + 0xDCD1, 0x55C2, 0xDCE0, 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, + 0x55C6, 0xB6E6, 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, + 0xDCCF, 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, + 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, 0x55D3, + 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, 0x55D9, 0xDCDF, + 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, 0x55DD, 0xDCD0, 0x55DF, + 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, + 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, + 0xDCD4, 0x55EF, 0xB6E2, 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, + 0x55F9, 0xE155, 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, + 0xB9BE, 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, 0x560C, + 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, 0x5610, 0xB9CC, + 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, 0x5615, 0xE148, 0x5616, + 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, 0x561C, 0xE14D, 0x561D, 0xE152, + 0x561F, 0xB9CA, 0x5627, 0xE147, 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, + 0xE544, 0x562E, 0xBC47, 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, + 0x5633, 0xE542, 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, + 0xE546, 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, + 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, 0x5642, + 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, 0x5649, 0xE4FC, + 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, 0x5653, 0xBC4E, 0x5657, + 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, 0x565A, 0xE540, 0x565E, 0xE945, + 0x5660, 0xE8FD, 0x5662, 0xBEBE, 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, + 0xBEBA, 0x5666, 0xE941, 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, + 0x566B, 0xBEB3, 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, + 0xBEBC, 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, 0x5679, + 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, 0x5681, 0xECC9, + 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, 0x5685, 0xC07D, 0x5686, + 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, 0x568D, 0xECC2, 0x568E, 0xC07A, + 0x568F, 0xC0A1, 0x5690, 0xC07C, 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, + 0xEFBC, 0x5698, 0xEFBA, 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, + 0x569D, 0xEFBE, 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, + 0xC456, 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, + 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, 0x56B5, + 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, 0x56BD, 0xF5C5, + 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, 0x56C2, 0xC4DB, 0x56C3, + 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, 0x56C8, 0xC56D, 0x56C9, 0xC56F, + 0x56CA, 0xC56E, 0x56CB, 0xF6D9, 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, + 0xC5F1, 0x56D3, 0xF8A5, 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, + 0x56DB, 0xA57C, 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, + 0xA65D, 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, 0x56F7, + 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, 0x5701, 0xD148, + 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, 0x5707, 0xD4AC, 0x5708, + 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, 0x570B, 0xB0EA, 0x570C, 0xD87C, + 0x570D, 0xB3F2, 0x5712, 0xB6E9, 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, + 0xB9CF, 0x5718, 0xB9CE, 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, + 0x571E, 0xF96B, 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, + 0xC96F, 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, + 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, 0x5733, + 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, 0x5740, 0xA77D, + 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, 0x5749, 0xCAAD, 0x574A, + 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, 0x574D, 0xA77E, 0x574E, 0xA7A2, + 0x574F, 0xA7A5, 0x5750, 0xA7A4, 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, + 0xA959, 0x5762, 0xCBFE, 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, + 0x5769, 0xA958, 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, + 0xCBF2, 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, 0x577B, + 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, 0x5782, 0xABAB, + 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, 0x578F, 0xCE5A, 0x5793, + 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, 0x5797, 0xCE55, 0x5798, 0xCE59, + 0x5799, 0xCE5B, 0x579A, 0xCE5D, 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, + 0xCE51, 0x579F, 0xCE52, 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, + 0x57A4, 0xCE53, 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, + 0xD153, 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, + 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, 0x57C3, + 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, 0x57CC, 0xD14A, + 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, 0x57D2, 0xD14D, 0x57D4, + 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, + 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, + 0xD4BF, 0x57E7, 0xD4C5, 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, + 0x57EE, 0xD4BC, 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, + 0xD4B9, 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, 0x57FC, + 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, 0x5802, 0xB0F3, + 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, 0x5807, 0xD4BB, 0x5808, + 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, 0x580B, 0xD4B8, 0x580C, 0xD4C7, + 0x580D, 0xD4CB, 0x580E, 0xD4C2, 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, + 0xD8A1, 0x581B, 0xD8AA, 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, + 0x5820, 0xB3FB, 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, + 0xD8A8, 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, + 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, 0x5830, + 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, 0x5834, 0xB3F5, + 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, 0x5838, 0xD8B0, 0x5839, + 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, 0x583F, 0xD8AC, 0x5848, 0xD8A7, + 0x5849, 0xDCE7, 0x584A, 0xB6F4, 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, + 0xDCE6, 0x584E, 0xDCEA, 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, + 0x5853, 0xDCE2, 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, + 0xB6ED, 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, 0x5865, + 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, 0x586F, 0xDCE8, + 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, 0x5876, 0xE163, 0x5879, + 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, 0x587C, 0xE157, 0x587D, 0xB9D7, + 0x587E, 0xB9D1, 0x587F, 0xE15C, 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, + 0xE164, 0x5883, 0xB9D2, 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, + 0x5888, 0xE165, 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, + 0xE162, 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, + 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, 0x589E, + 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, 0x58A3, 0xE54E, + 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, 0x58A9, 0xBC5B, 0x58AB, + 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, 0x58AF, 0xE54F, 0x58B1, 0xE54C, + 0x58B3, 0xBC58, 0x58BA, 0xE94D, 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, + 0xE94A, 0x58BE, 0xBEC1, 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, + 0x58C5, 0xBEC3, 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, + 0xE94B, 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, 0x58D8, + 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, 0x58DD, 0xF1F7, + 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, 0x58E3, 0xF442, 0x58E4, + 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, 0x58E9, 0xC5F2, 0x58EB, 0xA468, + 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, + 0xB3FD, 0x58FC, 0xDCF2, 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, + 0x5903, 0xC95A, 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, + 0xD159, 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, + 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, 0x591C, + 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, 0x5925, 0xB9D9, + 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, 0x592B, 0xA4D2, 0x592C, + 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, 0x592F, 0xC971, 0x5931, 0xA5A2, + 0x5937, 0xA669, 0x5938, 0xA66A, 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, + 0xCAB1, 0x5944, 0xA961, 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, + 0x5949, 0xA95E, 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, + 0xABB7, 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, 0x5960, + 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, 0x5969, 0xB9DD, + 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, 0x596E, 0xBEC4, 0x5970, + 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, 0x5973, 0xA46B, 0x5974, 0xA5A3, + 0x5976, 0xA5A4, 0x5977, 0xC9D1, 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, + 0xC9CF, 0x597C, 0xC9CD, 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, + 0x5980, 0xC9CC, 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, + 0xA66B, 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, + 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, 0x5996, + 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, 0x599D, 0xA7A9, + 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, 0x59A2, 0xCAB7, 0x59A3, + 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, 0x59A6, 0xCAB2, 0x59A7, 0xCABA, + 0x59A8, 0xA7AB, 0x59AE, 0xA967, 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, + 0xCC48, 0x59B3, 0xA970, 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, + 0x59B9, 0xA966, 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, + 0xCC50, 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, 0x59CA, + 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, 0x59CE, 0xCC47, + 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, 0x59D2, 0xA971, 0x59D3, + 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, 0x59D8, 0xABB9, 0x59DA, 0xABC0, + 0x59DB, 0xCE6F, 0x59DC, 0xABB8, 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, + 0xCE73, 0x59E1, 0xCE62, 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, + 0x59E6, 0xABC1, 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, + 0xAE56, 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, + 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, 0x59F7, + 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, 0x59FD, 0xCE69, + 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, 0x5A01, 0xABC2, 0x5A03, + 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, + 0x5A11, 0xAE50, 0x5A13, 0xAE55, 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, + 0xD161, 0x5A18, 0xAE51, 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, + 0x5A1E, 0xD163, 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, + 0xAE5A, 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, 0x5A39, + 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, 0x5A41, 0xB0FA, + 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, 0x5A46, 0xB143, 0x5A47, + 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, + 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, + 0xD4DA, 0x5A55, 0xD4D0, 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, + 0x5A5A, 0xB142, 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, + 0xD4D2, 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, + 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, 0x5A6A, + 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, 0x5A77, 0xB440, + 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, 0x5A7C, 0xD8BD, 0x5A7D, + 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, + 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, + 0xDD47, 0x5A92, 0xB443, 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, + 0x5A97, 0xD8C5, 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, + 0xD8CF, 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, 0x5AAE, + 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, 0x5AB2, 0xB742, + 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, 0x5AB6, 0xDD44, 0x5AB7, + 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, + 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, + 0xDD41, 0x5AC1, 0xB6F9, 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, + 0x5AC7, 0xDCF3, 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, + 0xDCF5, 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, + 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, 0x5ADB, + 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, 0x5ADF, 0xE17C, + 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, 0x5AE3, 0xB9E4, 0x5AE5, + 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, + 0x5AEB, 0xE172, 0x5AEC, 0xE177, 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, + 0xE173, 0x5AF4, 0xE555, 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, + 0x5AF8, 0xE55A, 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, + 0xE556, 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, 0x5B0B, + 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, 0x5B13, 0xE956, + 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, 0x5B19, 0xE952, 0x5B1A, + 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, 0x5B1E, 0xE95C, 0x5B20, 0xE95B, + 0x5B21, 0xE954, 0x5B23, 0xECD1, 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, + 0xECD4, 0x5B27, 0xECD3, 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, + 0x5B2D, 0xECCE, 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, + 0xECD0, 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, + 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, 0x5B45, + 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, 0x5B4C, 0xF6DC, + 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, 0x5B51, 0xA46D, 0x5B53, + 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, 0x5B56, 0xC9D3, 0x5B57, 0xA672, + 0x5B58, 0xA673, 0x5B5A, 0xA7B7, 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, + 0xA7B5, 0x5B5F, 0xA973, 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, + 0x5B65, 0xCC56, 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, + 0xD4F0, 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, 0x5B7B, + 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, 0x5B83, 0xA5A6, + 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, 0x5B88, 0xA675, 0x5B89, + 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, + 0x5B92, 0xCABD, 0x5B93, 0xCC57, 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, + 0xA978, 0x5B99, 0xA97A, 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, + 0x5BA2, 0xABC8, 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, + 0xABC6, 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, + 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, 0x5BB5, + 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, 0x5BBF, 0xB14A, + 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, 0x5BC4, 0xB148, 0x5BC5, + 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, + 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, + 0xD8D4, 0x5BD2, 0xB448, 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, + 0x5BD8, 0xDD49, 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, + 0xE17E, 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, 0x5BE9, + 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, 0x5BEE, 0xBC64, + 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, 0x5BF2, 0xECD9, 0x5BF5, + 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, 0x5BFA, 0xA678, 0x5C01, 0xABCA, + 0x5C03, 0xD169, 0x5C04, 0xAE67, 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, + 0xB14C, 0x5C0A, 0xB44C, 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, + 0x5C0E, 0xBEC9, 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, + 0xC974, 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, + 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, 0x5C2A, + 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, 0x5C33, 0xDD4C, + 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, 0x5C3A, 0xA4D8, 0x5C3B, + 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, + 0x5C41, 0xA7BE, 0x5C44, 0xCC59, 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, + 0xCC5A, 0x5C48, 0xA97D, 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, + 0x5C4E, 0xABCB, 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, + 0xD16B, 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, 0x5C63, + 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, 0x5C68, 0xC0AB, + 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, 0x5C6D, 0xF8A8, 0x5C6E, + 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, 0x5C73, 0xC977, 0x5C74, 0xC976, + 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, + 0xC9D9, 0x5C86, 0xCAC7, 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, + 0x5C8B, 0xCAC3, 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, + 0xA7C1, 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, + 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, 0x5CA1, + 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, 0x5CA5, 0xCC69, + 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, 0x5CA9, 0xA9A5, 0x5CAA, + 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, + 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, + 0xCC5E, 0x5CB6, 0xCC6A, 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, + 0x5CC7, 0xCEA4, 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, + 0xCE7D, 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, 0x5CD7, + 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, 0x5CDB, 0xCE7E, + 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, 0x5CEA, 0xAE6E, 0x5CEC, + 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, + 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, + 0xD172, 0x5CFB, 0xAE6D, 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, + 0x5D01, 0xAE72, 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, + 0xD4F9, 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, + 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, 0x5D19, + 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, 0x5D1E, 0xD4F4, + 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, 0x5D23, 0xD542, 0x5D24, + 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, 0x5D27, 0xB15D, 0x5D28, 0xD4FA, + 0x5D29, 0xB159, 0x5D2E, 0xD544, 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, + 0xD8EE, 0x5D33, 0xD8E3, 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, + 0x5D37, 0xD8D9, 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, + 0xD8ED, 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, 0x5D49, + 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, 0x5D4E, 0xD8E1, + 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, 0x5D55, 0xD8E2, 0x5D59, + 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, 0x5D63, 0xDD4E, 0x5D65, 0xDD50, + 0x5D67, 0xDD55, 0x5D68, 0xDD54, 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, + 0xDD52, 0x5D6F, 0xB744, 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, + 0x5D79, 0xE1B0, 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, + 0xE1AD, 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, + 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, 0x5D89, + 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, 0x5D93, 0xE567, + 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, 0x5D99, 0xE562, 0x5D9A, + 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, 0x5D9E, 0xE56D, 0x5D9F, 0xE564, + 0x5DA0, 0xE569, 0x5DA1, 0xE56B, 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, + 0xE966, 0x5DA9, 0xE960, 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, + 0x5DAE, 0xE964, 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, + 0xE967, 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, 0x5DC2, + 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, 0x5DC9, 0xC460, + 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, 0x5DD1, 0xF6DE, 0x5DD2, + 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, + 0x5DDD, 0xA474, 0x5DDE, 0xA67B, 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, + 0xA8B5, 0x5DE2, 0xB15F, 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, + 0x5DE8, 0xA5A8, 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, + 0xA476, 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, + 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, 0x5E02, + 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, 0x5E0A, 0xCACB, + 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, 0x5E14, 0xCC6E, 0x5E15, + 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, + 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, + 0xCEB3, 0x5E21, 0xCEB0, 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, + 0x5E25, 0xABD3, 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, + 0xAE75, 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, 0x5E41, + 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, 0x5E4A, 0xDD5A, + 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, 0x5E4E, 0xDD59, 0x5E4F, + 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, + 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, + 0xE56F, 0x5E5F, 0xBC6D, 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, + 0x5E63, 0xB9F4, 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, + 0xE56E, 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, + 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, 0x5E73, + 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, 0x5E78, 0xA9AF, + 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, 0x5E7D, 0xABD5, 0x5E7E, + 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, + 0x5E88, 0xCAD0, 0x5E89, 0xCACE, 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, + 0xCACF, 0x5E8D, 0xCAD1, 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, + 0x5E97, 0xA9B1, 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, + 0xABD6, 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, 0x5EAB, + 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, 0x5EB0, 0xCEB5, + 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, 0x5EB4, 0xD548, 0x5EB5, + 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, 0x5EB8, 0xB165, 0x5EB9, 0xD549, + 0x5EBE, 0xB168, 0x5EC1, 0xB45A, 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, + 0xDD5D, 0x5EC6, 0xDD5F, 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, + 0x5ECA, 0xB459, 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, + 0xE1B6, 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, + 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, 0x5EDA, + 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, 0x5EDE, 0xE574, + 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, 0x5EE2, 0xBC6F, 0x5EE3, + 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, 0x5EE7, 0xE970, 0x5EE8, 0xE972, + 0x5EE9, 0xE96F, 0x5EEC, 0xC366, 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, + 0xF5CB, 0x5EF2, 0xF6DF, 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, + 0x5EFA, 0xABD8, 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, + 0xC9DD, 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, 0x5F13, + 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, 0x5F18, 0xA5B0, + 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, 0x5F1F, 0xA7CC, 0x5F22, + 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, + 0x5F28, 0xCC70, 0x5F29, 0xA9B8, 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, + 0xD17A, 0x5F31, 0xAE7A, 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, + 0x5F37, 0xB16A, 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, + 0xE1BF, 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, + 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, 0x5F4F, + 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, 0x5F58, 0xD8F4, + 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, 0x5F64, 0xA7CD, 0x5F65, + 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, 0x5F6A, 0xB343, 0x5F6B, 0xB16E, + 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, + 0xBC76, 0x5F73, 0xC94C, 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, + 0x5F78, 0xCAD4, 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, + 0xCC76, 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, 0x5F89, + 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, 0x5F90, 0xAE7D, + 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, 0x5F97, 0xB16F, 0x5F98, + 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, 0x5F9C, 0xB175, 0x5F9E, 0xB171, + 0x5F9F, 0xD550, 0x5FA0, 0xB174, 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, + 0xD8F5, 0x5FA8, 0xB461, 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, + 0x5FAC, 0xB74B, 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, + 0xE577, 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, + 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, 0x5FBF, + 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, 0x5FC5, 0xA5B2, + 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, 0x5FCF, 0xC9E2, 0x5FD0, + 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, + 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, + 0xA9BD, 0x5FDE, 0xCC78, 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, + 0x5FE4, 0xCADE, 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, + 0xA7D6, 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, 0x5FF8, + 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, 0x5FFF, 0xA9C1, + 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, 0x600B, 0xCC7E, 0x600C, + 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, 0x600F, 0xA9C2, 0x6010, 0xCCAA, + 0x6011, 0xCCAD, 0x6012, 0xABE3, 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, + 0xA9C8, 0x6016, 0xA9C6, 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, + 0x601B, 0xA9CD, 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, + 0xABE5, 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, + 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, 0x602A, + 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, 0x602E, 0xCCAB, + 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, 0x6034, 0xCCA1, 0x6035, + 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, 0x6040, 0xCECA, 0x6041, 0xD1A1, + 0x6042, 0xCECB, 0x6043, 0xABEE, 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, + 0xABED, 0x6047, 0xCEC6, 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, + 0x6050, 0xAEA3, 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, + 0xAEA4, 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, 0x6063, + 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, 0x6067, 0xD17E, + 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, 0x606B, 0xABF0, 0x606C, + 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, 0x606F, 0xAEA7, 0x6070, 0xABEA, + 0x6072, 0xCEC2, 0x607F, 0xB176, 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, + 0xD1A8, 0x6084, 0xAEA8, 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, + 0x6088, 0xD1A3, 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, + 0xAEAB, 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, + 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, 0x609B, + 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, 0x60A0, 0xB179, + 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, 0x60B0, 0xD555, 0x60B1, + 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, 0x60B5, 0xB1A3, 0x60B6, 0xB465, + 0x60B7, 0xD560, 0x60B8, 0xB1AA, 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, + 0xB1A2, 0x60BC, 0xB1A5, 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, + 0x60C0, 0xD565, 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, + 0xB1A1, 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, 0x60CE, + 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, 0x60D4, 0xD558, + 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, 0x60DA, 0xB1AB, 0x60DB, + 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, 0x60DF, 0xB1A9, 0x60E0, 0xB466, + 0x60E1, 0xB463, 0x60E2, 0xD8FB, 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, + 0xB46B, 0x60F1, 0xB46F, 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, + 0x60F5, 0xD944, 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, + 0xB753, 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, + 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, 0x6104, + 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, 0x6109, 0xB472, + 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, 0x610E, 0xB470, 0x610F, + 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, 0x6113, 0xD945, 0x6114, 0xD8FE, + 0x6115, 0xB46A, 0x6116, 0xD942, 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, + 0xB752, 0x611C, 0xB467, 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, + 0x6127, 0xB75C, 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, + 0xE1C2, 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, 0x613F, + 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, 0x6145, 0xDD69, + 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, 0x6149, 0xDD66, 0x614A, + 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, 0x614D, 0xB759, 0x614E, 0xB756, + 0x614F, 0xDD6F, 0x6152, 0xE1C8, 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, + 0xBC7D, 0x6156, 0xE1D5, 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, + 0x615D, 0xBC7C, 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, + 0xBA43, 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, + 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, 0x616E, + 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, 0x6173, 0xE1C7, + 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, 0x6177, 0xBA42, 0x6179, + 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, 0x617E, 0xBCA4, 0x6180, 0xE1CC, + 0x6182, 0xBC7E, 0x6183, 0xE579, 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, + 0xE578, 0x618C, 0xE9A3, 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, + 0x6191, 0xBECC, 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, + 0xE978, 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, 0x61A8, + 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, 0x61AC, 0xBCA9, + 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, 0x61B0, 0xE57C, 0x61B1, + 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, 0x61B4, 0xE97A, 0x61B5, 0xECE0, + 0x61B6, 0xBED0, 0x61B8, 0xE9A2, 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, + 0xBED1, 0x61BF, 0xE9A1, 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, + 0x61C5, 0xE979, 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, + 0xC0B3, 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, + 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, 0x61E0, + 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, 0x61E6, 0xC0B6, + 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, 0x61EA, 0xEFCC, 0x61EB, + 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, + 0x61F2, 0xC367, 0x61F5, 0xC36A, 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, + 0xC461, 0x61F9, 0xF44A, 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, + 0x61FD, 0xF5CC, 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, + 0xF7D9, 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, 0x620E, + 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, 0x6214, 0xCCB1, + 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, 0x621A, 0xB1AD, 0x621B, + 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, 0x6221, 0xB760, 0x6222, 0xB761, + 0x6223, 0xDD74, 0x6224, 0xDD76, 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, + 0xE1D6, 0x622A, 0xBA49, 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, + 0x6230, 0xBED4, 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, + 0xA4E1, 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, + 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, 0x6246, + 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, 0x624A, 0xD951, + 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, 0x6250, 0xC97D, 0x6251, + 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, 0x6254, 0xA5B5, 0x6258, 0xA6AB, + 0x6259, 0xC9E9, 0x625A, 0xC9EB, 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, + 0xC9E4, 0x6260, 0xC9EA, 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, + 0x6264, 0xC9E5, 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, + 0xA7EA, 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, 0x6279, + 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, 0x627D, 0xCAF4, + 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, 0x6281, 0xCAF1, 0x6283, + 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, 0x6287, 0xCAEC, 0x6288, 0xCAF2, + 0x6289, 0xA7E0, 0x628A, 0xA7E2, 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, + 0xCAEA, 0x6291, 0xA7ED, 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, + 0x6295, 0xA7EB, 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, + 0xA9E1, 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, + 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, 0x62B1, + 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, 0x62B6, 0xCCB8, + 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, 0x62BC, 0xA9E3, 0x62BD, + 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, + 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, + 0xCCB9, 0x62CB, 0xA9DF, 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, + 0x62CF, 0xCED4, 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, + 0xA9DD, 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, 0x62EB, + 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, 0x62EF, 0xAC40, + 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, 0x62F3, 0xAEB1, 0x62F4, + 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, 0x62F7, 0xABFE, 0x62F8, 0xCEDE, + 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, + 0xABFB, 0x62FE, 0xAC42, 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, + 0x6302, 0xAC45, 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, + 0xABF6, 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, + 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, 0x6314, + 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, 0x6329, 0xD1BE, + 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, 0x632D, 0xD1C4, 0x632F, + 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, 0x6334, 0xD1C0, 0x6336, 0xD1B7, + 0x6338, 0xD1C9, 0x6339, 0xD1BA, 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, + 0xD1BD, 0x633D, 0xAEBE, 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, + 0x6342, 0xAEB8, 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, + 0xAEB9, 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, 0x634F, + 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, 0x6355, 0xAEB7, + 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, 0x6359, 0xD1C3, 0x635A, + 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, 0x6368, 0xB1CB, 0x6369, 0xB1CA, + 0x636B, 0xB1BF, 0x636D, 0xD579, 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, + 0xD5A6, 0x6371, 0xB1BA, 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, + 0x6377, 0xB1B6, 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, + 0xD57B, 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, + 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, 0x6388, + 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, 0x638D, 0xD5A5, + 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, 0x6391, 0xD5A4, 0x6392, + 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, 0x6397, 0xD56F, 0x6398, 0xB1B8, + 0x6399, 0xB1C3, 0x639B, 0xB1BE, 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, + 0xD56C, 0x639F, 0xD57E, 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, + 0x63A3, 0xB477, 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, + 0xB1C0, 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, 0x63B1, + 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, 0x63C2, 0xD96A, + 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, 0x63C6, 0xB47D, 0x63C7, + 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, 0x63CA, 0xD95C, 0x63CB, 0xD96D, + 0x63CC, 0xD96C, 0x63CD, 0xB47E, 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, + 0xB4A3, 0x63D2, 0xB4A1, 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, + 0x63D7, 0xD970, 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, + 0xB4AB, 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, + 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, 0x63E7, + 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, 0x63EB, 0xDD79, + 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, 0x63F0, 0xD96F, 0x63F1, + 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, 0x63F4, 0xB4A9, 0x63F5, 0xD961, + 0x63F6, 0xD95E, 0x63F9, 0xB4AE, 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, + 0xDDB1, 0x640B, 0xDDB6, 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, + 0x640F, 0xB769, 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, + 0xB76B, 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, 0x641F, + 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, 0x6423, 0xDDA9, + 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, 0x6427, 0xDDB5, 0x6428, + 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, 0x642C, 0xB768, 0x642D, 0xB766, + 0x642E, 0xDDB9, 0x642F, 0xDDB0, 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, + 0xBA53, 0x6435, 0xDDAF, 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, + 0x643D, 0xB767, 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, + 0xDDAE, 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, + 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, 0x6454, + 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, 0x645C, 0xE1E8, + 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, 0x6460, 0xE1EB, 0x6461, + 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, 0x6467, 0xBA52, 0x6468, 0xE5BA, + 0x6469, 0xBCAF, 0x646B, 0xE1F0, 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, + 0xE5AD, 0x646F, 0xBCB0, 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, + 0x6474, 0xE1DD, 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, + 0xBA4E, 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, 0x6488, + 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, 0x648C, 0xE5B7, + 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, 0x6493, 0xBCB8, 0x6495, + 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, 0x6498, 0xE5BC, 0x6499, 0xBCC1, + 0x649A, 0xBCBF, 0x649C, 0xE5B3, 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, + 0xE5B9, 0x64A0, 0xE5B0, 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, + 0x64A5, 0xBCB7, 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, + 0xBCC0, 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, + 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, 0x64BD, + 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, 0x64C2, 0xBEDD, + 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, 0x64C7, 0xBEDC, 0x64C9, + 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, + 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, + 0xE9A5, 0x64D7, 0xE9A4, 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, + 0x64DB, 0xE9AC, 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, + 0xECEC, 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, 0x64F1, + 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, 0x64F7, 0xC25E, + 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, 0x64FC, 0xEFD7, 0x64FD, + 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, 0x6500, 0xC36B, 0x6501, 0xEFD5, + 0x6503, 0xEFD6, 0x6504, 0xEFD2, 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, + 0xF245, 0x650C, 0xF246, 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, + 0x6510, 0xF243, 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, + 0xF44C, 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, + 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, 0x6522, + 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, 0x6526, 0xF6E2, + 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, 0x652C, 0xC5F3, 0x652D, + 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, 0x6532, 0xD972, 0x6533, 0xE9AF, + 0x6536, 0xA6AC, 0x6537, 0xCAF7, 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, + 0xA7F0, 0x653D, 0xCCC1, 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, + 0x6543, 0xCEE8, 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, + 0xAEC5, 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, 0x6558, + 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, 0x655E, 0xB4AF, + 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, 0x6565, 0xD978, 0x6566, + 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, 0x656A, 0xD974, 0x656C, 0xB771, + 0x656F, 0xDDBC, 0x6572, 0xBA56, 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, + 0xBCC4, 0x6576, 0xE5BD, 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, + 0x657A, 0xE5BE, 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, + 0xECEF, 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, + 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, 0x6592, + 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, 0x6597, 0xA4E6, + 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, 0x659D, 0xD97A, 0x659E, + 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, 0x65A1, 0xBA57, 0x65A2, 0xE9B2, + 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, + 0xCEE9, 0x65AB, 0xAC48, 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, + 0x65B0, 0xB773, 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, + 0xC25F, 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, 0x65C3, + 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, 0x65CB, 0xB1DB, + 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, 0x65CF, 0xB1DA, 0x65D0, + 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, 0x65D6, 0xBA59, 0x65D7, 0xBA58, + 0x65DA, 0xECF1, 0x65DB, 0xEFD9, 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, + 0xF44F, 0x65E1, 0xC95E, 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, + 0x65E8, 0xA6AE, 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, + 0xC9EE, 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, + 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, 0x65FB, + 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, 0x6602, 0xA9F9, + 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, 0x6606, 0xA9F8, 0x6607, + 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, 0x660A, 0xA9FE, 0x660B, 0xCCCB, + 0x660C, 0xA9F7, 0x660D, 0xCCCC, 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, + 0xCCD0, 0x6611, 0xCCCF, 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, + 0x6615, 0xA9FD, 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, + 0xAC4D, 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, 0x662D, + 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, 0x6632, 0xCEED, + 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, 0x6636, 0xCEEB, 0x6639, + 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, 0x6642, 0xAEC9, 0x6643, 0xAECC, + 0x6645, 0xAECF, 0x6647, 0xD1D5, 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, + 0xAECE, 0x664F, 0xAECB, 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, + 0x665A, 0xB1DF, 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, + 0xB1E3, 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, + 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, 0x666C, + 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, 0x6671, 0xD9A5, + 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, 0x6677, 0xB4BE, 0x6678, + 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, 0x667B, 0xD9A3, 0x667C, 0xD9A1, + 0x667E, 0xB4BD, 0x6680, 0xD9A4, 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, + 0xB776, 0x6688, 0xB777, 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, + 0x668C, 0xDDC0, 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, + 0xDDC6, 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, 0x66A1, + 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, 0x66AA, 0xE5C8, + 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, 0x66B0, 0xE5C4, 0x66B1, + 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, + 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, + 0xE9B9, 0x66BE, 0xE9B4, 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, + 0x66C7, 0xBEE8, 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, + 0xE9B7, 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, + 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, 0x66DC, + 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, 0x66E3, 0xF451, + 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, 0x66E9, 0xC4E4, 0x66EB, + 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, + 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, + 0xAC54, 0x66F8, 0xAED1, 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, + 0x66FF, 0xB4C0, 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, + 0xE1FA, 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, 0x6712, + 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, 0x6717, 0xAED4, + 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, 0x671F, 0xB4C1, 0x6720, + 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, 0x6723, 0xE9BD, 0x6726, 0xC261, + 0x6727, 0xC467, 0x6728, 0xA4EC, 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, + 0xA5BB, 0x672D, 0xA5BE, 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, + 0x6734, 0xA6B5, 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, + 0xC9F3, 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, + 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, 0x6748, + 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, 0x674D, 0xCB45, + 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, 0x6751, 0xA7F8, 0x6753, + 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, 0x6757, 0xA841, 0x6759, 0xCB40, + 0x675A, 0xCB46, 0x675C, 0xA7F9, 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, + 0xA7F4, 0x6760, 0xA7FE, 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, + 0x676F, 0xAA4D, 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, + 0xAA48, 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, 0x677C, + 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, 0x6781, 0xCCE5, + 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, 0x6786, 0xCCDA, 0x6787, + 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, 0x678C, 0xCCDE, 0x678D, 0xCCDD, + 0x678E, 0xCCD5, 0x6790, 0xAA52, 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, + 0xAA55, 0x6794, 0xCCE8, 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, + 0x6799, 0xCCE2, 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, + 0xCCE0, 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, + 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, 0x67B7, + 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, 0x67BB, 0xCF41, + 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, 0x67C3, 0xCF61, 0x67C4, + 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, + 0x67CA, 0xCF60, 0x67CB, 0xCF63, 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, + 0xCF53, 0x67CF, 0xAC66, 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, + 0x67D3, 0xAC56, 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, + 0xAC63, 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, 0x67E5, + 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, 0x67EA, 0xCF62, + 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, 0x67EE, 0xCF4F, 0x67EF, + 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, 0x67F2, 0xCEFC, 0x67F3, 0xAC68, + 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, + 0xCF42, 0x67FA, 0xCF5E, 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, + 0x6813, 0xAEEA, 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, + 0xAEEB, 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, + 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, 0x6828, + 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, 0x682D, 0xD1E6, + 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, 0x6832, 0xD1DC, 0x6833, + 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, 0x6838, 0xAED6, 0x6839, 0xAEDA, + 0x683A, 0xD1F2, 0x683B, 0xD1DE, 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, + 0xAEE5, 0x6841, 0xAEEC, 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, + 0x6845, 0xAEE9, 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, + 0xD1DF, 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, 0x686B, + 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, 0x6871, 0xD5C8, + 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, 0x6876, 0xB1ED, 0x6877, + 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, 0x687B, 0xD5D1, 0x687C, 0xD5C3, + 0x687D, 0xD5D5, 0x687E, 0xD5C9, 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, + 0xB1E7, 0x6882, 0xB1FC, 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, + 0x6887, 0xD5B1, 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, + 0xD5D3, 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, + 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, 0x689B, + 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, 0x68A0, 0xD5CD, + 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, 0x68A4, 0xD5CF, 0x68A7, + 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, + 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, + 0xB1F1, 0x68B1, 0xB1EE, 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, + 0x68B5, 0xB1EB, 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, + 0xD9CE, 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, 0x68D3, + 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, 0x68D7, 0xB4C7, + 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, 0x68DD, 0xD9CF, 0x68DE, + 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, + 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, + 0xD9D6, 0x68EA, 0xD9B0, 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, + 0x68EF, 0xD9C2, 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, + 0xD9BA, 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, + 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, 0x68FC, + 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, 0x6906, 0xD9D4, + 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, 0x690B, 0xD9CA, 0x690C, + 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, 0x690F, 0xD9B2, 0x6910, 0xD9B9, + 0x6911, 0xD9C1, 0x6912, 0xB4D4, 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, + 0xD9D7, 0x6917, 0xD9CC, 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, + 0x6930, 0xB7A6, 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, + 0xDDD9, 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, 0x6941, + 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, 0x6948, 0xDDD7, + 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, 0x694C, 0xDDE9, 0x694E, + 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, 0x6952, 0xDDF1, 0x6953, 0xB7AC, + 0x6954, 0xB7A4, 0x6956, 0xD5B8, 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, + 0xDDD5, 0x695A, 0xB7A1, 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, + 0x695E, 0xB7AB, 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, + 0xB7B0, 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, + 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, 0x696E, + 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, 0x6974, 0xDDE8, + 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, 0x6978, 0xDDDF, 0x6979, + 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, 0x6982, 0xB7A7, 0x6983, 0xDEC6, + 0x6986, 0xB7AE, 0x698D, 0xE24A, 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, + 0xE246, 0x6993, 0xE258, 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, + 0x6997, 0xE25D, 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, + 0xBA5D, 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, 0x69A8, + 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, 0x69AC, 0xE244, + 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, 0x69B0, 0xE243, 0x69B1, + 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, 0x69B5, 0xE260, 0x69B6, 0xE1FD, + 0x69B7, 0xBA65, 0x69B9, 0xE253, 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, + 0xE250, 0x69BE, 0xE24C, 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, + 0x69C3, 0xBA6E, 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, + 0xE254, 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, + 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, 0x69D9, + 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, 0x69E6, 0xE5E1, + 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, 0x69EC, 0xE5D4, 0x69ED, + 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, + 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, + 0xE5E2, 0x69FC, 0xE5E4, 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, + 0x6A00, 0xE5CA, 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, + 0xBCD7, 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, 0x6A13, + 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, 0x6A17, 0xE5CC, + 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, 0x6A1D, 0xE5D7, 0x6A1E, + 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, + 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, + 0xE9C2, 0x6A34, 0xE9BE, 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, + 0x6A3A, 0xBEEC, 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, + 0xE9C4, 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, + 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, 0x6A4B, + 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, 0x6A50, 0xE9D1, + 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, 0x6A56, 0xE9D9, 0x6A58, + 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, + 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, + 0xBEF2, 0x6A64, 0xE9D0, 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, + 0x6A69, 0xE9D5, 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, + 0xE9D4, 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, 0x6A87, + 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, 0x6A8E, 0xECFE, + 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, 0x6A93, 0xECFD, 0x6A94, + 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, 0x6A97, 0xC0D0, 0x6A9A, 0xED47, + 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, + 0xC0D2, 0x6AA1, 0xECFA, 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, + 0x6AA5, 0xECF6, 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, + 0xEFE7, 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, + 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, 0x6ABA, + 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, 0x6AC3, 0xC264, + 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, 0x6ACB, 0xF251, 0x6ACC, + 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, 0x6AD0, 0xF254, 0x6AD1, 0xF24F, + 0x6AD3, 0xC372, 0x6AD9, 0xF250, 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, + 0xF253, 0x6ADD, 0xC370, 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, + 0x6AE1, 0xEFE0, 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, + 0xF455, 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, 0x6AF9, + 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, 0x6B00, 0xF5D2, + 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, 0x6B08, 0xF6E5, 0x6B09, + 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, + 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, + 0xF8F3, 0x6B18, 0xF8F1, 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, + 0x6B20, 0xA4ED, 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, + 0xCF64, 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, + 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, 0x6B37, + 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, 0x6B3B, 0xD9DB, + 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, 0x6B3F, 0xD9DC, 0x6B41, + 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, + 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, + 0xE265, 0x6B4C, 0xBA71, 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, + 0x6B51, 0xE5F0, 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, + 0xBEF9, 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, 0x6B64, + 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, 0x6B6A, 0xAC6E, + 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, 0x6B77, 0xBEFA, 0x6B78, + 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, + 0x6B80, 0xCCEA, 0x6B82, 0xCF65, 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, + 0xAC70, 0x6B88, 0xD1FC, 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, + 0x6B8D, 0xD5DC, 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, + 0xD9DE, 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, + 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, 0x6BA0, + 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, 0x6BA5, 0xE5F1, + 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, 0x6BAB, 0xE9E3, 0x6BAD, + 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, + 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, + 0xB1FE, 0x6BBC, 0xB4DF, 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, + 0x6BC3, 0xE269, 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, + 0xE9E5, 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, 0x6BD2, + 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, 0x6BD7, 0xAC73, + 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, 0x6BDE, 0xCCEC, 0x6BE0, + 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, + 0x6BE7, 0xD243, 0x6BE8, 0xD240, 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, + 0xB4E0, 0x6BF0, 0xD9E3, 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, + 0x6BF8, 0xDE42, 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, + 0xB7B7, 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, + 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, 0x6C06, + 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, 0x6C0C, 0xF25B, + 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, 0x6C11, 0xA5C1, 0x6C13, + 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, + 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, + 0xAC74, 0x6C20, 0xCF6B, 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, + 0x6C25, 0xD244, 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, + 0xD5DF, 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, 0x6C38, + 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, 0x6C40, 0xA5C5, + 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, 0x6C46, 0xC9F8, 0x6C4A, + 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, + 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, + 0xA6C2, 0x6C57, 0xA6BD, 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, + 0x6C5D, 0xA6BC, 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, + 0xA6C3, 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, + 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, 0x6C6F, + 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, 0x6C73, 0xCB5A, + 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, 0x6C7A, 0xA84D, 0x6C7B, + 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, 0x6C80, 0xCD45, 0x6C81, 0xA847, + 0x6C82, 0xA85E, 0x6C83, 0xA855, 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, + 0xA859, 0x6C87, 0xCB56, 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, + 0x6C8B, 0xCB4F, 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, + 0xCB50, 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, 0x6C9A, + 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, 0x6CAB, 0xAA6A, + 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, 0x6CB0, 0xCD4B, 0x6CB1, + 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, + 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, + 0xAA68, 0x6CBD, 0xAA66, 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, + 0x6CC1, 0xAA70, 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, + 0xAA73, 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, + 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, 0x6CD1, + 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, 0x6CD5, 0xAA6B, + 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, 0x6CDA, 0xCF75, 0x6CDB, + 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, + 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, + 0xCCF6, 0x6CE8, 0xAA60, 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, + 0x6CED, 0xCCFD, 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, + 0xAA74, 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, 0x6D07, + 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, 0x6D0B, 0xAC76, + 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, 0x6D0F, 0xCFA5, 0x6D10, + 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, 0x6D16, 0xD264, 0x6D17, 0xAC7E, + 0x6D18, 0xCFA2, 0x6D19, 0xCF78, 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, + 0xCF7D, 0x6D1E, 0xAC7D, 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, + 0x6D25, 0xAC7A, 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, + 0xAC78, 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, + 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, 0x6D33, + 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, 0x6D37, 0xCFA3, + 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, 0x6D3B, 0xACA1, 0x6D3C, + 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, + 0x6D41, 0xAC79, 0x6D42, 0xCF7E, 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, + 0xAF43, 0x6D5E, 0xD255, 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, + 0x6D62, 0xD24D, 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, + 0xAEFA, 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, 0x6D70, + 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, 0x6D77, 0xAEFC, + 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, 0x6D7B, 0xD266, 0x6D7C, + 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, 0x6D7F, 0xD253, 0x6D80, 0xD262, + 0x6D82, 0xD25C, 0x6D83, 0xD265, 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, + 0xD254, 0x6D87, 0xAEF9, 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, + 0x6D8B, 0xD260, 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, + 0xD269, 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, + 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, 0x6DAB, + 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, 0x6DB2, 0xB247, + 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, 0x6DB7, 0xD5E8, 0x6DB8, + 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, + 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, + 0xB264, 0x6DC5, 0xB258, 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, + 0x6DC9, 0xD5FE, 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, + 0xD645, 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, 0x6DD7, + 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, 0x6DDB, 0xD5F4, + 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, 0x6DDF, 0xD5EE, 0x6DE0, + 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, 0x6DE3, 0xD646, 0x6DE4, 0xB24A, + 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, + 0xB25F, 0x6DEB, 0xB25D, 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, + 0x6DEF, 0xD252, 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, + 0xB245, 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, + 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, 0x6DFD, + 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, 0x6E19, 0xB541, + 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, 0x6E1D, 0xB4FC, 0x6E1F, + 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, 0x6E22, 0xDA49, 0x6E23, 0xB4ED, + 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, + 0xDA44, 0x6E2B, 0xD9F1, 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, + 0x6E2F, 0xB4E4, 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, + 0xD9F7, 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, 0x6E3D, + 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, 0x6E41, 0xD9F3, + 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, 0x6E46, 0xD9E8, 0x6E47, + 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, + 0x6E4E, 0xB542, 0x6E51, 0xD9FA, 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, + 0xB4E6, 0x6E55, 0xDA51, 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, + 0x6E5B, 0xB4EF, 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, + 0xB547, 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, + 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, 0x6E68, + 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, 0x6E6F, 0xB4F6, + 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, 0x6E74, 0xD5E4, 0x6E77, + 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, 0x6E88, 0xD9EC, 0x6E89, 0xB540, + 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, + 0xDE5F, 0x6E93, 0xDE49, 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, + 0x6E98, 0xB7C2, 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, + 0xB7BE, 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, 0x6EA6, + 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, 0x6EAE, 0xDE69, + 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, 0x6EB2, 0xDE59, 0x6EB3, + 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, + 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, + 0xDE64, 0x6EC0, 0xDE47, 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, + 0x6EC4, 0xB7C9, 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, + 0xDE45, 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, + 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, 0x6ED1, + 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, 0x6ED5, 0xBCF0, + 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, 0x6EEB, 0xE2AA, 0x6EEC, + 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, + 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, + 0xBAB1, 0x6EF8, 0xE271, 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, + 0x6EFD, 0xE2AF, 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, + 0xBAAE, 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, 0x6F0D, + 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, 0x6F13, 0xBA76, + 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, 0x6F19, 0xE277, 0x6F1A, + 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, + 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, + 0xE5FA, 0x6F27, 0xE279, 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, + 0x6F2C, 0xBA7B, 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, + 0xE2A7, 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, + 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, 0x6F3A, + 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, 0x6F3F, 0xBCDF, + 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, 0x6F4E, 0xE276, 0x6F4F, + 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, 0x6F52, 0xE64D, 0x6F53, 0xE659, + 0x6F54, 0xBCE4, 0x6F55, 0xE64B, 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, + 0xE646, 0x6F5B, 0xBCE7, 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, + 0x6F60, 0xBCF2, 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, + 0xBCED, 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, 0x6F6F, + 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, 0x6F76, 0xE648, + 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, 0x6F7B, 0xE661, 0x6F7C, + 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, + 0x6F82, 0xE64A, 0x6F84, 0xBCE1, 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, + 0xE5FC, 0x6F88, 0xBAAB, 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, + 0x6F8D, 0xE640, 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, + 0xE651, 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, + 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, 0x6FA3, + 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, 0x6FA7, 0xBF43, + 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, 0x6FAB, 0xEA42, 0x6FAC, + 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, + 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, + 0xBF47, 0x6FB8, 0xE9FE, 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, + 0x6FBD, 0xE9F2, 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, + 0xBEFC, 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, 0x6FCC, + 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, 0x6FD4, 0xED51, + 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, 0x6FDC, 0xED53, 0x6FDD, + 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, + 0x6FE2, 0xED5A, 0x6FE3, 0xED52, 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, + 0xED55, 0x6FE8, 0xED5B, 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, + 0x6FED, 0xED54, 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, + 0xC0D8, 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, + 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, 0x7000, + 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, 0x7006, 0xC270, + 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, 0x700B, 0xC26E, 0x700C, + 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, 0x700F, 0xC273, 0x7011, 0xC272, + 0x7014, 0xEFF0, 0x7015, 0xC378, 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, + 0xC379, 0x7019, 0xF25C, 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, + 0x701D, 0xC377, 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, + 0xF262, 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, 0x702F, + 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, 0x7033, 0xF468, + 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, 0x7038, 0xF462, 0x7039, + 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, 0x703C, 0xF45B, 0x703E, 0xC469, + 0x703F, 0xF463, 0x7040, 0xF466, 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, + 0xF5D3, 0x7044, 0xF5D4, 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, + 0x7049, 0xF5D7, 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, + 0xF6EB, 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, + 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, 0x705F, + 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, 0x7063, 0xC657, + 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, 0x7068, 0xF9A2, 0x7069, + 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, 0x7070, 0xA6C7, 0x7071, 0xCA41, + 0x7074, 0xCB5E, 0x7076, 0xA85F, 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, + 0xA860, 0x707D, 0xA861, 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, + 0x7085, 0xCD52, 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, + 0xCD56, 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, 0x709F, + 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, 0x70AB, 0xACAF, + 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, 0x70AF, 0xACB3, 0x70B0, + 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, + 0x70B7, 0xCFAE, 0x70B8, 0xACB5, 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, + 0xD277, 0x70C6, 0xD278, 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, + 0x70CB, 0xD26E, 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, + 0xD26C, 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, + 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, 0x70DD, + 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, 0x70E2, 0xD270, + 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, 0x70F3, 0xD650, 0x70F4, + 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, 0x70F8, 0xD657, 0x70F9, 0xB269, + 0x70FA, 0xD648, 0x70FB, 0xDA5B, 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, + 0xD653, 0x7100, 0xD656, 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, + 0x7109, 0xB26A, 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, + 0xD649, 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, 0x711E, + 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, 0x7122, 0xDA60, + 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, 0x7128, 0xDA63, 0x712E, + 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, 0x7131, 0xDA5D, 0x7132, 0xDA61, + 0x7136, 0xB54D, 0x713A, 0xDA64, 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, + 0xDE79, 0x7144, 0xDEA1, 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, + 0x714B, 0xDE7A, 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, + 0xDE7D, 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, + 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, 0x715D, + 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, 0x7161, 0xDE76, + 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, 0x7165, 0xB7D8, 0x7166, + 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, 0x7169, 0xB7D0, 0x716A, 0xDE75, + 0x716C, 0xB7D5, 0x716E, 0xB54E, 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, + 0xDE74, 0x717B, 0xE2C1, 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, + 0x7182, 0xE2BF, 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, + 0xE2BA, 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, 0x719A, + 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, 0x719E, 0xE66C, + 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, 0x71A4, 0xE66D, 0x71A5, + 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, 0x71A9, 0xE668, 0x71AA, 0xE66F, + 0x71AC, 0xBCF5, 0x71AF, 0xE663, 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, + 0xE662, 0x71B3, 0xE672, 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, + 0x71BC, 0xEA55, 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, + 0xEA4C, 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, + 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, 0x71C9, + 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, 0x71CF, 0xEA52, + 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, 0x71D5, 0xBF50, 0x71D6, + 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, 0x71DA, 0xEA57, 0x71DB, 0xEA58, + 0x71DC, 0xBF54, 0x71DF, 0xC0E7, 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, + 0xED62, 0x71E4, 0xED60, 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, + 0x71E8, 0xED5E, 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, + 0xED61, 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, 0x71FE, + 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, 0x7203, 0xEFFC, + 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, 0x720A, 0xF26A, 0x720C, + 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, 0x7213, 0xF46A, 0x7214, 0xF46B, + 0x7219, 0xF5DC, 0x721A, 0xF5DB, 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, + 0xF6EC, 0x721F, 0xF6ED, 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, + 0x7227, 0xF9BC, 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, + 0xAAA6, 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, + 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, 0x723D, + 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, 0x7242, 0xD27D, + 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, 0x7248, 0xAAA9, 0x7249, + 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, 0x724C, 0xB550, 0x724F, 0xDEA4, + 0x7252, 0xB7DE, 0x7253, 0xE2C6, 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, + 0xA4FA, 0x725A, 0xDA67, 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, + 0x725F, 0xA6C8, 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, + 0xCB60, 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, 0x7273, + 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, 0x7278, 0xD27E, + 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, 0x727D, 0xB26F, 0x727E, + 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, 0x7281, 0xB270, 0x7284, 0xB551, + 0x7285, 0xDA6B, 0x7286, 0xDA6A, 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, + 0xDA6C, 0x728C, 0xDEA6, 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, + 0x7291, 0xDEA7, 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, + 0xBABA, 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, + 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, 0x72A3, + 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, 0x72A7, 0xC4EB, + 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, 0x72AC, 0xA4FC, 0x72AE, + 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, 0x72B4, 0xCA43, 0x72B5, 0xCA44, + 0x72BA, 0xCB66, 0x72BD, 0xCB62, 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, + 0xCB65, 0x72C2, 0xA867, 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, + 0x72C6, 0xCB64, 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, + 0xCD64, 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, 0x72D9, + 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, 0x72E0, 0xACBD, + 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, 0x72E6, 0xCFC4, 0x72E8, + 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, + 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, + 0xAF55, 0x72FA, 0xD2A4, 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, + 0x72FE, 0xD2A6, 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, + 0xD662, 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, + 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, 0x7316, + 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, 0x731B, 0xB272, + 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, 0x7322, 0xDA70, 0x7323, + 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, 0x7327, 0xDA73, 0x7329, 0xB556, + 0x732D, 0xDA75, 0x7330, 0xDA6F, 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, + 0xDA72, 0x7334, 0xB555, 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, + 0x733A, 0xDEAD, 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, + 0xB7E1, 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, 0x734D, + 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, 0x7352, 0xE676, + 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, 0x735A, 0xE67D, 0x735B, + 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, 0x735F, 0xE678, 0x7360, 0xE679, + 0x7361, 0xE67C, 0x7362, 0xE6A1, 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, + 0xEA5D, 0x7368, 0xBF57, 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, + 0x736C, 0xEA5E, 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, + 0xC0F2, 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, + 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, 0x737D, + 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, 0x7381, 0xF7E8, + 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, 0x7385, 0xCFC6, 0x7386, + 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, 0x7389, 0xA5C9, 0x738A, 0xC9A7, + 0x738B, 0xA4FD, 0x738E, 0xCA45, 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, + 0xCB6B, 0x7395, 0xCB68, 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, + 0x739F, 0xAAB3, 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, + 0xCD66, 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, 0x73B3, + 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, 0x73B7, 0xACBF, + 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, 0x73BC, 0xD2AF, 0x73BE, + 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, + 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, + 0xACC0, 0x73CB, 0xCFD6, 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, + 0x73D3, 0xD2AB, 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, + 0xD2BA, 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, + 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, 0x73E5, + 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, 0x73EA, 0xAF5E, + 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, 0x73F4, 0xD678, 0x73F5, + 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, 0x73FA, 0xD673, 0x73FC, 0xD674, + 0x73FD, 0xD670, 0x73FE, 0xB27B, 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, + 0xD66F, 0x7403, 0xB279, 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, + 0x7407, 0xD671, 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, + 0xD677, 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, 0x7422, + 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, 0x7426, 0xB561, + 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, 0x742B, 0xDA7D, 0x742C, + 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, 0x742F, 0xB55F, 0x7430, 0xDA7C, + 0x7431, 0xDAA4, 0x7432, 0xDAAA, 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, + 0xB55C, 0x7436, 0xB55D, 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, + 0x7441, 0xB7E8, 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, + 0xDEB2, 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, + 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, 0x7455, + 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, 0x745B, 0xB7EB, + 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, 0x7462, 0xE2CE, 0x7463, + 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, 0x7469, 0xBCFC, 0x746A, 0xBABF, + 0x746D, 0xBAC1, 0x746E, 0xE2D4, 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, + 0xE2D0, 0x7472, 0xE2D2, 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, + 0x747C, 0xE6AA, 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, + 0xBD41, 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, 0x748B, + 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, 0x7495, 0xEA67, + 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, 0x749C, 0xBF58, 0x749E, + 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, 0x74A1, 0xEA68, 0x74A3, 0xBF59, + 0x74A5, 0xED6D, 0x74A6, 0xC0F5, 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, + 0xC0F3, 0x74AA, 0xED6A, 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, + 0x74B0, 0xC0F4, 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, + 0xF045, 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, + 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, 0x74C1, + 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, 0x74CA, 0xC3A3, + 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, 0x74D5, 0xF6F1, 0x74D6, + 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, + 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, + 0xD2BD, 0x74E0, 0xB27D, 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, + 0x74E4, 0xC57B, 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, + 0xA260, 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, 0x74FE, + 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, 0x7503, 0xE2D7, + 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, 0x750B, 0xEA69, 0x750C, + 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, 0x7510, 0xED6F, 0x7511, 0xED70, + 0x7512, 0xED71, 0x7513, 0xF049, 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, + 0xF277, 0x7517, 0xF5DE, 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, + 0x751D, 0xDEC3, 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, + 0xB563, 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, + 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, 0x752F, + 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, 0x7533, 0xA5D3, + 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, 0x753A, 0xCB6D, 0x753D, + 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, 0x7540, 0xCD71, 0x7547, 0xCFDA, + 0x7548, 0xCFDB, 0x754B, 0xACCB, 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, + 0xACC8, 0x7554, 0xAF60, 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, + 0x755C, 0xAF62, 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, + 0xD67B, 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, 0x7576, + 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, 0x757D, 0xE2D8, + 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, 0x7584, 0xED73, 0x7586, + 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, 0x758B, 0xA5D4, 0x758C, 0xCD73, + 0x758F, 0xB2A8, 0x7590, 0xE2D9, 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, + 0xCB70, 0x7598, 0xCD74, 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, + 0x75A2, 0xACCF, 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, + 0xCFDC, 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, + 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, 0x75B9, + 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, 0x75BD, 0xAF6A, + 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, 0x75C1, 0xD2C4, 0x75C2, + 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, 0x75C7, 0xAF67, 0x75CA, 0xB2AC, + 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, + 0xD67E, 0x75D0, 0xD6A4, 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, + 0x75D5, 0xB2AA, 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, + 0xDAB0, 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, 0x75E4, + 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, 0x75EF, 0xDEC7, + 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, 0x75F3, 0xB7F7, 0x75F4, + 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, 0x75F7, 0xDECA, 0x75F8, 0xDECE, + 0x75F9, 0xDECD, 0x75FA, 0xB7F4, 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, + 0xDED4, 0x75FE, 0xDECB, 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, + 0x7603, 0xDEC9, 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, + 0xBAC6, 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, + 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, 0x7616, + 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, 0x761C, 0xE6B3, + 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, 0x7620, 0xBD43, 0x7621, + 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, 0x7624, 0xBD46, 0x7625, 0xE6AF, + 0x7626, 0xBD47, 0x7627, 0xBAC4, 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, + 0xEA6C, 0x762F, 0xEA6B, 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, + 0x7633, 0xEA6F, 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, + 0xBF62, 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, 0x764C, + 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, 0x7656, 0xC27D, + 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, 0x765A, 0xF050, 0x765C, + 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, 0x7661, 0xC3A8, 0x7662, 0xC46F, + 0x7664, 0xF04B, 0x7665, 0xC470, 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, + 0xC57E, 0x766D, 0xF6F4, 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, + 0x7672, 0xC5F6, 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, + 0xB56E, 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, + 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, 0x7687, + 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, 0x768B, 0xAF6F, + 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, 0x7693, 0xB571, 0x7695, + 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, 0x769A, 0xBD4A, 0x769B, 0xE6BB, + 0x769C, 0xE6B8, 0x769D, 0xE6B9, 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, + 0xF051, 0x76AA, 0xF471, 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, + 0x76AF, 0xCD75, 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, + 0xE2E1, 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, 0x76C5, + 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, 0x76CA, 0xAF71, + 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, 0x76D3, 0xD6A7, 0x76D4, + 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, 0x76DC, 0xB573, 0x76DD, 0xDED7, + 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, + 0xBD4C, 0x76E5, 0xBF64, 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, + 0x76EA, 0xC0FA, 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, + 0xA86E, 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, + 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, 0x76F9, + 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, 0x76FE, 0xACDE, + 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, 0x7705, 0xCFE3, 0x7707, + 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, 0x770A, 0xCFE4, 0x770B, 0xACDD, + 0x7710, 0xD2CF, 0x7711, 0xD2D3, 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, + 0xD2D4, 0x7719, 0xD2D5, 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, + 0x771F, 0xAF75, 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, + 0xD6B0, 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, 0x7734, + 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, 0x7738, 0xB2B6, + 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, 0x773C, 0xB2B4, 0x773D, + 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, 0x7745, 0xDABE, 0x7746, 0xDABA, + 0x7747, 0xDABB, 0x774A, 0xDABF, 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, + 0xDABD, 0x774E, 0xDAC0, 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, + 0x7755, 0xDED8, 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, + 0xB7FA, 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, + 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, 0x7766, + 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, 0x776A, 0xB841, + 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, 0x776E, 0xE2E6, 0x776F, + 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, 0x777D, 0xBACC, 0x777E, 0xE2E9, + 0x777F, 0xBACD, 0x7780, 0xE2E7, 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, + 0xE2EA, 0x7784, 0xBACB, 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, + 0x7789, 0xE6BE, 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, + 0xBD4D, 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, 0x779D, + 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, 0x77A1, 0xEA78, + 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, 0x77A7, 0xC140, 0x77A8, + 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, 0x77AC, 0xC0FE, 0x77AD, 0xC141, + 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, + 0xEDA1, 0x77B5, 0xED7A, 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, + 0x77BB, 0xC2A4, 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, + 0xF054, 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, + 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, 0x77D0, + 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, 0x77D7, 0xC5F7, + 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, 0x77DB, 0xA5D9, 0x77DC, + 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, 0x77E2, 0xA5DA, 0x77E3, 0xA86F, + 0x77E5, 0xAABE, 0x77E7, 0xCFE8, 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, + 0xDAC4, 0x77ED, 0xB575, 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, + 0x77F1, 0xF27C, 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, + 0xCD7A, 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, 0x7806, + 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, 0x780E, 0xCFF0, + 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, 0x7812, 0xCFEC, 0x7813, + 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, 0x781F, 0xAFA4, 0x7820, 0xAFA3, + 0x7821, 0xD2E1, 0x7822, 0xD2DB, 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, + 0xD6B9, 0x7827, 0xAF7A, 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, + 0x782B, 0xD2E0, 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, + 0xD2DD, 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, + 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, 0x7843, + 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, 0x784A, 0xD6B7, + 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, 0x7850, 0xD6BB, 0x7852, + 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, 0x785E, 0xDAD0, 0x7860, 0xDAC5, + 0x7862, 0xDAD1, 0x7864, 0xDAC6, 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, + 0xDACE, 0x786A, 0xDACB, 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, + 0x786E, 0xDACC, 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, + 0xDEEE, 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, 0x7885, + 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, 0x788C, 0xB84C, + 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, 0x7893, 0xB850, 0x7894, + 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, 0x7897, 0xB84A, 0x7898, 0xB84B, + 0x7899, 0xDEEF, 0x789A, 0xDEE5, 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, + 0xE2F4, 0x78A1, 0xDEEC, 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, + 0x78A5, 0xE2F3, 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, + 0xE2EC, 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, + 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, 0x78BB, + 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, 0x78C3, 0xE6C8, + 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, 0x78C9, 0xE6CA, 0x78CA, + 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, + 0x78CF, 0xE6C2, 0x78D0, 0xBD59, 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, + 0xBD57, 0x78DA, 0xBF6A, 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, + 0x78DF, 0xEAAC, 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, + 0xEAA7, 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, 0x78F2, + 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, 0x78F9, 0xEDAC, + 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, 0x78FD, 0xEDA6, 0x78FE, + 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, 0x7902, 0xEDA7, 0x7904, 0xEDAE, + 0x7905, 0xEDAB, 0x7909, 0xF05A, 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, + 0xF05B, 0x7911, 0xF05D, 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, + 0x7917, 0xF2A3, 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, + 0xF27D, 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, + 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, 0x7929, + 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, 0x792D, 0xF5E1, + 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, 0x7938, 0xF8B5, 0x7939, + 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, 0x793E, 0xAAC0, 0x793F, 0xCDA3, + 0x7940, 0xAAC1, 0x7941, 0xAAC2, 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, + 0xCFF7, 0x7946, 0xACE6, 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, + 0x794A, 0xCFF4, 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, + 0xAFA7, 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, 0x795B, + 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, 0x795F, 0xAFA9, + 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, 0x7964, 0xD6BC, 0x7965, + 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, 0x7969, 0xD6BE, 0x796A, 0xD6BF, + 0x796B, 0xD6C1, 0x796D, 0xB2BD, 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, + 0xDAD3, 0x7974, 0xDAD2, 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, + 0x797D, 0xDEF5, 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, + 0xE341, 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, + 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, 0x7994, + 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, 0x7998, 0xE2F8, + 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, 0x79A0, 0xE6CD, 0x79A1, + 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, 0x79A6, 0xBF6D, 0x79A7, 0xC148, + 0x79A8, 0xEDB0, 0x79AA, 0xC149, 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, + 0xF05E, 0x79AE, 0xC2A7, 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, + 0x79B3, 0xC5A1, 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, + 0xC9A8, 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, 0x79C5, + 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, 0x79CD, 0xCFFA, + 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, 0x79D2, 0xACED, 0x79D5, + 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, + 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, + 0xAFAF, 0x79E6, 0xAFB3, 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, + 0x79EB, 0xD2ED, 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, + 0xD6C6, 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, + 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, 0x7A05, + 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, 0x7A0C, 0xDAD9, + 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, 0x7A12, 0xDEFA, 0x7A13, + 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, + 0x7A19, 0xDEF9, 0x7A1A, 0xB858, 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, + 0xB85C, 0x7A1F, 0xB85B, 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, + 0x7A28, 0xE348, 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, + 0xE346, 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, 0x7A44, + 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, 0x7A4A, 0xE345, + 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, 0x7A4E, 0xBF6F, 0x7A54, + 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, + 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, + 0xC2A8, 0x7A62, 0xC2A9, 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, + 0x7A6B, 0xC3AC, 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, + 0xF6F8, 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, + 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, 0x7A7E, + 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, 0x7A84, 0xAFB6, + 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, 0x7A88, 0xAFB7, 0x7A89, + 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, + 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, + 0xB5A2, 0x7A97, 0xB5A1, 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, + 0x7A9F, 0xB85D, 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, + 0xE34A, 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, 0x7AB3, + 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, 0x7AB7, 0xEAB6, + 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, 0x7ABF, 0xC14B, 0x7AC0, + 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, + 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, + 0xAFB8, 0x7ADF, 0xB3BA, 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, + 0x7AE5, 0xB5A3, 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, + 0xE34D, 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, + 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, 0x7B00, + 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, 0x7B06, 0xAFB9, + 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, 0x7B0E, 0xD346, 0x7B0F, + 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, 0x7B12, 0xD348, 0x7B13, 0xD341, + 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, + 0xD6D5, 0x7B1E, 0xB2C7, 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, + 0x7B24, 0xD6D1, 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, + 0xD6D4, 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, 0x7B33, + 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, 0x7B3B, 0xDADF, + 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, 0x7B46, 0xB5A7, 0x7B47, + 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, + 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, + 0xB5A8, 0x7B51, 0xB5AE, 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, + 0x7B58, 0xDAE5, 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, + 0xDF47, 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, + 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, 0x7B72, + 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, 0x7B76, 0xDF52, + 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, 0x7B84, 0xBAE8, 0x7B85, + 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, + 0x7B8C, 0xE355, 0x7B8D, 0xE354, 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, + 0xE352, 0x7B91, 0xE351, 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, + 0x7B97, 0xBAE2, 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, + 0xE34F, 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, 0x7BB4, + 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, 0x7BB9, 0xE6DC, + 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, 0x7BC4, 0xBD64, 0x7BC6, + 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, + 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, + 0xEAC5, 0x7BD9, 0xBF74, 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, + 0x7BDD, 0xEABA, 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, + 0xBF79, 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, + 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, 0x7BEA, + 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, 0x7BF2, 0xEDBC, + 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, 0x7BF8, 0xEDC8, 0x7BF9, + 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, + 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, + 0xEDBA, 0x7C06, 0xEDCA, 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, + 0x7C0B, 0xEDC2, 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, + 0xEDBB, 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, 0x7C21, + 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, 0x7C26, 0xF068, + 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, 0x7C2A, 0xC2AF, 0x7C2B, + 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, 0x7C30, 0xF06C, 0x7C33, 0xF2A8, + 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, + 0xF2A9, 0x7C3D, 0xC3B1, 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, + 0x7C43, 0xC478, 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, + 0xF4A6, 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, + 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, 0x7C5A, + 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, 0x7C60, 0xC5A2, + 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, 0x7C66, 0xF7ED, 0x7C67, + 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, + 0x7C6E, 0xC659, 0x7C6F, 0xF96D, 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, + 0xCDA8, 0x7C78, 0xD045, 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, + 0x7C7F, 0xD047, 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, + 0xD34F, 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, 0x7C95, + 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, 0x7C9E, 0xDAE8, + 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, 0x7CA3, 0xD6E1, 0x7CA5, + 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, 0x7CAF, 0xDF56, 0x7CB1, 0xB864, + 0x7CB2, 0xDF54, 0x7CB3, 0xB865, 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, + 0xBAE9, 0x7CBA, 0xE361, 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, + 0x7CBE, 0xBAEB, 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, + 0xBD6B, 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, + 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, 0x7CD6, + 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, 0x7CDD, 0xC158, + 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, 0x7CE2, 0xC155, 0x7CE7, + 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, + 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, + 0xF740, 0x7CF6, 0xF8FD, 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, + 0x7CFD, 0xCDA9, 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, + 0xACF4, 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, 0x7D0B, + 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, 0x7D0F, 0xD359, + 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, 0x7D13, 0xD356, 0x7D14, + 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, 0x7D17, 0xAFBD, 0x7D18, 0xD354, + 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, + 0xD351, 0x7D1E, 0xD350, 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, + 0x7D22, 0xAFC1, 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, + 0xD6E8, 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, + 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, 0x7D38, + 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, 0x7D3C, 0xB2D1, + 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, 0x7D40, 0xB2D2, 0x7D41, + 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, + 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, + 0xDAF2, 0x7D50, 0xB5B2, 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, + 0x7D54, 0xDAF7, 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, + 0xB86C, 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, 0x7D68, + 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, 0x7D6D, 0xDAF3, + 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, 0x7D71, 0xB2CE, 0x7D72, + 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, + 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, + 0xB86A, 0x7D83, 0xDF60, 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, + 0x7D88, 0xDF57, 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, + 0xB86B, 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, + 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, 0x7D9F, + 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, 0x7DA3, 0xE365, + 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, 0x7DAA, 0xE366, 0x7DAC, + 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, 0x7DAF, 0xE370, 0x7DB0, 0xBAED, + 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, + 0xE363, 0x7DB8, 0xBAFA, 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, + 0x7DBC, 0xE373, 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, + 0xE368, 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, 0x7DCB, + 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, 0x7DD7, 0xE6E7, + 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, 0x7DDB, 0xE6E4, 0x7DDD, + 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, + 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, + 0xBD77, 0x7DEA, 0xE6E5, 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, + 0x7DF0, 0xE6EE, 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, + 0xBD6D, 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, + 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, 0x7E0A, + 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, 0x7E0E, 0xEAD3, + 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, 0x7E12, 0xEACC, 0x7E13, + 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, 0x7E16, 0xEADA, 0x7E17, 0xEACE, + 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, + 0xBFA5, 0x7E1F, 0xEAD0, 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, + 0x7E23, 0xBFA4, 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, + 0xEDD6, 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, 0x7E34, + 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, 0x7E38, 0xEDD5, + 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, 0x7E3C, 0xEDD1, 0x7E3D, + 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, 0x7E40, 0xEDD8, 0x7E41, 0xC163, + 0x7E42, 0xEDD2, 0x7E43, 0xC15E, 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, + 0xC15B, 0x7E47, 0xEDD9, 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, + 0x7E50, 0xF06E, 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, + 0xC2B4, 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, + 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, 0x7E5F, + 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, 0x7E63, 0xF070, + 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, 0x7E6B, 0xC3B4, 0x7E6D, + 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, + 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, + 0xF2B1, 0x7E79, 0xC3B6, 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, + 0x7E7D, 0xC47D, 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, + 0xC4A1, 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, 0x7E91, + 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, 0x7E96, 0xC5D6, + 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, 0x7E9A, 0xF8FE, 0x7E9B, + 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, 0x7F38, 0xACFB, 0x7F39, 0xD26F, + 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, + 0xEADF, 0x7F44, 0xC16A, 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, + 0x7F4B, 0xF2B9, 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, + 0xC5F8, 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, + 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, 0x7F5F, + 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, 0x7F65, 0xDAFE, + 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, 0x7F69, 0xB86E, 0x7F6A, + 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, + 0x7F70, 0xBB40, 0x7F72, 0xB870, 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, + 0xE6F1, 0x7F77, 0xBD7D, 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, + 0x7F7C, 0xEAE1, 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, + 0xF2BB, 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, 0x7F8D, + 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, 0x7F94, 0xAFCC, + 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, 0x7F9B, 0xD6F5, 0x7F9C, + 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, + 0x7FA2, 0xDB41, 0x7FA4, 0xB873, 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, + 0xDF6E, 0x7FA8, 0xB872, 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, + 0x7FAF, 0xBD7E, 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, + 0xF079, 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, + 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, 0x7FBD, + 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, 0x7FC1, 0xAFCE, + 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, 0x7FC7, 0xD6FB, 0x7FC9, + 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, + 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, + 0xB2DF, 0x7FD4, 0xB5BE, 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, + 0x7FDC, 0xDF70, 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, + 0xBB42, 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, 0x7FEC, + 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, 0x7FF0, 0xBFAB, + 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, 0x7FF4, 0xEDE5, 0x7FF5, + 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, + 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, + 0xC4A3, 0x8001, 0xA6D1, 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, + 0x8006, 0xAFCF, 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, + 0xAD41, 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, + 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, 0x8017, + 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, 0x801C, 0xB2E0, + 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, 0x8024, 0xE3A1, 0x8026, + 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, 0x802A, 0xEAE5, 0x802C, 0xEDE7, + 0x8030, 0xF5EF, 0x8033, 0xA6D5, 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, + 0xAD43, 0x8037, 0xD055, 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, + 0x803F, 0xAFD5, 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, + 0xD744, 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, 0x805C, + 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, 0x8067, 0xE6FC, + 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, 0x8071, 0xC16D, 0x8072, + 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, 0x8076, 0xC2BF, 0x8077, 0xC2BE, + 0x8078, 0xF2C0, 0x8079, 0xF4B2, 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, + 0xA6D6, 0x8082, 0xD1FB, 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, + 0x8087, 0xBB46, 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, + 0xA6D9, 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, + 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, 0x809A, + 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, 0x80A1, 0xAAD1, + 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, 0x80A9, 0xAAD3, 0x80AA, + 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, + 0x80B1, 0xAAD0, 0x80B2, 0xA87C, 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, + 0xCDAE, 0x80BA, 0xAACD, 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, + 0x80C5, 0xD05D, 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, + 0xD061, 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, 0x80D6, + 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, 0x80DA, 0xAD46, + 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, 0x80DE, 0xAD4D, 0x80E0, + 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, 0x80E4, 0xAD4E, 0x80E5, 0xAD45, + 0x80E6, 0xD066, 0x80ED, 0xAFDA, 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, + 0xAFD6, 0x80F2, 0xD36A, 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, + 0x80F8, 0xAFDD, 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, + 0xAFE2, 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, + 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, 0x810A, + 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, 0x8119, 0xD747, + 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, 0x811F, 0xD74A, 0x8121, + 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, 0x8124, 0xB2E9, 0x8125, 0xD746, + 0x8127, 0xD74F, 0x8129, 0xB2E7, 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, + 0xD749, 0x812F, 0xB2E3, 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, + 0x813D, 0xDB4F, 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, + 0xB5C9, 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, 0x8151, + 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, 0x8155, 0xB5C3, + 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, 0x8160, 0xDF73, 0x8161, + 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, 0x8165, 0xB87B, 0x8166, 0xB8A3, + 0x8167, 0xDF7D, 0x8169, 0xDF76, 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, + 0xDF7E, 0x8170, 0xB879, 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, + 0x8174, 0xB5CD, 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, + 0xB8A1, 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, + 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, 0x8189, + 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, 0x818D, 0xE3A8, + 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, 0x8198, 0xBDA8, 0x8199, + 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, 0x819C, 0xBDA4, 0x819D, 0xBDA5, + 0x819E, 0xE740, 0x819F, 0xE6FE, 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, + 0xE6FD, 0x81A6, 0xEAE9, 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, + 0x81AB, 0xEAED, 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, + 0xEAE8, 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, 0x81BC, + 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, 0x81C0, 0xC176, + 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, 0x81C5, 0xEDEC, 0x81C6, + 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, + 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, + 0xF07E, 0x81D5, 0xF2C2, 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, + 0x81DA, 0xC4A4, 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, + 0xC5A6, 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, + 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, 0x81E9, + 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, 0x81EE, 0xDB53, + 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, 0x81F7, 0xDB54, 0x81F8, + 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, + 0x81FE, 0xAAD8, 0x81FF, 0xD068, 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, + 0xB2EA, 0x8204, 0xDB57, 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, + 0x8209, 0xC17C, 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, + 0xAAD9, 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, 0x821D, + 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, 0x8221, 0xD069, + 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, 0x822A, 0xAFE8, 0x822B, + 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, 0x8232, 0xD757, 0x8233, 0xD754, + 0x8234, 0xD756, 0x8235, 0xB2EB, 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, + 0xD753, 0x8239, 0xB2EE, 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, + 0x823F, 0xDB5A, 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, + 0xDFA8, 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, + 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, 0x8253, + 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, 0x8258, 0xBFB4, + 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, 0x825C, 0xEDF2, 0x825E, + 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, 0x8263, 0xF2C5, 0x8264, 0xF2C3, + 0x8266, 0xC4A5, 0x8268, 0xF4B6, 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, + 0xF7EF, 0x826D, 0xF8BB, 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, + 0x8272, 0xA6E2, 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, + 0xCA4A, 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, 0x828A, + 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, 0x828F, 0xCB7A, + 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, 0x8293, 0xCB7E, 0x8294, + 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, 0x829A, 0xCDB5, 0x829B, 0xCDB7, + 0x829D, 0xAADB, 0x829E, 0xCDBC, 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, + 0xCDC0, 0x82A2, 0xCDC6, 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, + 0x82A7, 0xCDB9, 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, + 0xAAE2, 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, + 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, 0x82B6, + 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, 0x82BA, 0xCDBD, + 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, 0x82BE, 0xAAE8, 0x82C0, + 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, 0x82D1, 0xAD62, 0x82D2, 0xAD5C, + 0x82D3, 0xAD64, 0x82D4, 0xAD61, 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, + 0xAD5D, 0x82D9, 0xD06B, 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, + 0x82DF, 0xAD65, 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, + 0xD0A1, 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, 0x82EF, + 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, 0x82F3, 0xD0A4, + 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, 0x82F9, 0xD06D, 0x82FA, + 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, 0x8300, 0xD070, 0x8301, 0xAD5F, + 0x8302, 0xAD5A, 0x8303, 0xAD53, 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, + 0xAD67, 0x8307, 0xD06E, 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, + 0x830D, 0xCE41, 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, + 0xD3A3, 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, + 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, 0x8328, + 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, 0x832C, 0xD3B3, + 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, 0x8332, 0xAFF7, 0x8333, + 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, 0x8336, 0xAFF9, 0x8337, 0xD3AB, + 0x8338, 0xAFF1, 0x8339, 0xAFF8, 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, + 0xD3A6, 0x833F, 0xD37A, 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, + 0x8343, 0xAFFE, 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, + 0xD3B6, 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, 0x8351, + 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, 0x8356, 0xD379, + 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, 0x8376, 0xD779, 0x8377, + 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, 0x837B, 0xB2FD, 0x837C, 0xB2FE, + 0x837D, 0xD768, 0x837E, 0xD76F, 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, + 0xD769, 0x8386, 0xB340, 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, + 0x838A, 0xB2F8, 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, + 0xB2EF, 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, + 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, 0x8398, + 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, 0x839D, 0xD76B, + 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, 0x83A3, 0xD75A, 0x83A4, + 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, 0x83A7, 0xB341, 0x83A8, 0xD75B, + 0x83A9, 0xD767, 0x83AA, 0xD76D, 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, + 0xD771, 0x83B0, 0xD774, 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, + 0x83C1, 0xB5D7, 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, + 0xB5D5, 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, 0x83CF, + 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, 0x83D6, 0xDB75, + 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, 0x83DB, 0xDBAF, 0x83DC, + 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, + 0x83E1, 0xDB72, 0x83E2, 0xDBAD, 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, + 0xDB6F, 0x83E7, 0xDB63, 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, + 0x83EB, 0xDB6A, 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, + 0xB5DD, 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, + 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, 0x83FA, + 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, 0x83FE, 0xDBB0, + 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, 0x8404, 0xB5E5, 0x8406, + 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, 0x840A, 0xB5DC, 0x840B, 0xB5D6, + 0x840C, 0xB5DE, 0x840D, 0xB5D3, 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, + 0xDB67, 0x8411, 0xDB7B, 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, + 0x8423, 0xDB5F, 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, + 0xDFCC, 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, 0x8437, + 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, 0x843B, 0xDFD6, + 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, 0x8440, 0xDFB2, 0x8442, + 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, 0x8445, 0xDFC6, 0x8446, 0xB8B6, + 0x8447, 0xDFD7, 0x8449, 0xB8AD, 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, + 0xDFB6, 0x844E, 0xDFD0, 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, + 0x8454, 0xDFDF, 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, + 0xDFB8, 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, + 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, 0x8466, + 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, 0x846B, 0xB8AC, + 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, 0x846F, 0xDFD3, 0x8470, + 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, 0x8475, 0xB8AA, 0x8476, 0xDFAC, + 0x8477, 0xB8A7, 0x8478, 0xDFC4, 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, + 0xDFB7, 0x847E, 0xDFDB, 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, + 0x848E, 0xDFD5, 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, + 0xE3C2, 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, 0x849F, + 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, 0x84A4, 0xE3AD, + 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, 0x84AA, 0xE3BA, 0x84AB, + 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, + 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, + 0xBB5D, 0x84B9, 0xE3B6, 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, + 0x84BF, 0xBB55, 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, + 0xBB57, 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, + 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, 0x84CE, + 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, 0x84D2, 0xE3D0, + 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, 0x84D7, 0xE3CE, 0x84DB, + 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, 0x84E9, 0xE767, 0x84EA, 0xE766, + 0x84EB, 0xE762, 0x84EC, 0xBDB4, 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, + 0xE775, 0x84F1, 0xDFA9, 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, + 0x84F6, 0xE770, 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, + 0xE758, 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, 0x8508, + 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, 0x850C, 0xE75C, + 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, 0x8511, 0xBDB0, 0x8512, + 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, 0x8515, 0xE760, 0x8516, 0xE768, + 0x8517, 0xBDA9, 0x8518, 0xE778, 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, + 0xE757, 0x851D, 0xE76B, 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, + 0x8521, 0xBDB2, 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, + 0xE772, 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, + 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, 0x852F, + 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, 0x853D, 0xBDAA, + 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, 0x8543, 0xBFBB, 0x8544, + 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, 0x8547, 0xEB47, 0x8548, 0xBFB8, + 0x8549, 0xBFBC, 0x854A, 0xBFB6, 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, + 0xEB46, 0x8553, 0xEAFC, 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, + 0x8557, 0xEE46, 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, + 0xEB54, 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, 0x8567, + 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, 0x856B, 0xEAFA, + 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, 0x8571, 0xEB4B, 0x8575, + 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, 0x8578, 0xEE45, 0x8579, 0xEE52, + 0x857A, 0xEE44, 0x857B, 0xEDFB, 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, + 0xEDF4, 0x8581, 0xEE4D, 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, + 0x8585, 0xEE51, 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, + 0xEE42, 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, + 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, 0x8594, + 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, 0x8599, 0xEE4B, + 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, 0x859D, 0xEE4C, 0x859E, + 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, 0x85A1, 0xEE43, 0x85A2, 0xEE4E, + 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, + 0xC1A9, 0x85A9, 0xC2C4, 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, + 0x85B1, 0xF0B3, 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, + 0xF0B4, 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, 0x85C2, + 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, 0x85C6, 0xF0A5, + 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, 0x85CB, 0xF0AF, 0x85CD, + 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, + 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, + 0xF2C9, 0x85DA, 0xF2CC, 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, + 0x85DF, 0xF2D2, 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, + 0xC3C3, 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, + 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, 0x85EF, + 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, 0x85F6, 0xF4BE, + 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, 0x85FA, 0xC4A9, 0x85FB, + 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, 0x85FF, 0xF4B9, 0x8600, 0xF4BD, + 0x8601, 0xF4BA, 0x8604, 0xF4BF, 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, + 0xC4AC, 0x8609, 0xF4C0, 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, + 0x8611, 0xC4A8, 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, + 0xC4F6, 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, 0x8624, + 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, 0x8629, 0xF5FC, + 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, 0x862E, 0xF5F9, 0x8631, + 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, 0x8634, 0xF747, 0x8635, 0xF748, + 0x8636, 0xF74C, 0x8638, 0xC5D9, 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, + 0xF7F5, 0x863C, 0xF7F3, 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, + 0x8643, 0xF8BC, 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, + 0xF9C7, 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, + 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, 0x8656, + 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, 0x865E, 0xB8B7, + 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, 0x8663, 0xEB58, 0x8664, + 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, 0x8668, 0xEE57, 0x8669, 0xF0BA, + 0x866A, 0xF9A5, 0x866B, 0xA6E4, 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, + 0xCDC8, 0x8670, 0xCDC7, 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, + 0x8677, 0xD0A6, 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, + 0xD0A8, 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, 0x8690, + 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, 0x8695, 0xD3C9, + 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, 0x8699, 0xD3C6, 0x869A, + 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, 0x869E, 0xD3BE, 0x86A1, 0xD3C7, + 0x86A2, 0xD3B9, 0x86A3, 0xB047, 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, + 0xD3C8, 0x86A8, 0xD3BA, 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, + 0x86B0, 0xD7A5, 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, + 0xB348, 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, + 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, 0x86BE, + 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, 0x86C2, 0xD7A1, + 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, 0x86C6, 0xB349, 0x86C7, + 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, 0x86CB, 0xB34A, 0x86CC, 0xD7AA, + 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, + 0xDFE7, 0x86D7, 0xDBBD, 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, + 0x86DB, 0xB5EF, 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, + 0xB5EB, 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, 0x86EC, + 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, 0x86F7, 0xDFE4, + 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, 0x86FB, 0xB8C0, 0x86FE, + 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, 0x8702, 0xB8C1, 0x8703, 0xB8C2, + 0x8704, 0xDFE3, 0x8705, 0xDFF0, 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, + 0xB8BC, 0x8709, 0xDFEC, 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, + 0x870D, 0xDFEF, 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, + 0xB8BB, 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, + 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, 0x8722, + 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, 0x8726, 0xE3EE, + 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, 0x872A, 0xE3E6, 0x872C, + 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, 0x8730, 0xE3F3, 0x8731, 0xE3EB, + 0x8732, 0xE3E5, 0x8733, 0xE3D5, 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, + 0xBB6C, 0x8738, 0xE3F0, 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, + 0x873E, 0xE3E2, 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, + 0xE3ED, 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, 0x8752, + 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, 0x8756, 0xE7A1, + 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, 0x875A, 0xE7AC, 0x875B, + 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, 0x875E, 0xE7AE, 0x875F, 0xE7B3, + 0x8760, 0xBDBB, 0x8761, 0xE7AB, 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, + 0xE7A3, 0x8765, 0xE7BA, 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, + 0x8769, 0xE7C0, 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, + 0xE7AF, 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, + 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, 0x8779, + 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, 0x8782, 0xBDB8, + 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, 0x8787, 0xEB65, 0x8788, + 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, 0x878F, 0xEB5C, 0x8790, 0xEB68, + 0x8791, 0xEB69, 0x8792, 0xEB5F, 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, + 0xEB62, 0x8797, 0xEB5D, 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, + 0x879C, 0xEB6D, 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, + 0xBFC3, 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, 0x87B0, + 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, 0x87B5, 0xEE5F, + 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, 0x87B9, 0xEE5E, 0x87BA, + 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, 0x87BD, 0xEE6E, 0x87BE, 0xEE58, + 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, + 0xEE68, 0x87C5, 0xEE5B, 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, + 0x87CA, 0xEE69, 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, + 0xC1AF, 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, + 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, 0x87DE, + 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, 0x87E2, 0xF0BD, + 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, 0x87E6, 0xF0BC, 0x87E7, + 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, + 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, + 0xF0CF, 0x87F6, 0xF2DE, 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, + 0x87FB, 0xC3C6, 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, + 0xF2DB, 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, 0x880B, + 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, 0x8811, 0xF4C6, + 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, 0x8816, 0xF4C9, 0x8817, + 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, 0x881C, 0xF645, 0x881D, 0xF641, + 0x881F, 0xC4FA, 0x8820, 0xF643, 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, + 0xC4F7, 0x8824, 0xF644, 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, + 0x8829, 0xF640, 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, + 0xF7F9, 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, + 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, 0x8838, + 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, 0x883D, 0xF9A7, + 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, 0x8841, 0xD0AA, 0x8843, + 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, 0x884A, 0xF647, 0x884B, 0xF8C0, + 0x884C, 0xA6E6, 0x884D, 0xAD6C, 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, + 0xB34E, 0x8855, 0xDBC2, 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, + 0x885A, 0xE7C1, 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, + 0xC5FC, 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, 0x8870, + 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, 0x8875, 0xD3D2, + 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, 0x887C, 0xD3DC, 0x887D, + 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, 0x8880, 0xD3D5, 0x8881, 0xB04B, + 0x8882, 0xB04C, 0x8883, 0xD3D9, 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, + 0xB355, 0x888C, 0xD7C2, 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, + 0x8892, 0xB352, 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, + 0xD7BF, 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, + 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, 0x88A4, + 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, 0x88AB, 0xB351, + 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, 0x88B6, 0xDBC9, 0x88B7, + 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, + 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, + 0xB5F5, 0x88C9, 0xDBCF, 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, + 0x88CD, 0xDFF3, 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, + 0xB8CF, 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, 0x88DC, + 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, 0x88E1, 0xB8CC, + 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, 0x88EC, 0xE441, 0x88EE, + 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, + 0x88F3, 0xBB6E, 0x88F4, 0xBB70, 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, + 0xBB72, 0x88F9, 0xBB71, 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, + 0x88FD, 0xBB73, 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, + 0xE7C2, 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, + 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, 0x8911, + 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, 0x8915, 0xBDC9, + 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, 0x8919, 0xE7C8, 0x891A, + 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, 0x8921, 0xBFCA, 0x8922, 0xEB77, + 0x8923, 0xEB79, 0x8925, 0xBFC8, 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, + 0xEB78, 0x892A, 0xBFC6, 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, + 0x892E, 0xEB74, 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, + 0xBFC7, 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, 0x893E, + 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, 0x8946, 0xF0D6, + 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, 0x894F, 0xF0D4, 0x8950, + 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, 0x8953, 0xF0D2, 0x8956, 0xC3CD, + 0x8957, 0xF2EC, 0x8958, 0xF2EF, 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, + 0xF2EB, 0x895C, 0xF2EE, 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, + 0x8960, 0xC3CB, 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, + 0xC4B0, 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, + 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, 0x8971, + 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, 0x8976, 0xF7FB, + 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, 0x897C, 0xF94A, 0x897E, + 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, 0x8982, 0xD7C5, 0x8983, 0xB5F7, + 0x8985, 0xDFFA, 0x8986, 0xC2D0, 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, + 0xB357, 0x8993, 0xB356, 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, + 0x8998, 0xDBD1, 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, + 0xE446, 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, 0x89AD, + 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, 0x89B6, 0xF2F4, + 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, 0x89BD, 0xC4FD, 0x89BE, + 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, + 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, + 0xDBD4, 0x89DB, 0xDBD5, 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, + 0x89E0, 0xE041, 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, + 0xDFFE, 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, + 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, 0x89F1, + 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, 0x89F6, 0xF2F5, + 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, 0x89FB, 0xF755, 0x89FC, + 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, 0x8A00, 0xA8A5, 0x8A02, 0xAD71, + 0x8A03, 0xAD72, 0x8A04, 0xD0B0, 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, + 0xB054, 0x8A0C, 0xB052, 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, + 0x8A11, 0xB059, 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, + 0xB057, 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, 0x8A25, + 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, 0x8A2D, 0xB35D, + 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, 0x8A36, 0xB646, 0x8A39, + 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, + 0x8A3F, 0xE049, 0x8A40, 0xDBDA, 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, + 0xDBDE, 0x8A46, 0xB643, 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, + 0x8A4D, 0xDBD7, 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, + 0xDBE1, 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, + 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, 0x8A5E, + 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, 0x8A63, 0xB8DA, + 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, 0x8A6B, 0xB8D2, 0x8A6C, + 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, + 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, + 0xE045, 0x8A77, 0xE04A, 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, + 0x8A7C, 0xB8D9, 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, + 0xE04E, 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, 0x8A91, + 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, 0x8A96, 0xE44F, + 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, 0x8A9E, 0xBB79, 0x8AA0, + 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, + 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, + 0xE44A, 0x8AB0, 0xBDD6, 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, + 0x8AB9, 0xBDDA, 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, + 0xE7E3, 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, + 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, 0x8AC7, + 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, 0x8ACD, 0xBDD8, + 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, 0x8AD3, 0xE7D7, 0x8AD4, + 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, + 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, + 0xEBAB, 0x8ADF, 0xEBA8, 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, + 0x8AE4, 0xEBA7, 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, + 0xBFCF, 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, 0x8AF5, + 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, 0x8AFA, 0xBFCE, + 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, 0x8AFF, 0xEBAE, 0x8B00, + 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, + 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, + 0xEEA5, 0x8B0D, 0xEEAB, 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, + 0x8B11, 0xEEA3, 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, + 0xEEA9, 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, + 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, 0x8B1E, + 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, 0x8B24, 0xF0EA, + 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, 0x8B28, 0xC2D3, 0x8B2A, + 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, + 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, + 0xF0E8, 0x8B37, 0xF0E6, 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, + 0x8B3C, 0xF0E2, 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, + 0xC3CF, 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, 0x8B4E, + 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, 0x8B52, 0xF342, + 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, 0x8B56, 0xF2FB, 0x8B57, + 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, + 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, + 0xF4D3, 0x8B66, 0xC4B5, 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, + 0x8B6B, 0xC4B8, 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, + 0xC4B3, 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, + 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, 0x8B7F, + 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, 0x8B85, 0xF75A, + 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, 0x8B8B, 0xF842, 0x8B8C, + 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, + 0x8B95, 0xF8C2, 0x8B96, 0xC640, 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, + 0xC667, 0x8B9C, 0xC66D, 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, + 0x8C39, 0xD7CD, 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, + 0xE7E5, 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, 0x8C49, + 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, 0x8C4D, 0xE7E6, + 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, 0x8C54, 0xC676, 0x8C55, + 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, + 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, + 0xE056, 0x8C65, 0xE055, 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, + 0x8C6A, 0xBBA8, 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, + 0xEEB5, 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, + 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, 0x8C79, + 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, 0x8C80, 0xDBE7, + 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, 0x8C85, 0xE05A, 0x8C86, + 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, + 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, + 0xBFDF, 0x8C94, 0xEEB7, 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, + 0x8C99, 0xF0F0, 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, + 0xAD73, 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, 0x8CA9, + 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, 0x8CAF, 0xB64A, + 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, 0x8CB4, 0xB651, 0x8CB5, + 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, + 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, + 0xDBE9, 0x8CBF, 0xB654, 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, + 0x8CC3, 0xB8EE, 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, + 0xB8EB, 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, + 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, 0x8CD9, + 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, 0x8CDE, 0xBDE0, + 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, 0x8CE2, 0xBDE5, 0x8CE3, + 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, + 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, + 0xEBB5, 0x8CF0, 0xEBB7, 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, + 0x8CF5, 0xEBB4, 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, + 0xC1CC, 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, 0x8D07, + 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, 0x8D0D, 0xC4BA, + 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, 0x8D14, 0xF653, 0x8D15, + 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, 0x8D19, 0xF845, 0x8D1B, 0xC642, + 0x8D64, 0xA8AA, 0x8D66, 0xB36A, 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, + 0xE05D, 0x8D6B, 0xBBAE, 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, + 0x8D6F, 0xEEB9, 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, + 0xAD75, 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, + 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, 0x8D84, + 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, 0x8D8C, 0xE05F, + 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, 0x8D90, 0xE065, 0x8D91, + 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, 0x8D94, 0xE064, 0x8D95, 0xBBB0, + 0x8D96, 0xE456, 0x8D99, 0xBBAF, 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, + 0xBDEB, 0x8DA0, 0xE7EF, 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, + 0x8DA7, 0xEBBC, 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, + 0xF34B, 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, 0x8DB7, + 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, 0x8DBE, 0xB36B, + 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, 0x8DC5, 0xDBFB, 0x8DC6, + 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, + 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, + 0xB65D, 0x8DD3, 0xDBF1, 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, + 0x8DD8, 0xDBF0, 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, + 0xDBF5, 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, + 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, 0x8DE7, + 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, 0x8DEB, 0xE072, + 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, 0x8DF0, 0xE067, 0x8DF1, + 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, + 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, + 0xE462, 0x8E02, 0xE458, 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, + 0x8E06, 0xE45F, 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, + 0xE45A, 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, 0x8E17, + 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, 0x8E1B, 0xE7F9, + 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, 0x8E1F, 0xBDF3, 0x8E20, + 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, + 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, + 0xBDED, 0x8E2E, 0xE7F7, 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, + 0x8E34, 0xBFE3, 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, + 0xBFE5, 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, + 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, 0x8E45, + 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, 0x8E4A, 0xC1D1, + 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, 0x8E4E, 0xEEBA, 0x8E50, + 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, + 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, + 0xF0F7, 0x8E5D, 0xF143, 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, + 0x8E61, 0xF142, 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, + 0xF0FD, 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, 0x8E73, + 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, 0x8E7A, 0xC3DF, + 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, 0x8E82, 0xC4BE, 0x8E84, + 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, + 0x8E89, 0xC4BB, 0x8E8A, 0xC543, 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, + 0xC544, 0x8E8E, 0xF655, 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, + 0x8E93, 0xC5AE, 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, + 0xF763, 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, + 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, 0x8EA4, + 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, 0x8EA9, 0xF9AB, + 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, 0x8EB2, 0xB8FA, 0x8EBA, + 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, + 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, + 0xB063, 0x8ED1, 0xD3E8, 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, + 0x8ED7, 0xD7DF, 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, + 0xD7DD, 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, 0x8EE9, + 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, 0x8EEF, 0xDBFC, + 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, 0x8EF6, 0xDC47, 0x8EF7, + 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, + 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, + 0xE076, 0x8F02, 0xE07B, 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, + 0x8F07, 0xE079, 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, + 0xE07C, 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, + 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, 0x8F16, + 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, 0x8F1B, 0xBDF8, + 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, 0x8F1F, 0xBDF9, 0x8F20, + 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, 0x8F25, 0xBE40, 0x8F26, 0xBDFB, + 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, + 0xBFE8, 0x8F32, 0xEBCC, 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, + 0x8F36, 0xEBC9, 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, + 0xBFE7, 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, 0x8F47, + 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, 0x8F4D, 0xC2E1, + 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, 0x8F51, 0xF357, 0x8F52, + 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, + 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, + 0xF658, 0x8F5D, 0xF659, 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, + 0x8F61, 0xC5AF, 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, + 0xA8AF, 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, + 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, 0x8FB0, + 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, 0x8FBF, 0xCBA6, + 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, 0x8FC6, 0xA8B2, 0x8FC9, + 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, + 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, + 0xCDD0, 0x8FD7, 0xCDD2, 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, + 0x8FE3, 0xD0B3, 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, + 0xADA4, 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, 0x8FF7, + 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, 0x8FFC, 0xD3F0, + 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, 0x9000, 0xB068, 0x9001, + 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, 0x9004, 0xD3EF, 0x9005, 0xB06D, + 0x9006, 0xB066, 0x900B, 0xD7E3, 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, + 0xB37A, 0x9010, 0xB376, 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, + 0x9016, 0xB37C, 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, + 0xB37D, 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, + 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, 0x9024, + 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, 0x9031, 0xB667, + 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, 0x9036, 0xB66A, 0x9038, + 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, 0x903E, 0xB94F, 0x903F, 0xE07E, + 0x9041, 0xB950, 0x9042, 0xB945, 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, + 0xE0A2, 0x904A, 0xB943, 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, + 0x904F, 0xB94B, 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, + 0xB944, 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, 0x9060, + 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, 0x9068, 0xBE43, + 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, 0x906E, 0xBE42, 0x906F, + 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, 0x9073, 0xE84F, 0x9074, 0xBFEE, + 0x9075, 0xBFED, 0x9076, 0xEBD0, 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, + 0xEBD1, 0x907A, 0xBFF2, 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, + 0x907E, 0xEEC3, 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, + 0xC1DB, 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, + 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, 0x908D, + 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, 0x9094, 0xCA55, + 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, 0x9099, 0xCA51, 0x909B, + 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, + 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, + 0xCBAB, 0x90AA, 0xA8B8, 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, + 0x90B2, 0xCDD3, 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, + 0xAAF5, 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, 0x90C8, + 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, 0x90D4, 0xD7EE, + 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, 0x90D8, 0xD3F9, 0x90D9, + 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, 0x90DC, 0xD3FC, 0x90DD, 0xB071, + 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, + 0xD3F6, 0x90E4, 0xD3FD, 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, + 0x90EA, 0xD7E9, 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, + 0xD7E8, 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, + 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, 0x90FB, + 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, 0x90FF, 0xDC53, + 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, 0x9103, 0xDC5C, 0x9104, + 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, 0x9107, 0xDC5A, 0x9108, 0xDC55, + 0x9109, 0xB66D, 0x910B, 0xE0AA, 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, + 0xE0A6, 0x9110, 0xE0A4, 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, + 0x9116, 0xE0A8, 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, + 0xE46E, 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, 0x9123, + 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, 0x9128, 0xF14A, + 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, 0x912C, 0xDC51, 0x912D, + 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, 0x9130, 0xBE46, 0x9131, 0xBE49, + 0x9132, 0xE858, 0x9133, 0xEBD5, 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, + 0xEBD7, 0x9138, 0xEEC4, 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, + 0x913E, 0xF14D, 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, + 0xF4E1, 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, + 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, 0x914C, + 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, 0x9150, 0xD3FE, + 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, 0x9156, 0xD7F2, 0x9157, + 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, 0x915F, 0xDC5F, 0x9160, 0xDC61, + 0x9161, 0xDC5D, 0x9162, 0xDC60, 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, + 0xB670, 0x9168, 0xDD73, 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, + 0x916E, 0xE0AC, 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, + 0xBBC6, 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, 0x9183, + 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, 0x9187, 0xBE4A, + 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, 0x918D, 0xEBDB, 0x918F, + 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, 0x9192, 0xBFF4, 0x9193, 0xEBD8, + 0x9199, 0xEEC8, 0x919A, 0xEEC5, 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, + 0xEECB, 0x919E, 0xC1DF, 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, + 0x91A2, 0xEEC6, 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, + 0xF14E, 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, + 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, 0x91B2, + 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, 0x91B7, 0xF4E3, + 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, 0x91BD, 0xF8C8, 0x91BE, + 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, 0x91C2, 0xF8C9, 0x91C3, 0xF971, + 0x91C5, 0xC66F, 0x91C6, 0xA8BC, 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, + 0xC4C0, 0x91CC, 0xA8BD, 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, + 0x91D0, 0xC2E7, 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, + 0xD442, 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, 0x91E4, + 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, 0x91E9, 0xB3AB, + 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, 0x91ED, 0xB3AA, 0x91EE, + 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, + 0x91F7, 0xD841, 0x91F8, 0xD7FB, 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, + 0xDC6C, 0x9200, 0xDC6A, 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, + 0x9204, 0xDC6F, 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, + 0xB675, 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, + 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, 0x9215, + 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, 0x921A, 0xDC66, + 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, 0x9224, 0xDC73, 0x9225, + 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, 0x922D, 0xE4BA, 0x922E, 0xE0B7, + 0x9230, 0xE0B0, 0x9231, 0xE0C3, 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, + 0xB961, 0x9236, 0xE0C0, 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, + 0x923A, 0xE0B1, 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, + 0xB95B, 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, 0x924E, + 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, 0x9252, 0xE0AF, + 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, 0x9257, 0xB958, 0x925A, + 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, 0x9260, 0xE0BD, 0x9261, 0xE0C1, + 0x9263, 0xE0C5, 0x9264, 0xB95F, 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, + 0xE0BE, 0x926C, 0xE0BB, 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, + 0x9272, 0xE0C7, 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, + 0xE47A, 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, + 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, 0x9285, + 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, 0x928A, 0xE4B0, + 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, 0x928E, 0xE4A9, 0x9291, + 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, 0x9295, 0xE4AB, 0x9296, 0xBBCB, + 0x9297, 0xE4A5, 0x9298, 0xBBCA, 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, + 0xE479, 0x929C, 0xBBCE, 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, + 0x92A2, 0xE4AC, 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, + 0xE4A1, 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, 0x92B4, + 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, 0x92B9, 0xF9D7, + 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, 0x92C1, 0xBE54, 0x92C2, + 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, + 0x92C7, 0xBE58, 0x92C8, 0xE874, 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, + 0xEBEE, 0x92CC, 0xE86F, 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, + 0x92D0, 0xE862, 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, + 0xE878, 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, + 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, 0x92E4, + 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, 0x92E9, 0xE86C, + 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, 0x92F0, 0xBE59, 0x92F1, + 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, + 0x92FB, 0xEC44, 0x92FC, 0xBFFB, 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, + 0xEC43, 0x9301, 0xEBE9, 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, + 0x9308, 0xEBDF, 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, + 0xEBED, 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, 0x9318, + 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, 0x931D, 0xEBEF, + 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, 0x9321, 0xC042, 0x9322, + 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, 0x9325, 0xEBF1, 0x9326, 0xC041, + 0x9327, 0xEBDD, 0x9328, 0xC1E3, 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, + 0xBFFC, 0x932D, 0xEBEB, 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, + 0x9334, 0xEBF5, 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, + 0xEBFA, 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, + 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, 0x934E, + 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, 0x9352, 0xEEE2, + 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, 0x9357, 0xEEE0, 0x9358, + 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, 0x935B, 0xC1EB, 0x935C, 0xEED5, + 0x935E, 0xEEE8, 0x9360, 0xEEDA, 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, + 0xEED0, 0x9365, 0xC1E6, 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, + 0x936D, 0xEEDB, 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, + 0xEED6, 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, 0x9383, + 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, 0x938C, 0xF154, + 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, 0x9391, 0xF165, 0x9392, + 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, 0x9396, 0xC2EA, 0x9397, 0xC2F2, + 0x9398, 0xC2F0, 0x9399, 0xF161, 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, + 0xF158, 0x939E, 0xF15D, 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, + 0x93A3, 0xF16A, 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, + 0xF15A, 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, + 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, 0x93B2, + 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, 0x93B7, 0xF156, + 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, 0x93C4, 0xF371, 0x93C7, + 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, 0x93CC, 0xF368, 0x93CD, 0xC3F1, + 0x93CE, 0xF372, 0x93CF, 0xF362, 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, + 0xF374, 0x93D4, 0xF36D, 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, + 0x93D8, 0xC3F2, 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, + 0xC3EE, 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, 0x93E8, + 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, 0x93F6, 0xF542, + 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, 0x93FA, 0xF4FA, 0x93FB, + 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, + 0x9400, 0xF4F4, 0x9403, 0xC4C2, 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, + 0xF4FB, 0x940A, 0xF4FD, 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, + 0x940E, 0xF4F7, 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, + 0xF4F9, 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, + 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, 0x9429, + 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, 0x942E, 0xC549, + 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, 0x9433, 0xC54A, 0x9435, + 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, 0x9438, 0xC54D, 0x9439, 0xF665, + 0x943A, 0xC54C, 0x943B, 0xF65F, 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, + 0xF65E, 0x9440, 0xF669, 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, + 0x9447, 0xF76C, 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, + 0xF76A, 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, 0x945E, + 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, 0x9464, 0xC5E1, + 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, 0x946B, 0xF8CA, 0x946D, + 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, 0x9470, 0xC65F, 0x9471, 0xF955, + 0x9472, 0xC65E, 0x9473, 0xF956, 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, + 0xF974, 0x9477, 0xC668, 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, + 0x947E, 0xC671, 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, + 0xF9BF, 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, + 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, 0x9583, + 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, 0x958B, 0xB67D, + 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, 0x958F, 0xB67C, 0x9590, + 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, 0x9593, 0xB6A1, 0x9594, 0xB67B, + 0x9598, 0xB968, 0x959B, 0xE0D0, 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, + 0xE0CD, 0x95A1, 0xBBD2, 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, + 0x95A8, 0xBBD3, 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, + 0xBE5B, 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, 0x95BB, + 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, 0x95BF, 0xEC4C, + 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, 0x95C6, 0xC1F3, 0x95C7, + 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, + 0x95CC, 0xC1F1, 0x95CD, 0xEC47, 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, + 0xF16C, 0x95D3, 0xF16D, 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, + 0x95DA, 0xF377, 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, + 0xF547, 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, + 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, 0x9620, + 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, 0x9624, 0xCA57, + 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, 0x962D, 0xCBB0, 0x962E, + 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, 0x9631, 0xA8C0, 0x9632, 0xA8BE, + 0x9639, 0xCDD8, 0x963A, 0xCDDB, 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, + 0xCDD9, 0x963F, 0xAAFC, 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, + 0x9644, 0xAAFE, 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, + 0xADB0, 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, 0x965C, + 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, 0x9661, 0xB07E, + 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, 0x966A, 0xB3AD, 0x966B, + 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, 0x966F, 0xD84B, 0x9670, 0xB3B1, + 0x9671, 0xD84A, 0x9672, 0xB6AB, 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, + 0xB3AE, 0x9676, 0xB3B3, 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, + 0x967D, 0xB6A7, 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, + 0xB6AC, 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, + 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, 0x968E, + 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, 0x9694, 0xB96A, + 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, 0x9699, 0xBBD8, 0x969B, + 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, + 0x96A4, 0xE8AA, 0x96A7, 0xC047, 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, + 0xC049, 0x96AC, 0xEEF6, 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, + 0x96B3, 0xF16F, 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, + 0xB0A6, 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, 0x96C6, + 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, 0x96CA, 0xB96F, + 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, 0x96CE, 0xE0D5, 0x96D2, + 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, 0x96D5, 0xC04A, 0x96D6, 0xC1F6, + 0x96D7, 0xF170, 0x96D8, 0xF174, 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, + 0xC2FA, 0x96DC, 0xC2F8, 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, + 0x96E1, 0xF379, 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, + 0xAB42, 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, + 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, 0x96F7, + 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, 0x96FB, 0xB971, + 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, 0x9702, 0xE8AF, 0x9704, + 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, 0x9707, 0xBE5F, 0x9708, 0xE8AE, + 0x9709, 0xBE60, 0x970B, 0xEC51, 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, + 0xC050, 0x9710, 0xEC53, 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, + 0x9716, 0xC04D, 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, + 0xEEFA, 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, 0x9727, + 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, 0x972B, 0xF37B, + 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, 0x9730, 0xC4C5, 0x9732, + 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, 0x9739, 0xC552, 0x973A, 0xF66F, + 0x973D, 0xC5B4, 0x973E, 0xC5B5, 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, + 0xF8CF, 0x9744, 0xC647, 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, + 0x9749, 0xF957, 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, + 0xE4BE, 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, + 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, 0x9768, + 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, 0x976E, 0xDCAB, + 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, 0x9774, 0xB975, 0x9776, + 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, 0x977A, 0xE4C0, 0x977B, 0xE4C5, + 0x977C, 0xBBDE, 0x977D, 0xE4BF, 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, + 0xE4C3, 0x9781, 0xE4C7, 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, + 0x9785, 0xBBDF, 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, + 0xBE62, 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, 0x979D, + 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, 0x97A2, 0xF1A1, + 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, 0x97A6, 0xC2FE, 0x97A8, + 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, 0x97AC, 0xF179, 0x97AD, 0xC340, + 0x97AE, 0xF17A, 0x97B3, 0xF3A1, 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, + 0xF54A, 0x97BB, 0xF54B, 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, + 0x97C4, 0xF84F, 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, + 0xC669, 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, + 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, 0x97D5, + 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, 0x97D9, 0xF1A4, + 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, 0x97DF, 0xF3A6, 0x97E1, + 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, 0x97ED, 0xADB4, 0x97F0, 0xEC57, + 0x97F1, 0xEF44, 0x97F3, 0xADB5, 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, + 0xC341, 0x97FA, 0xF1A7, 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, + 0x97FF, 0xC554, 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, + 0xB3BC, 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, 0x980E, + 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, 0x9812, 0xB97B, + 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, 0x9818, 0xBBE2, 0x981B, + 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, 0x981E, 0xE8B6, 0x9820, 0xE8BB, + 0x9821, 0xBE65, 0x9824, 0xC05B, 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, + 0xE8BA, 0x9829, 0xE8B9, 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, + 0x9830, 0xC055, 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, + 0xC056, 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, + 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, 0x9849, + 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, 0x984E, 0xC345, + 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, 0x9852, 0xF1AA, 0x9853, + 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, 0x9859, 0xF3A8, 0x985B, 0xC441, + 0x985C, 0xF3A7, 0x985D, 0xF3A9, 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, + 0xF54E, 0x9862, 0xF54F, 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, + 0x9867, 0xC555, 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, + 0xC5E3, 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, 0x98AD, + 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, 0x98B2, 0xE8BE, + 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, 0x98BA, 0xC347, 0x98BB, + 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, + 0x98C0, 0xF675, 0x98C1, 0xF552, 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, + 0xF674, 0x98C9, 0xF673, 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, + 0x98DF, 0xADB9, 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, + 0xB6B8, 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, + 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, 0x98F9, + 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, 0x98FE, 0xB9A2, + 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, 0x9905, 0xBBE6, 0x9907, + 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, 0x990A, 0xBE69, 0x990C, 0xBBE7, + 0x9910, 0xC05C, 0x9911, 0xE8C1, 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, + 0xE8C2, 0x9915, 0xE8C5, 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, + 0x991A, 0xC061, 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, + 0xC060, 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, 0x992D, + 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, 0x9931, 0xEF53, + 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, 0x993A, 0xF1AE, 0x993C, + 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, 0x993F, 0xC349, 0x9941, 0xF1AC, + 0x9943, 0xF3B1, 0x9945, 0xC443, 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, + 0xC444, 0x994B, 0xF558, 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, + 0x9951, 0xC4C8, 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, + 0xC5B9, 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, + 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, 0x9961, + 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, 0x9999, 0xADBB, + 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, 0x99A1, 0xEF57, 0x99A3, + 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, + 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, + 0xE0E4, 0x99B0, 0xE0E6, 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, + 0x99B4, 0xB9A5, 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, + 0xE4D5, 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, 0x99CD, + 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, 0x99D1, 0xBE71, + 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, 0x99D5, 0xBE72, 0x99D6, + 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, 0x99D9, 0xBE74, 0x99DB, 0xBE70, + 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, + 0xEC66, 0x99E4, 0xEC64, 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, + 0x99EA, 0xEC67, 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, + 0xEC65, 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, + 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, 0x99FC, + 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, 0x9A01, 0xC1FE, + 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, 0x9A05, 0xF1B6, 0x9A06, + 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, + 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, + 0xF3C0, 0x9A15, 0xF3B5, 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, + 0x9A1B, 0xF3B9, 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, + 0xF3BB, 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, 0x9A2C, + 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, 0x9A31, 0xF55C, + 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, 0x9A36, 0xF55F, 0x9A37, + 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, 0x9A3A, 0xF67E, 0x9A3D, 0xF679, + 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, + 0xF67C, 0x9A43, 0xC559, 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, + 0x9A48, 0xF77D, 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, + 0xC5BB, 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, + 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, 0x9A57, + 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, 0x9A5E, 0xF8D3, + 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, 0x9A64, 0xF9B3, 0x9A65, + 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, + 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, + 0xE0E8, 0x9AAF, 0xBBEA, 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, + 0x9AB4, 0xEC6C, 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, + 0xEC6D, 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, 0x9ACA, + 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, 0x9AD1, 0xC5EA, + 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, 0x9AD5, 0xF8D4, 0x9AD6, + 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, + 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, + 0xE8D3, 0x9AED, 0xC068, 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, + 0x9AF2, 0xE8D6, 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, + 0xEC70, 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, + 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, 0x9B05, + 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, 0x9B0B, 0xF3C2, + 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, 0x9B10, 0xF567, 0x9B11, + 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, + 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, + 0xF855, 0x9B20, 0xF856, 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, + 0x9B25, 0xB0AB, 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, + 0xF7A6, 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, 0x9B3B, + 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, 0x9B41, 0xBBED, + 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, 0x9B45, 0xBE79, 0x9B46, + 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, + 0x9B4D, 0xC353, 0x9B4E, 0xC352, 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, + 0xF6A8, 0x9B54, 0xC55D, 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, + 0x9B59, 0xF8D5, 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, + 0xE4DF, 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, + 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, 0x9B71, + 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, 0x9B77, 0xBE7B, + 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, 0x9B7D, 0xECA1, 0x9B7E, + 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, 0x9B85, 0xEC74, 0x9B86, 0xEF72, + 0x9B87, 0xEC75, 0x9B88, 0xECA2, 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, + 0xEC7B, 0x9B93, 0xEC7A, 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, + 0x9B9E, 0xEF6C, 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, + 0xEF71, 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, 0x9BB5, + 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, 0x9BBD, 0xF1CE, + 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, 0x9BC3, 0xF1C5, 0x9BC4, + 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, 0x9BC8, 0xC357, 0x9BC9, 0xC355, + 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, + 0xC44A, 0x9BD7, 0xF3D0, 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, + 0x9BDC, 0xF3D2, 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, + 0xF3CD, 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, + 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, 0x9BF0, + 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, 0x9C05, 0xF56D, + 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, 0x9C09, 0xF576, 0x9C0B, + 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, 0x9C12, 0xF56E, 0x9C13, 0xC4CE, + 0x9C14, 0xF575, 0x9C17, 0xF574, 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, + 0xF6B1, 0x9C23, 0xF6AD, 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, + 0x9C29, 0xF6AF, 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, + 0xC5BF, 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, 0x9C3D, + 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, 0x9C41, 0xF7B0, + 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, 0x9C49, 0xC5BE, 0x9C4A, + 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, 0x9C4D, 0xF85B, 0x9C4E, 0xF860, + 0x9C50, 0xF859, 0x9C52, 0xF857, 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, + 0xC5ED, 0x9C57, 0xC5EC, 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, + 0x9C5F, 0xC64D, 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, + 0xF8D8, 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, + 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, 0x9C77, + 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, 0x9CE5, 0xB3BE, + 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, 0x9CEA, 0xE0EB, 0x9CED, + 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, + 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, + 0xE8E5, 0x9CFB, 0xE8EC, 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, + 0x9D00, 0xE8EA, 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, + 0xBE7D, 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, 0x9D18, + 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, 0x9D1E, 0xECA6, + 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, 0x9D23, 0xC06C, 0x9D25, + 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, + 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, + 0xEF76, 0x9D36, 0xEF79, 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, + 0x9D3D, 0xEFA7, 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, + 0xEF77, 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, + 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, 0x9D52, + 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, 0x9D57, 0xF1D8, + 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, 0x9D5B, 0xF1D3, 0x9D5C, + 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, 0x9D60, 0xC35B, 0x9D61, 0xC44D, + 0x9D67, 0xEF78, 0x9D68, 0xF3F1, 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, + 0xF3E4, 0x9D6C, 0xC450, 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, + 0x9D72, 0xC44E, 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, + 0xF3D8, 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, 0x9D84, + 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, 0x9D88, 0xF3DC, + 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, 0x9D8C, 0xF3E2, 0x9D90, + 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, + 0x9D98, 0xF57C, 0x9D99, 0xF578, 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, + 0xF5A3, 0x9D9D, 0xF57A, 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, + 0x9DA1, 0xF5A6, 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, + 0xF5AF, 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, + 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, 0x9DB2, + 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, 0x9DB6, 0xF6B3, + 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, 0x9DBA, 0xF6C0, 0x9DBB, + 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, + 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, + 0xF6C2, 0x9DCA, 0xF6B7, 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, + 0x9DCE, 0xF6BE, 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, + 0xF7B8, 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, 0x9DDC, + 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, 0x9DE1, 0xF869, + 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, 0x9DE5, 0xC5EE, 0x9DE6, + 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, 0x9DEB, 0xF865, 0x9DEC, 0xF86F, + 0x9DED, 0xF873, 0x9DEE, 0xF86A, 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, + 0xF86C, 0x9DF3, 0xF871, 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, + 0x9DF7, 0xF862, 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, + 0xF861, 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, + 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, 0x9E05, + 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, 0x9E0B, 0xF95D, + 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, 0x9E11, 0xF962, 0x9E12, + 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, + 0x9E19, 0xF9C5, 0x9E1A, 0xC678, 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, + 0xC67D, 0x9E75, 0xB3BF, 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, + 0x9E7D, 0xC651, 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, + 0xE8F0, 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, 0x9E8E, + 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, 0x9E94, 0xF3F2, + 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, 0x9E9B, 0xF5B2, 0x9E9C, + 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, + 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, + 0xECB3, 0x9EAE, 0xECB2, 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, + 0x9EB6, 0xF7C7, 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, + 0xBEA3, 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, + 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, 0x9ED0, + 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, 0x9ED5, 0xECB4, + 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, 0x9EDB, 0xC24C, 0x9EDC, + 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, + 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, + 0xC4D2, 0x9EEB, 0xF6CB, 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, + 0x9EF0, 0xF7C8, 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, + 0xF964, 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, 0x9F00, + 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, 0x9F09, 0xF965, + 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, 0x9F10, 0xE8F3, 0x9F12, + 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, + 0x9F19, 0xC567, 0x9F1A, 0xF6D0, 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, + 0xF8E9, 0x9F20, 0xB9AB, 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, + 0x9F25, 0xF1E4, 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, + 0xF1E5, 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, + 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, 0x9F34, + 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, 0x9F38, 0xF87A, + 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, 0x9F40, 0xF3F7, 0x9F41, + 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, 0x9F46, 0xF8EA, 0x9F47, 0xF966, + 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, + 0xF1E9, 0x9F4D, 0xF3F9, 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, + 0x9F54, 0xEFB5, 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, + 0xF3FC, 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, 0x9F63, + 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, 0x9F67, 0xC56A, + 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, 0x9F6E, 0xF8A3, 0x9F6F, + 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, 0x9F72, 0xC654, 0x9F74, 0xF8EB, + 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, + 0xF96A, 0x9F7A, 0xF969, 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, + 0x9F90, 0xC365, 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, + 0xF7CE, 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, + 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, 0xFE31, + 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, 0xFE36, 0xA160, + 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, 0xFE3A, 0xA168, 0xFE3B, + 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, 0xFE3E, 0xA170, 0xFE3F, 0xA173, + 0xFE40, 0xA174, 0xFE41, 0xA177, 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, + 0xA17C, 0xFE49, 0xA1C6, 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, + 0xFE4D, 0xA1C8, 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, + 0xA14E, 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, 0xFE5C, + 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, 0xFE60, 0xA1CD, + 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, 0xFE64, 0xA1E0, 0xFE65, + 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, 0xFE69, 0xA24C, 0xFE6A, 0xA24D, + 0xFE6B, 0xA24E, 0xFF01, 0xA149, 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, + 0xA248, 0xFF06, 0xA1AE, 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, + 0xFF0B, 0xA1CF, 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, + 0xA1FE, 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, + 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, 0xFF18, + 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, 0xFF1C, 0xA1D5, + 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, 0xFF20, 0xA249, 0xFF21, + 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, + 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, + 0xA2D8, 0xFF2B, 0xA2D9, 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, + 0xFF2F, 0xA2DD, 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, + 0xA2E1, 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, 0xFF3F, + 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, 0xFF44, 0xA2EC, + 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, 0xFF48, 0xA2F0, 0xFF49, + 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, + 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, + 0xA2FA, 0xFF53, 0xA2FB, 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, + 0xFF57, 0xA340, 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, + 0xA161, 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, + 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 }; + +/// Big5 --> Unicode pairs +static const WCHAR oem2uni950[] + = { 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, 0xA144, + 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, 0xA148, 0xFF1F, + 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, 0xA14C, 0x2025, 0xA14D, + 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, 0xA150, 0x00B7, 0xA151, 0xFE54, + 0xA152, 0xFE55, 0xA153, 0xFE56, 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, + 0x2013, 0xA157, 0xFE31, 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, + 0xA15B, 0xFE34, 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, + 0xFE35, 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, + 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, 0xA168, + 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, 0xA16C, 0xFE3C, + 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, 0xA170, 0xFE3E, 0xA171, + 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, 0xA174, 0xFE40, 0xA175, 0x300C, + 0xA176, 0x300D, 0xA177, 0xFE41, 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, + 0x300F, 0xA17B, 0xFE43, 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, + 0xA1A1, 0xFE5B, 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, + 0x2018, 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, 0xA1AE, + 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, 0xA1B2, 0x3003, + 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, 0xA1B6, 0x25B2, 0xA1B7, + 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, + 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, + 0x32A3, 0xA1C1, 0x2105, 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, + 0xA1C5, 0x02CD, 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, + 0xFE4E, 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, + 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, 0xA1D2, + 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, 0xA1D6, 0xFF1E, + 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, 0xA1DA, 0x2260, 0xA1DB, + 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, + 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, + 0x2229, 0xA1E5, 0x222A, 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, + 0xA1E9, 0x22BF, 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, + 0x222E, 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, 0xA1F6, + 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, 0xA1FA, 0x2199, + 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, 0xA1FE, 0xFF0F, 0xA240, + 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, 0xA243, 0xFF04, 0xA244, 0xFFE5, + 0xA245, 0x3012, 0xA246, 0xFFE0, 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, + 0xFF20, 0xA24A, 0x2103, 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, + 0xA24E, 0xFE6B, 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, + 0x339E, 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, + 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, 0xA25B, + 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, 0xA25F, 0x55E7, + 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, 0xA263, 0x2582, 0xA264, + 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, 0xA267, 0x2586, 0xA268, 0x2587, + 0xA269, 0x2588, 0xA26A, 0x258F, 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, + 0x258C, 0xA26E, 0x258B, 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, + 0xA272, 0x2534, 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, + 0x2594, 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, 0xA2A1, + 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, 0xA2A5, 0x255E, + 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, 0xA2A9, 0x25E3, 0xA2AA, + 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, 0xA2AD, 0x2572, 0xA2AE, 0x2573, + 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, + 0xFF14, 0xA2B4, 0xFF15, 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, + 0xA2B8, 0xFF19, 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, + 0x2163, 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, + 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, 0xA2C5, + 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, 0xA2C9, 0x3027, + 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, 0xA2CD, 0x5344, 0xA2CE, + 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, + 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, + 0xFF29, 0xA2D8, 0xFF2A, 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, + 0xA2DC, 0xFF2E, 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, + 0xFF32, 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, 0xA2E9, + 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, 0xA2ED, 0xFF45, + 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, 0xA2F1, 0xFF49, 0xA2F2, + 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, + 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, + 0xFF53, 0xA2FC, 0xFF54, 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, + 0xA341, 0xFF58, 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, + 0x0392, 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, + 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, 0xA34E, + 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, 0xA352, 0x039F, + 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, 0xA356, 0x03A4, 0xA357, + 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, 0xA35A, 0x03A8, 0xA35B, 0x03A9, + 0xA35C, 0x03B1, 0xA35D, 0x03B2, 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, + 0x03B5, 0xA361, 0x03B6, 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, + 0xA365, 0x03BA, 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, + 0x03BE, 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, 0xA372, + 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, 0xA376, 0x3107, + 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, 0xA37A, 0x310B, 0xA37B, + 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, 0xA37E, 0x310F, 0xA3A1, 0x3110, + 0xA3A2, 0x3111, 0xA3A3, 0x3112, 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, + 0x3115, 0xA3A7, 0x3116, 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, + 0xA3AB, 0x311A, 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, + 0x311E, 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, + 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, 0xA3B8, + 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, 0xA3BC, 0x02C9, + 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, 0xA3E1, 0x20AC, 0xA440, + 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, 0xA443, 0x4E03, 0xA444, 0x4E43, + 0xA445, 0x4E5D, 0xA446, 0x4E86, 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, + 0x513F, 0xA44A, 0x5165, 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, + 0xA44E, 0x5201, 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, + 0x535C, 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, 0xA45B, + 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, 0xA45F, 0x4E8E, + 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, 0xA463, 0x52FA, 0xA464, + 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, 0xA467, 0x571F, 0xA468, 0x58EB, + 0xA469, 0x5915, 0xA46A, 0x5927, 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, + 0x5B51, 0xA46E, 0x5B53, 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, + 0xA472, 0x5C38, 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, + 0x5DF1, 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, + 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, 0xA4A1, + 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, 0xA4A5, 0x4E30, + 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, 0xA4A9, 0x4E88, 0xA4AA, + 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, + 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, + 0x4EC7, 0xA4B4, 0x4ECD, 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, + 0xA4B8, 0x5143, 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, + 0x516E, 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, 0xA4C5, + 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, 0xA4C9, 0x5347, + 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, 0xA4CD, 0x53CB, 0xA4CE, + 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, 0xA4D1, 0x5929, 0xA4D2, 0x592B, + 0xA4D3, 0x592A, 0xA4D4, 0x592D, 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, + 0x5C24, 0xA4D8, 0x5C3A, 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, + 0xA4DC, 0x5EFF, 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, + 0x6208, 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, + 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, 0xA4E9, + 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, 0xA4ED, 0x6B20, + 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, 0xA4F1, 0x6BD4, 0xA4F2, + 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, 0xA4F5, 0x706B, 0xA4F6, 0x722A, + 0xA4F7, 0x7236, 0xA4F8, 0x723B, 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, + 0x725B, 0xA4FC, 0x72AC, 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, + 0xA541, 0x4E15, 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, + 0x4E4D, 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, 0xA54E, + 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, 0xA552, 0x5145, + 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, 0xA556, 0x51AC, 0xA557, + 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, 0xA55A, 0x520A, 0xA55B, 0x52A0, + 0xA55C, 0x529F, 0xA55D, 0x5305, 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, + 0x531D, 0xA561, 0x4EDF, 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, + 0xA565, 0x5360, 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, + 0x53EF, 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, + 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, 0xA572, + 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, 0xA576, 0x53F2, + 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, 0xA57A, 0x53ED, 0xA57B, + 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, 0xA57E, 0x5916, 0xA5A1, 0x592E, + 0xA5A2, 0x5931, 0xA5A3, 0x5974, 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, + 0x5B83, 0xA5A7, 0x5C3C, 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, + 0xA5AB, 0x5E02, 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, + 0x5F01, 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, 0xA5B8, + 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, 0xA5BC, 0x672A, + 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, 0xA5C0, 0x6BCD, 0xA5C1, + 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, + 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, + 0x74DC, 0xA5CB, 0x74E6, 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, + 0xA5CF, 0x7529, 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, + 0x7533, 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, + 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, 0xA5DC, + 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, 0xA5E0, 0x4E1E, + 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, 0xA5E4, 0x4E69, 0xA5E5, + 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, + 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, + 0x4F0D, 0xA5EF, 0x4F10, 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, + 0xA5F3, 0x4EF6, 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, + 0x4EFD, 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, 0xA641, + 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, 0xA645, 0x5212, + 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, 0xA649, 0x5308, 0xA64A, + 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, 0xA64D, 0x5371, 0xA64E, 0x5409, + 0xA64F, 0x540F, 0xA650, 0x540C, 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, + 0x5401, 0xA654, 0x540B, 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, + 0xA658, 0x5408, 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, + 0x5412, 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, + 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, 0xA665, + 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, 0xA669, 0x5937, + 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, 0xA66D, 0x5983, 0xA66E, + 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, 0xA671, 0x5981, 0xA672, 0x5B57, + 0xA673, 0x5B58, 0xA674, 0x5B87, 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, + 0x5B89, 0xA678, 0x5BFA, 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, + 0xA67C, 0x5E06, 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, + 0x5F1B, 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, 0xA6AB, + 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, 0xA6AF, 0x65EC, + 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, 0xA6B3, 0x6709, 0xA6B4, + 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, 0xA6B7, 0x6735, 0xA6B8, 0x6B21, + 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, + 0x6C57, 0xA6BE, 0x6C59, 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, + 0xA6C2, 0x6C55, 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, + 0x6C4E, 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, + 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, 0xA6CF, + 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, 0xA6D3, 0x800C, + 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, 0xA6D7, 0x8089, 0xA6D8, + 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, + 0xA6DD, 0x81FC, 0xA6DE, 0x820C, 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, + 0x826E, 0xA6E2, 0x8272, 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, + 0xA6E6, 0x884C, 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, + 0x4E32, 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, 0xA6F3, + 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, 0xA6F7, 0x4F3D, + 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, 0xA6FB, 0x4F54, 0xA6FC, + 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, 0xA740, 0x4F5C, 0xA741, 0x4F60, + 0xA742, 0x4F2F, 0xA743, 0x4F4E, 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, + 0x4F5D, 0xA747, 0x4F48, 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, + 0xA74B, 0x514D, 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, + 0x5225, 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, + 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, 0xA758, + 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, 0xA75C, 0x542D, + 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, 0xA760, 0x544E, 0xA761, + 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, 0xA764, 0x5433, 0xA765, 0x5448, + 0xA766, 0x5442, 0xA767, 0x541B, 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, + 0x5439, 0xA76B, 0x543B, 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, + 0xA76F, 0x5436, 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, + 0x5431, 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, 0xA77C, + 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, 0xA7A2, 0x574E, + 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, 0xA7A6, 0x573B, 0xA7A7, + 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, 0xA7AA, 0x5992, 0xA7AB, 0x59A8, + 0xA7AC, 0x599E, 0xA7AD, 0x59A3, 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, + 0x598D, 0xA7B1, 0x59A4, 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, + 0xA7B5, 0x5B5D, 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, + 0x5B8C, 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, + 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, 0xA7C2, + 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, 0xA7C6, 0x5E0C, + 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, 0xA7CA, 0x5EF7, 0xA7CB, + 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, + 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, + 0x5FCD, 0xA7D5, 0x5FF1, 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, + 0xA7D9, 0x6212, 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, + 0x6296, 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, 0xA7E6, + 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, 0xA7EA, 0x626E, + 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, 0xA7EE, 0x6286, 0xA7EF, + 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, + 0xA7F4, 0x675F, 0xA7F5, 0x674E, 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, + 0x6751, 0xA7F9, 0x675C, 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, + 0xA7FD, 0x6746, 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, + 0x6B65, 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, + 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, 0xA84B, + 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, 0xA84F, 0x6C70, + 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, 0xA853, 0x6C92, 0xA854, + 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, 0xA857, 0x6C7E, 0xA858, 0x6C74, + 0xA859, 0x6C86, 0xA85A, 0x6C76, 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, + 0x6C98, 0xA85E, 0x6C82, 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, + 0xA862, 0x7078, 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, + 0x72C4, 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, 0xA86F, + 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, 0xA873, 0x7A76, + 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, 0xA877, 0x8093, 0xA878, + 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, 0xA87B, 0x809A, 0xA87C, 0x80B2, + 0xA87D, 0x826F, 0xA87E, 0x8292, 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, + 0x898B, 0xA8A4, 0x89D2, 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, + 0xA8A8, 0x8C55, 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, + 0x8DB3, 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, + 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, 0xA8B5, + 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, 0xA8B9, 0x90A6, + 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, 0xA8BD, 0x91CC, 0xA8BE, + 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, 0xA8C1, 0x962A, 0xA8C2, 0x962C, + 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, + 0x4E9B, 0xA8C8, 0x4E9E, 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, + 0xA8CC, 0x4F9D, 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, + 0x4F6C, 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, 0xA8D9, + 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, 0xA8DD, 0x4F91, + 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, 0xA8E1, 0x5155, 0xA8E2, + 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, 0xA8E5, 0x5178, 0xA8E6, 0x51BD, + 0xA8E7, 0x51FD, 0xA8E8, 0x523B, 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, + 0x523A, 0xA8EC, 0x5230, 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, + 0xA8F0, 0x52BE, 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, + 0x5353, 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, + 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, 0xA8FD, + 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, 0xA942, 0x5495, + 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, 0xA946, 0x5484, 0xA947, + 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, 0xA94A, 0x5490, 0xA94B, 0x5471, + 0xA94C, 0x5476, 0xA94D, 0x548C, 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, + 0x5468, 0xA951, 0x548B, 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, + 0xA955, 0x5783, 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, + 0x5761, 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, 0xA962, + 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, 0xA966, 0x59B9, + 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, 0xA96A, 0x59D0, 0xA96B, + 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, 0xA96E, 0x59CA, 0xA96F, 0x59AF, + 0xA970, 0x59B3, 0xA971, 0x59D2, 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, + 0x5B64, 0xA975, 0x5B63, 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, + 0xA979, 0x5B9C, 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, + 0x5C48, 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, + 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, 0xA9A8, + 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, 0xA9AC, 0x5E15, + 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, 0xA9B0, 0x5E9A, 0xA9B1, + 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, + 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, + 0x5F81, 0xA9BB, 0x5F7F, 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, + 0xA9BF, 0x5FFD, 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, + 0x6014, 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, 0xA9CC, + 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, 0xA9D0, 0x623F, + 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, 0xA9D4, 0x62C9, 0xA9D5, + 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, + 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, + 0x62D4, 0xA9DF, 0x62CB, 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, + 0xA9E3, 0x62BC, 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, + 0x62CD, 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, + 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, 0xA9F0, + 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, 0xA9F4, 0x65FA, + 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, 0xA9F8, 0x6606, 0xA9F9, + 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, 0xA9FC, 0x660F, 0xA9FD, 0x6615, + 0xA9FE, 0x660A, 0xAA40, 0x6607, 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, + 0x676D, 0xAA44, 0x678B, 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, + 0xAA48, 0x6773, 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, + 0x6797, 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, 0xAA55, + 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, 0xAA59, 0x6B23, + 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, 0xAA5D, 0x6C13, 0xAA5E, + 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, + 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, + 0x6CBE, 0xAA68, 0x6CBC, 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, + 0xAA6C, 0x6CD3, 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, + 0x6CC1, 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, + 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, 0xAA79, + 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, 0xAA7D, 0x6CD6, + 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, 0xAAA3, 0x7092, 0xAAA4, + 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, 0xAAA7, 0x722D, 0xAAA8, 0x7238, + 0xAAA9, 0x7248, 0xAAAA, 0x7267, 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, + 0x72CE, 0xAAAE, 0x72D9, 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, + 0xAAB2, 0x73A8, 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, + 0x753D, 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, 0xAABF, + 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, 0xAAC3, 0x79C9, + 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, 0xAAC7, 0x7AFA, 0xAAC8, + 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, 0xAACB, 0x7F8B, 0xAACC, 0x8005, + 0xAACD, 0x80BA, 0xAACE, 0x80A5, 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, + 0x80A1, 0xAAD2, 0x80AB, 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, + 0xAAD6, 0x80AF, 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, + 0x82B3, 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, + 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, 0xAAE3, + 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, 0xAAE7, 0x82B0, + 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, 0xAAEB, 0x8671, 0xAAEC, + 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, + 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, + 0x90B6, 0xAAF6, 0x91C7, 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, + 0xAAFA, 0x961C, 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, + 0x9644, 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, 0xAB48, + 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, 0xAB4C, 0x4FE0, + 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, 0xAB50, 0x4FC3, 0xAB51, + 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, + 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, + 0x4FDA, 0xAB5B, 0x4FCE, 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, + 0xAB5F, 0x5192, 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, + 0x5243, 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, + 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, 0xAB6C, + 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, 0xAB70, 0x539A, + 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, 0xAB74, 0x54A8, 0xAB75, + 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, 0xAB78, 0x54A6, 0xAB79, 0x54B3, + 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, + 0x54C1, 0xABA1, 0x54C4, 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, + 0xABA5, 0x54B1, 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, + 0x54BF, 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, 0xABB2, + 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, 0xABB6, 0x594E, + 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, 0xABBA, 0x59FF, 0xABBB, + 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, 0xABBE, 0x59E5, 0xABBF, 0x59EA, + 0xABC0, 0x59DA, 0xABC1, 0x59E6, 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, + 0x5B69, 0xABC5, 0x5BA3, 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, + 0xABC9, 0x5BA5, 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, + 0x5C4D, 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, + 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, 0xABD6, + 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, 0xABDA, 0x5F2D, + 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, 0xABDE, 0x5F8A, 0xABDF, + 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, 0xABE2, 0x5F89, 0xABE3, 0x6012, + 0xABE4, 0x601D, 0xABE5, 0x6020, 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, + 0x6028, 0xABE9, 0x604D, 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, + 0xABED, 0x6046, 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, + 0x606A, 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, 0xABFA, + 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, 0xABFE, 0x62F7, + 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, 0xAC43, 0x62F4, 0xAC44, + 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, 0xAC47, 0x6545, 0xAC48, 0x65AB, + 0xAC49, 0x65BD, 0xAC4A, 0x65E2, 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, + 0x6620, 0xAC4E, 0x6627, 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, + 0xAC52, 0x6631, 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, + 0x67D3, 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, + 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, 0xAC5F, + 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, 0xAC63, 0x67DA, + 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, 0xAC67, 0x67DE, 0xAC68, + 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, + 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, + 0x6BB5, 0xAC72, 0x6BD2, 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, + 0xAC76, 0x6D0B, 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, + 0x6D25, 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, 0xACA5, + 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, 0xACA9, 0x6D38, + 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, 0xACAD, 0x6D0E, 0xACAE, + 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, 0xACB1, 0x70B3, 0xACB2, 0x70AC, + 0xACB3, 0x70AF, 0xACB4, 0x70AD, 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, + 0x70A4, 0xACB8, 0x7230, 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, + 0xACBC, 0x72E9, 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, + 0x73CA, 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, + 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, 0xACC9, + 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, 0xACCD, 0x75A4, + 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, 0xACD1, 0x7678, 0xACD2, + 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, 0xACD5, 0x76C8, 0xACD6, 0x76C6, + 0xACD7, 0x76C3, 0xACD8, 0x76C5, 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, + 0x76F8, 0xACDC, 0x7709, 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, + 0xACE0, 0x7707, 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, + 0x780C, 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, 0xACED, + 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, 0xACF1, 0x7AFF, + 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, 0xACF5, 0x7D05, 0xACF6, + 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, 0xACF9, 0x7D04, 0xACFA, 0x7D06, + 0xACFB, 0x7F38, 0xACFC, 0x7F8E, 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, + 0x8010, 0xAD41, 0x800D, 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, + 0xAD45, 0x80E5, 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, + 0x80CC, 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, + 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, 0xAD52, + 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, 0xAD56, 0x82DB, + 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, 0xAD5A, 0x8302, 0xAD5B, + 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, 0xAD5E, 0x82F1, 0xAD5F, 0x8301, + 0xAD60, 0x82DC, 0xAD61, 0x82D4, 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, + 0x82D3, 0xAD65, 0x82DF, 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, + 0xAD69, 0x8679, 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, + 0x886B, 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, 0xAD76, + 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, 0xAD7A, 0x8FF0, + 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, 0xAD7E, 0x8FE5, 0xADA1, + 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, 0xADA4, 0x8FE8, 0xADA5, 0x90CA, + 0xADA6, 0x90CE, 0xADA7, 0x90C1, 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, + 0x914A, 0xADAB, 0x91CD, 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, + 0xADAF, 0x964C, 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, + 0x97CB, 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, + 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, 0xADBC, + 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, 0xADC0, 0x5023, + 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, 0xADC4, 0x4FF8, 0xADC5, + 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, 0xADC8, 0x503C, 0xADC9, 0x501F, + 0xADCA, 0x501A, 0xADCB, 0x5012, 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, + 0x5000, 0xADCF, 0x5014, 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, + 0xADD3, 0x500B, 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, + 0x4FEE, 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, 0xADE0, + 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, 0xADE4, 0x51CB, + 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, 0xADE8, 0x525B, 0xADE9, + 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, 0xADEC, 0x539F, 0xADED, 0x539D, + 0xADEE, 0x53DF, 0xADEF, 0x54E8, 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, + 0x5537, 0xADF3, 0x54FC, 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, + 0xADF7, 0x54FA, 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, + 0x54E1, 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, + 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, 0xAE45, + 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, 0xAE49, 0x57CB, + 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, 0xAE4D, 0x5957, 0xAE4E, + 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, 0xAE51, 0x5A18, 0xAE52, 0x5A1C, + 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, + 0x5A20, 0xAE58, 0x5A23, 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, + 0xAE5C, 0x5A09, 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, + 0x5BB3, 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, 0xAE69, + 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, 0xAE6D, 0x5CFB, + 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, 0xAE71, 0x5CF6, 0xAE72, + 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, + 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, + 0x5F92, 0xAE7C, 0x5F91, 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, + 0xAEA2, 0x6065, 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, + 0x6069, 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, + 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, 0xAEAF, + 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, 0xAEB3, 0x62FF, + 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, 0xAEB7, 0x6355, 0xAEB8, + 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, 0xAEBB, 0x6349, 0xAEBC, 0x633A, + 0xAEBD, 0x6350, 0xAEBE, 0x633D, 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, + 0x6328, 0xAEC2, 0x634D, 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, + 0xAEC6, 0x6599, 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, + 0x6649, 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, 0xAED3, + 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, 0xAED7, 0x6848, + 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, 0xAEDB, 0x6842, 0xAEDC, + 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, 0xAEDF, 0x6817, 0xAEE0, 0x684C, + 0xAEE1, 0x6851, 0xAEE2, 0x683D, 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, + 0x6840, 0xAEE6, 0x683C, 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, + 0xAEEA, 0x6813, 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, + 0x6B89, 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, + 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, 0xAEF7, + 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, 0xAEFB, 0x6D78, + 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, 0xAF40, 0x6D6C, 0xAF41, + 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, 0xAF44, 0x6D74, 0xAF45, 0x6D69, + 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, + 0x6D65, 0xAF4B, 0x6D94, 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, + 0xAF4F, 0x70D9, 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, + 0x7279, 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, 0xAF5C, + 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, 0xAF60, 0x7554, + 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, 0xAF64, 0x7559, 0xAF65, + 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, 0xAF68, 0x75B2, 0xAF69, 0x75B3, + 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, + 0x75B8, 0xAF6F, 0x768B, 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, + 0xAF73, 0x76CE, 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, + 0x7728, 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, + 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, 0xAFA2, + 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, 0xAFA6, 0x7955, + 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, 0xAFAA, 0x7956, 0xAFAB, + 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, 0xAFAE, 0x795A, 0xAFAF, 0x79E4, + 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, + 0x79E9, 0xAFB5, 0x79D8, 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, + 0xAFB9, 0x7B06, 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, + 0x7D17, 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, 0xAFC6, + 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, 0xAFCA, 0x7F3A, + 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, 0xAFCE, 0x7FC1, 0xAFCF, + 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, 0xAFD2, 0x8019, 0xAFD3, 0x8017, + 0xAFD4, 0x803D, 0xAFD5, 0x803F, 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, + 0x80F0, 0xAFD9, 0x8105, 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, + 0xAFDD, 0x80F8, 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, + 0x810A, 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, + 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, 0xAFEA, + 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, 0xAFEE, 0x8352, + 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, 0xAFF2, 0x8350, 0xAFF3, + 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, 0xAFF6, 0x834F, 0xAFF7, 0x8332, + 0xAFF8, 0x8339, 0xAFF9, 0x8336, 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, + 0x8331, 0xAFFD, 0x8328, 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, + 0xB042, 0x86AA, 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, + 0x868C, 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, 0xB04F, + 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, 0xB053, 0x8A15, + 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, 0xB057, 0x8A16, 0xB058, + 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, 0xB05B, 0x8C7A, 0xB05C, 0x8C79, + 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, + 0x8ED2, 0xB062, 0x8ED4, 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, + 0xB066, 0x9006, 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, + 0x8FF4, 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, + 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, 0xB073, + 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, 0xB077, 0x91DD, + 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, 0xB07B, 0x9583, 0xB07C, + 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, 0xB0A1, 0x965B, 0xB0A2, 0x965D, + 0xB0A3, 0x9664, 0xB0A4, 0x9658, 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, + 0x98E2, 0xB0A8, 0x99AC, 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, + 0xB0AC, 0x9B32, 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, + 0x507D, 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, 0xB0B9, + 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, 0xB0BD, 0x5077, + 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, 0xB0C1, 0x506D, 0xB0C2, + 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, 0xB0C5, 0x526A, 0xB0C6, 0x526F, + 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, + 0x5310, 0xB0CC, 0x530F, 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, + 0xB0D0, 0x533E, 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, + 0x556A, 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, + 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, 0xB0DD, + 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, 0xB0E1, 0x5538, + 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, 0xB0E5, 0x5563, 0xB0E6, + 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, 0xB0E9, 0x5708, 0xB0EA, 0x570B, + 0xB0EB, 0x5709, 0xB0EC, 0x57DF, 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, + 0x5806, 0xB0F0, 0x57E0, 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, + 0xB0F4, 0x5835, 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, + 0x5962, 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, 0xB142, + 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, 0xB146, 0x5BC7, + 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, 0xB14A, 0x5BBF, 0xB14B, + 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, 0xB14E, 0x5C07, 0xB14F, 0x5C60, + 0xB150, 0x5C5C, 0xB151, 0x5C5D, 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, + 0x5D0E, 0xB155, 0x5D1B, 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, + 0xB159, 0x5D29, 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, + 0x5D27, 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, + 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, 0xB166, + 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, 0xB16A, 0x5F37, + 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, 0xB16E, 0x5F6B, 0xB16F, + 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, 0xB172, 0x5F98, 0xB173, 0x5FA1, + 0xB174, 0x5FA0, 0xB175, 0x5F9C, 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, + 0x6089, 0xB179, 0x60A0, 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, + 0xB17D, 0x60E6, 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, + 0x60B5, 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, 0xB1AC, + 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, 0xB1B0, 0x63A0, + 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, 0xB1B4, 0x63A2, 0xB1B5, + 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, 0xB1B8, 0x6398, 0xB1B9, 0x63AA, + 0xB1BA, 0x6371, 0xB1BB, 0x63A9, 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, + 0x639B, 0xB1BF, 0x636B, 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, + 0xB1C3, 0x6399, 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, + 0x638F, 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, + 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, 0xB1D0, + 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, 0xB1D4, 0x6558, + 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, 0xB1D8, 0x659B, 0xB1D9, + 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, + 0xB1DE, 0x665D, 0xB1DF, 0x665A, 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, + 0x6666, 0xB1E3, 0x665E, 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, + 0xB1E7, 0x6881, 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, + 0x68B5, 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, 0xB1F4, + 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, 0xB1F8, 0x689D, + 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, 0xB1FC, 0x6882, 0xB1FD, + 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, 0xB241, 0x6BEC, 0xB242, 0x6C2B, + 0xB243, 0x6D8E, 0xB244, 0x6DBC, 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, + 0x6DB2, 0xB248, 0x6DE1, 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, + 0xB24C, 0x6DFA, 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, + 0x6DAF, 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, + 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, 0xB259, + 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, 0xB25D, 0x6DEB, + 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, 0xB261, 0x6DEE, 0xB262, + 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, 0xB265, 0x6DAA, 0xB266, 0x6DEC, + 0xB267, 0x6DBF, 0xB268, 0x6DE6, 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, + 0x710A, 0xB26C, 0x70FD, 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, + 0xB270, 0x7281, 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, + 0x7313, 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, 0xB27D, + 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, 0xB2A3, 0x7522, + 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, 0xB2A7, 0x7570, 0xB2A8, + 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, + 0xB2AD, 0x75CD, 0xB2AE, 0x768E, 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, + 0x76DB, 0xB2B2, 0x7737, 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, + 0xB2B6, 0x7738, 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, + 0x784E, 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, + 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, 0xB2C3, + 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, 0xB2C7, 0x7B1E, + 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, 0xB2CB, 0x7C95, 0xB2CC, + 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, + 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, + 0x7D44, 0xB2D6, 0x7D2F, 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, + 0xB2DA, 0x7F3D, 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, + 0x7FCE, 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, 0xB2E7, + 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, 0xB2EB, 0x8235, + 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, 0xB2EF, 0x838E, 0xB2F0, + 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, 0xB2F3, 0x83A2, 0xB2F4, 0x8396, + 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, + 0x8393, 0xB2FA, 0x8389, 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, + 0xB2FE, 0x837C, 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, + 0x5F6A, 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, + 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, 0xB34C, + 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, 0xB350, 0x8888, + 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, 0xB354, 0x888D, 0xB355, + 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, 0xB358, 0x8A2A, 0xB359, 0x8A1D, + 0xB35A, 0x8A23, 0xB35B, 0x8A25, 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, + 0x8A1F, 0xB35F, 0x8A1B, 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, + 0xB363, 0x8CA9, 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, + 0x8CAA, 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, 0xB370, + 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, 0xB374, 0x901F, + 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, 0xB378, 0x901E, 0xB379, + 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, 0xB37C, 0x9016, 0xB37D, 0x901B, + 0xB37E, 0x9014, 0xB3A1, 0x90E8, 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, + 0x9157, 0xB3A5, 0x91CE, 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, + 0xB3A9, 0x91E7, 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, + 0x966A, 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, + 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, 0xB3B6, + 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, 0xB3BA, 0x7ADF, + 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, 0xB3BE, 0x9CE5, 0xB3BF, + 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, + 0xB3C4, 0x508D, 0xB3C5, 0x5085, 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, + 0x5080, 0xB3C9, 0x5096, 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, + 0xB3CD, 0x51F1, 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, + 0x5269, 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, 0xB3DA, + 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, 0xB3DE, 0x5582, + 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, 0xB3E2, 0x5587, 0xB3E3, + 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, 0xB3E6, 0x55AE, 0xB3E7, 0x559F, + 0xB3E8, 0x553E, 0xB3E9, 0x55B2, 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, + 0x55AC, 0xB3ED, 0x55B1, 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, + 0xB3F1, 0x5599, 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, + 0x5834, 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, + 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, 0xB3FE, + 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, 0xB443, 0x5A92, + 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, 0xB447, 0x5B71, 0xB448, + 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, + 0xB44D, 0x5C0B, 0xB44E, 0x5C31, 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, + 0x5D34, 0xB452, 0x5D47, 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, + 0xB456, 0x5E40, 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, + 0x5EC1, 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, 0xB463, + 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, 0xB467, 0x611C, + 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, 0xB46B, 0x60F0, 0xB46C, + 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, 0xB46F, 0x60F1, 0xB470, 0x610E, + 0xB471, 0x60F6, 0xB472, 0x6109, 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, + 0x621F, 0xB476, 0x6249, 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, + 0xB47A, 0x63C0, 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, + 0x63CD, 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, + 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, 0xB4A9, + 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, 0xB4AD, 0x63DA, + 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, 0xB4B1, 0x6562, 0xB4B2, + 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, 0xB4B5, 0x65AF, 0xB4B6, 0x666E, + 0xB4B7, 0x6670, 0xB4B8, 0x6674, 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, + 0x6691, 0xB4BC, 0x667A, 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, + 0xB4C0, 0x66FF, 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, + 0x68D5, 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, 0xB4CD, + 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, 0xB4D1, 0x68CB, + 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, 0xB4D5, 0x690E, 0xB4D6, + 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, + 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, + 0x6BBC, 0xB4E0, 0x6BEF, 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, + 0xB4E4, 0x6E2F, 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, + 0x6E32, 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, + 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, 0xB4F1, + 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, 0xB4F5, 0x6E26, + 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, 0xB4F9, 0x6E3A, 0xB4FA, + 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, + 0xB540, 0x6E89, 0xB541, 0x6E19, 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, + 0x6E44, 0xB545, 0x6E72, 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, + 0xB549, 0x711A, 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, + 0x7136, 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, 0xB556, + 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, 0xB55A, 0x7422, + 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, 0xB55E, 0x7434, 0xB55F, + 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, 0xB562, 0x7428, 0xB563, 0x7525, + 0xB564, 0x7526, 0xB565, 0x756B, 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, + 0x75DB, 0xB569, 0x75E3, 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, + 0xB56D, 0x75E0, 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, + 0x7693, 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, + 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, 0xB57A, + 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, 0xB57E, 0x7A98, + 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, 0xB5A4, 0x7AE3, 0xB5A5, + 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, + 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, + 0x7B51, 0xB5AF, 0x7C9F, 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, + 0xB5B3, 0x7D68, 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, + 0x7D72, 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, 0xB5C0, + 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, 0xB5C4, 0x8154, + 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, 0xB5C8, 0x8139, 0xB5C9, + 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, 0xB5CC, 0x8153, 0xB5CD, 0x8174, + 0xB5CE, 0x8212, 0xB5CF, 0x821C, 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, + 0x83F8, 0xB5D3, 0x840D, 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, + 0xB5D7, 0x83C1, 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, + 0x8457, 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, + 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, 0xB5E4, + 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, 0xB5E8, 0x83D4, + 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, 0xB5EC, 0x86D9, 0xB5ED, + 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, + 0xB5F2, 0x86DE, 0xB5F3, 0x8857, 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, + 0x88B1, 0xB5F7, 0x8983, 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, + 0xB5FB, 0x8A55, 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, + 0x8A54, 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, 0xB649, + 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, 0xB64D, 0x8CBD, + 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, 0xB651, 0x8CB4, 0xB652, + 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, 0xB655, 0x8CB8, 0xB656, 0x8D8A, + 0xB657, 0x8D85, 0xB658, 0x8D81, 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, + 0x8DCB, 0xB65C, 0x8DDA, 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, + 0xB660, 0x8DC6, 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, + 0x8F9C, 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, + 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, 0xB66D, + 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, 0xB671, 0x91CF, + 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, 0xB675, 0x9209, 0xB676, + 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, 0xB679, 0x9207, 0xB67A, 0x9211, + 0xB67B, 0x9594, 0xB67C, 0x958F, 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, + 0x9593, 0xB6A2, 0x9592, 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, + 0xB6A6, 0x968B, 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, + 0x968D, 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, 0xB6B3, + 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, 0xB6B7, 0x9808, + 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, 0xB6BB, 0x98E9, 0xB6BC, + 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, + 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, + 0x50B5, 0xB6C6, 0x50B2, 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, + 0xB6CA, 0x50AC, 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, + 0x50C7, 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, + 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, 0xB6D7, + 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, 0xB6DB, 0x55E6, + 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, 0xB6DF, 0x55D1, 0xB6E0, + 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, + 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, + 0x5712, 0xB6EA, 0x5713, 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, + 0xB6EE, 0x5857, 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, + 0x584C, 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, 0xB6FB, + 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, 0xB740, 0x5AB3, + 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, 0xB744, 0x5D6F, 0xB745, + 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, 0xB748, 0x5EC8, 0xB749, 0x5F12, + 0xB74A, 0x5F59, 0xB74B, 0x5FAC, 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, + 0x610F, 0xB74F, 0x6148, 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, + 0xB753, 0x60F9, 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, + 0x614C, 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, + 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, 0xB760, + 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, 0xB764, 0x641E, + 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, 0xB768, 0x642C, 0xB769, + 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, 0xB76C, 0x640D, 0xB76D, 0x6436, + 0xB76E, 0x6416, 0xB76F, 0x6417, 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, + 0x659F, 0xB773, 0x65B0, 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, + 0xB777, 0x6688, 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, + 0x668D, 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, 0xB7A6, + 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, 0xB7AA, 0x696B, + 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, 0xB7AE, 0x6986, 0xB7AF, + 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, + 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, + 0x6EA2, 0xB7B9, 0x6EAF, 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, + 0xB7BD, 0x6E90, 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, + 0x6EA5, 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, + 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, 0xB7CA, + 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, 0xB7CE, 0x714E, + 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, 0xB7D2, 0x7149, 0xB7D3, + 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, 0xB7D6, 0x7166, 0xB7D7, 0x714C, + 0xB7D8, 0x7165, 0xB7D9, 0x715E, 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, + 0x7156, 0xB7DD, 0x723A, 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, + 0xB7E1, 0x733F, 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, + 0x7455, 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, 0xB7EE, + 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, 0xB7F2, 0x75F2, + 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, 0xB7F6, 0x75F4, 0xB7F7, + 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, 0xB7FA, 0x775B, 0xB7FB, 0x776B, + 0xB7FC, 0x7766, 0xB7FD, 0x775E, 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, + 0x776A, 0xB842, 0x776C, 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, + 0xB846, 0x7762, 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, + 0x7897, 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, + 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, 0xB853, + 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, 0xB857, 0x7A1C, + 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, 0xB85B, 0x7A1F, 0xB85C, + 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, 0xB85F, 0x7B77, 0xB860, 0x7BC0, + 0xB861, 0x7B60, 0xB862, 0x7B6E, 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, + 0x7CB3, 0xB866, 0x7CB5, 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, + 0xB86A, 0x7D81, 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, + 0x7F69, 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, 0xB877, + 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, 0xB87B, 0x8165, + 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, 0xB8A1, 0x8179, 0xB8A2, + 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, 0xB8A5, 0x8247, 0xB8A6, 0x8482, + 0xB8A7, 0x8477, 0xB8A8, 0x843D, 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, + 0x8466, 0xB8AC, 0x846B, 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, + 0xB8B0, 0x843C, 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, + 0x8469, 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, + 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, 0xB8BD, + 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, 0xB8C1, 0x8702, + 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, 0xB8C5, 0x8859, 0xB8C6, + 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, + 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, + 0x88D2, 0xB8D0, 0x899C, 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, + 0xB8D4, 0x8A73, 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, + 0x8A87, 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, 0xB8E1, + 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, 0xB8E5, 0x8A68, + 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, 0xB8E9, 0x8CCA, 0xB8EA, + 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, + 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, + 0x8DE8, 0xB8F4, 0x8DEF, 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, + 0xB8F8, 0x8DE4, 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, + 0x8F09, 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, + 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, 0xB946, + 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, 0xB94A, 0x9047, + 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, 0xB94E, 0x9051, 0xB94F, + 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, 0xB952, 0x9117, 0xB953, 0x916C, + 0xB954, 0x916A, 0xB955, 0x9169, 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, + 0x9257, 0xB959, 0x9238, 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, + 0xB95D, 0x925B, 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, + 0x9234, 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, 0xB96A, + 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, 0xB96E, 0x96C9, + 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, 0xB972, 0x96F9, 0xB973, + 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, 0xB976, 0x9776, 0xB977, 0x9810, + 0xB978, 0x9811, 0xB979, 0x9813, 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, + 0x980C, 0xB97D, 0x98FC, 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, + 0xB9A3, 0x99B3, 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, + 0x9CE9, 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, + 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, 0xB9B0, + 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, 0xB9B4, 0x50D1, + 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, 0xB9B8, 0x5162, 0xB9B9, + 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, 0xB9BC, 0x5331, 0xB9BD, 0x53AD, + 0xB9BE, 0x55FE, 0xB9BF, 0x5600, 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, + 0x55FD, 0xB9C3, 0x5614, 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, + 0xB9C7, 0x560E, 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, + 0x5608, 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, 0xB9D4, + 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, 0xB9D8, 0x58FD, + 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, 0xB9DC, 0x596A, 0xB9DD, + 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, + 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, + 0x5BDE, 0xB9E7, 0x5BE7, 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, + 0xB9EB, 0x5BE8, 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, + 0x5C0D, 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, + 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, 0xB9F8, + 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, 0xB9FC, 0x5F70, + 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, 0xBA41, 0x614B, 0xBA42, + 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, 0xBA45, 0x615F, 0xBA46, 0x615A, + 0xBA47, 0x6158, 0xBA48, 0x6175, 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, + 0x6458, 0xBA4C, 0x6454, 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, + 0xBA50, 0x647A, 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, + 0x646D, 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, 0xBA5D, + 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, 0xBA61, 0x69AE, + 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, 0xBA65, 0x69B7, 0xBA66, + 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, 0xBA69, 0x69D0, 0xBA6A, 0x69CD, + 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, + 0x69A3, 0xBA70, 0x6B49, 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, + 0xBA74, 0x6F14, 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, + 0x6F29, 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, + 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, 0xBAA3, + 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, 0xBAA7, 0x6F23, + 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, 0xBAAB, 0x6F88, 0xBAAC, + 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, + 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, + 0x718A, 0xBAB6, 0x7184, 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, + 0xBABA, 0x7296, 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, + 0x7463, 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, 0xBAC7, + 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, 0xBACB, 0x7784, + 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, 0xBACF, 0x78C1, 0xBAD0, + 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, + 0xBAD5, 0x798E, 0xBAD6, 0x798F, 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, + 0x7A31, 0xBADA, 0x7AAA, 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, + 0xBADE, 0x7BA1, 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, + 0x7B97, 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, + 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, 0xBAEB, + 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, 0xBAEF, 0x7DBD, + 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, 0xBAF3, 0x7DB4, 0xBAF4, + 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, + 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, + 0x7DC7, 0xBAFE, 0x7DAC, 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, + 0xBB43, 0x7FDF, 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, + 0x8150, 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, 0xBB50, + 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, 0xBB54, 0x84C9, + 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, 0xBB58, 0x8499, 0xBB59, + 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, + 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, + 0x84D1, 0xBB63, 0x84CA, 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, + 0xBB67, 0x8722, 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, + 0x8755, 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, + 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, 0xBB74, + 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, 0xBB78, 0x8A8C, + 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, 0xBB7C, 0x8AA1, 0xBB7D, + 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, + 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, + 0x8C6A, 0xBBA9, 0x8C8D, 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, + 0xBBAD, 0x8CD2, 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, + 0x8DFC, 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, 0xBBBA, + 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, 0xBBBE, 0x905D, + 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, 0xBBC2, 0x911E, 0xBBC3, + 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, 0xBBC6, 0x9174, 0xBBC7, 0x9278, + 0xBBC8, 0x9280, 0xBBC9, 0x9285, 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, + 0x927B, 0xBBCD, 0x9293, 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, + 0xBBD1, 0x9291, 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, + 0x95A3, 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, + 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, 0xBBDE, + 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, 0xBBE2, 0x9818, + 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, 0xBBE6, 0x9905, 0xBBE7, + 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, + 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, + 0x9CF6, 0xBBF1, 0x9CF3, 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, + 0xBBF5, 0x5104, 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, + 0x50F9, 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, 0xBC43, + 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, 0xBC47, 0x562E, + 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, 0xBC4B, 0x563F, 0xBC4C, + 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, 0xBC4F, 0x564E, 0xBC50, 0x5657, + 0xBC51, 0x5674, 0xBC52, 0x5636, 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, + 0x5880, 0xBC56, 0x589F, 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, + 0xBC5A, 0x58AE, 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, + 0x5B09, 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, + 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, 0xBC67, + 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, 0xBC6B, 0x5D94, + 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, 0xBC6F, 0x5EE2, 0xBC70, + 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, + 0xBC75, 0x5F48, 0xBC76, 0x5F71, 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, + 0x6176, 0xBC7A, 0x6167, 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, + 0xBC7E, 0x6182, 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, + 0x617E, 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, 0xBCAD, + 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, 0xBCB1, 0x6479, + 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, 0xBCB5, 0x6490, 0xBCB6, + 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, 0xBCB9, 0x6495, 0xBCBA, 0x64A9, + 0xBCBB, 0x6492, 0xBCBC, 0x64AE, 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, + 0x649A, 0xBCC0, 0x64AC, 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, + 0xBCC4, 0x6575, 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, + 0x66AB, 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, + 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, 0xBCD1, + 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, 0xBCD5, 0x69F3, + 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, 0xBCD9, 0x6A11, 0xBCDA, + 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, + 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, + 0x6F66, 0xBCE4, 0x6F54, 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, + 0xBCE8, 0x6F78, 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, + 0x6F70, 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, 0xBCF5, + 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, 0xBCF9, 0x729B, + 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, 0xBCFD, 0x748B, 0xBCFE, + 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, 0xBD42, 0x757F, 0xBD43, 0x7620, + 0xBD44, 0x7629, 0xBD45, 0x761F, 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, + 0x7621, 0xBD49, 0x7622, 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, + 0xBD4D, 0x778E, 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, + 0x778B, 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, + 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, 0xBD5A, + 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, 0xBD5E, 0x7A37, + 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, 0xBD62, 0x7BAD, 0xBD63, + 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, + 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, + 0x7DE0, 0xBD6D, 0x7DF4, 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, + 0xBD71, 0x7DEC, 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, + 0x7DDA, 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, 0xBD7E, + 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, 0xBDA4, 0x819C, + 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, 0xBDA8, 0x8198, 0xBDA9, + 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, 0xBDAC, 0x84EE, 0xBDAD, 0x852C, + 0xBDAE, 0x852D, 0xBDAF, 0x8513, 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, + 0x8521, 0xBDB3, 0x8514, 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, + 0xBDB7, 0x8506, 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, + 0x8760, 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, + 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, 0xBDC4, + 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, 0xBDC8, 0x8913, + 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, 0xBDCC, 0x8AD2, 0xBDCD, + 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, + 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, + 0x8AB0, 0xBDD7, 0x8AD6, 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, + 0xBDDB, 0x8ADB, 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, + 0x8CE0, 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, 0xBDE8, + 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, 0xBDEC, 0x8DA3, + 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, 0xBDF0, 0x8E22, 0xBDF1, + 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, + 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, + 0x8F29, 0xBDFB, 0x8F26, 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, + 0xBE40, 0x8F25, 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, + 0x906D, 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, + 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, 0xBE4D, + 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, 0xBE51, 0x92EA, + 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, 0xBE55, 0x92B3, 0xBE56, + 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, 0xBE59, 0x92F0, 0xBE5A, 0x92B2, + 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, + 0x9707, 0xBE60, 0x9709, 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, + 0xBE64, 0x978F, 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, + 0x98B3, 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, 0xBE71, + 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, 0xBE75, 0x9AB7, + 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, 0xBE79, 0x9B45, 0xBE7A, + 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, + 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, + 0x58A8, 0xBEA6, 0x9F52, 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, + 0xBEAA, 0x5110, 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, + 0x51DD, 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, + 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, 0xBEB7, + 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, 0xBEBB, 0x5671, + 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, 0xBEBF, 0x5676, 0xBEC0, + 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, 0xBEC3, 0x58C5, 0xBEC4, 0x596E, + 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, + 0x5C0E, 0xBECA, 0x5F4A, 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, + 0xBECE, 0x618A, 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, + 0x61CA, 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, 0xBEDB, + 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, 0xBEDF, 0x64BF, + 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, 0xBEE3, 0x6574, 0xBEE4, + 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, + 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, + 0x6A59, 0xBEEE, 0x6A6B, 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, + 0xBEF2, 0x6A62, 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, + 0x6A35, 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, + 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, 0xBF40, + 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, 0xBF44, 0x6FB3, + 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, 0xBF48, 0x6FA6, 0xBF49, + 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, + 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, + 0x71CE, 0xBF53, 0x71D9, 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, + 0xBF57, 0x7368, 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, + 0x749F, 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, 0xBF64, + 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, 0xBF68, 0x77A5, + 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, 0xBF6C, 0x78E7, 0xBF6D, + 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, 0xBF70, 0x7A46, 0xBF71, 0x7A4C, + 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, + 0x7BC9, 0xBF77, 0x7BE4, 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, + 0xBF7B, 0x7BE6, 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, + 0x7E11, 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, + 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, 0xBFAA, + 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, 0xBFAE, 0x8028, + 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, 0xBFB2, 0x81FB, 0xBFB3, + 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, 0xBFB6, 0x854A, 0xBFB7, 0x8559, + 0xBFB8, 0x8548, 0xBFB9, 0x8568, 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, + 0x8549, 0xBFBD, 0x856D, 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, + 0xBFC1, 0x879F, 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, + 0x8861, 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, 0xBFCE, + 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, 0xBFD2, 0x8ADC, + 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, 0xBFD6, 0x8B01, 0xBFD7, + 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, + 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, + 0x8CF4, 0xBFE1, 0x8E44, 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, + 0xBFE5, 0x8E39, 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, + 0x8F38, 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, + 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, 0xBFF2, + 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, 0xBFF6, 0x9336, + 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, 0xBFFA, 0x9322, 0xBFFB, + 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, 0xBFFE, 0x931A, 0xC040, 0x9310, + 0xC041, 0x9326, 0xC042, 0x9321, 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, + 0x9319, 0xC046, 0x95BB, 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, + 0xC04A, 0x96D5, 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, + 0x970D, 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, 0xC057, + 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, 0xC05B, 0x9824, + 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, 0xC05F, 0x991B, 0xC060, + 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, 0xC063, 0x99E2, 0xC064, 0x99F1, + 0xC065, 0x9AB8, 0xC066, 0x9ABC, 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, + 0x9B28, 0xC06A, 0x9B91, 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, + 0xC06E, 0x9D28, 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, + 0x9ED4, 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, + 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, 0xC07B, + 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, 0xC0A1, 0x568F, + 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, 0xC0A5, 0x58CE, 0xC0A6, + 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, + 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, + 0x5DB8, 0xC0B0, 0x5E6B, 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, + 0xC0B4, 0x61C2, 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, + 0x6232, 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, 0xC0C1, + 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, 0xC0C5, 0x6583, + 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, 0xC0C9, 0x6A94, 0xC0CA, + 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, + 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, + 0x6B5C, 0xC0D4, 0x6BAE, 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, + 0xC0D8, 0x6FF1, 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, + 0x6FE4, 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, + 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, 0xC0E5, + 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, 0xC0E9, 0x71E6, + 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, 0xC0ED, 0x71F4, 0xC0EE, + 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, 0xC0F1, 0x7370, 0xC0F2, 0x7372, + 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, + 0x7646, 0xC0F8, 0x7642, 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, + 0xC0FC, 0x77AA, 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, + 0x77AD, 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, 0xC14A, + 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, 0xC14E, 0x7BFE, + 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, 0xC152, 0x7CE0, 0xC153, + 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, 0xC156, 0x7CDF, 0xC157, 0x7CD9, + 0xC158, 0x7CDD, 0xC159, 0x7E2E, 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, + 0x7E37, 0xC15D, 0x7E32, 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, + 0xC161, 0x7E31, 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, + 0x7E39, 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, + 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, 0xC16E, + 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, 0xC172, 0x81C6, + 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, 0xC176, 0x81C0, 0xC177, + 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, 0xC17A, 0x81BE, 0xC17B, 0x81E8, + 0xC17C, 0x8209, 0xC17D, 0x8271, 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, + 0x857E, 0xC1A3, 0x859C, 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, + 0xC1A7, 0x859B, 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, + 0x8667, 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, 0xC1B4, + 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, 0xC1B8, 0x8944, + 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, 0xC1BC, 0x8B0E, 0xC1BD, + 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, + 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, + 0x8C3F, 0xC1C7, 0x8C73, 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, + 0xC1CB, 0x8CF8, 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, + 0x8E4B, 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, + 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, 0xC1D8, + 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, 0xC1DC, 0x9080, + 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, 0xC1E0, 0x919C, 0xC1E1, + 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, 0xC1E4, 0x9375, 0xC1E5, 0x934A, + 0xC1E6, 0x9365, 0xC1E7, 0x934B, 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, + 0x936C, 0xC1EB, 0x935B, 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, + 0xC1EF, 0x95CA, 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, + 0x95C6, 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, 0xC1FC, + 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, 0xC241, 0x9BAE, + 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, 0xC245, 0x9D3B, 0xC246, + 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, 0xC249, 0x9EDE, 0xC24A, 0x9EDC, + 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, + 0x53E2, 0xC250, 0x5695, 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, + 0xC254, 0x5B38, 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, + 0x64F4, 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, + 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, 0xC261, + 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, 0xC265, 0x6ABB, + 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, 0xC269, 0x6AAF, 0xC26A, + 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, 0xC26D, 0x7009, 0xC26E, 0x700B, + 0xC26F, 0x6FFE, 0xC270, 0x7006, 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, + 0x700F, 0xC274, 0x71FB, 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, + 0xC278, 0x7377, 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, + 0x7515, 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, 0xC2A7, + 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, 0xC2AB, 0x7AC4, + 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, 0xC2AF, 0x7C2A, 0xC2B0, + 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, + 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, + 0x7E52, 0xC2BA, 0x7E59, 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, + 0xC2BE, 0x8077, 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, + 0x820A, 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, + 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, 0xC2CB, + 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, 0xC2CF, 0x87E0, + 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, 0xC2D3, 0x8B28, 0xC2D4, + 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, + 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, + 0x8E5F, 0xC2DE, 0x8E55, 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, + 0xC2E2, 0x9087, 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, + 0x91AC, 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, 0xC2EF, + 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, 0xC2F3, 0x95D4, + 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, 0xC2F7, 0x96E2, 0xC2F8, + 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, 0xC2FB, 0x96DE, 0xC2FC, 0x9724, + 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, + 0x984D, 0xC343, 0x984F, 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, + 0xC347, 0x98BA, 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, + 0x992E, 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, + 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, 0xC354, + 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, 0xC358, 0x9BC0, + 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, 0xC35C, 0x9EE0, 0xC35D, + 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, 0xC360, 0x56A5, 0xC361, 0x58DE, + 0xC362, 0x58DF, 0xC363, 0x58E2, 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, + 0x5EEC, 0xC367, 0x61F2, 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, + 0xC36B, 0x6500, 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, + 0x6AE5, 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, 0xC378, + 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, 0xC37C, 0x7258, + 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, 0xC3A2, 0x74BD, 0xC3A3, + 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, 0xC3A6, 0x7586, 0xC3A7, 0x765F, + 0xC3A8, 0x7661, 0xC3A9, 0x77C7, 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, + 0x7A6B, 0xC3AD, 0x7A69, 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, + 0xC3B1, 0x7C3D, 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, + 0x7E6D, 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, + 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, 0xC3BE, + 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, 0xC3C2, 0x85D5, + 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, 0xC3C6, 0x87FB, 0xC3C7, + 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, 0xC3CA, 0x87FE, 0xC3CB, 0x8960, + 0xC3CC, 0x895F, 0xC3CD, 0x8956, 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, + 0x8B5C, 0xC3D1, 0x8B58, 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, + 0xC3D5, 0x8B4F, 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, + 0x8D0A, 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, 0xC3E2, + 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, 0xC3E6, 0x91B1, + 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, 0xC3EA, 0x93DF, 0xC3EB, + 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, + 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, + 0x93D7, 0xC3F5, 0x93E8, 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, + 0xC3F9, 0x972A, 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, + 0x97FB, 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, + 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, 0xC447, + 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, 0xC44B, 0x9BDB, + 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, 0xC44F, 0x9D6A, 0xC450, + 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, 0xC453, 0x9E93, 0xC454, 0x9EB4, + 0xC455, 0x52F8, 0xC456, 0x56A8, 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, + 0x56B4, 0xC45A, 0x56BC, 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, + 0xC45E, 0x5B7D, 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, + 0x61FA, 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, 0xC46B, + 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, 0xC46F, 0x7662, + 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, 0xC473, 0x792C, 0xC474, + 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, 0xC477, 0x7C4C, 0xC478, 0x7C43, + 0xC479, 0x7C4D, 0xC47A, 0x7CEF, 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, + 0x7E7D, 0xC47E, 0x7E7C, 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, + 0xC4A4, 0x81DA, 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, + 0x8611, 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, + 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, 0xC4B1, + 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, 0xC4B5, 0x8B66, + 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, 0xC4B9, 0x8D0F, 0xC4BA, + 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, + 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, + 0x93FD, 0xC4C4, 0x95E1, 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, + 0xC4C8, 0x9951, 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, + 0x9A37, 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, 0xC4D5, + 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, 0xC4D9, 0x56C1, + 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, 0xC4DD, 0x5C6C, 0xC4DE, + 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, 0xC4E1, 0x651D, 0xC4E2, 0x651C, + 0xC4E3, 0x6595, 0xC4E4, 0x66E9, 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, + 0x6AFA, 0xC4E8, 0x6BB2, 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, + 0xC4EC, 0x74D6, 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, + 0x7C50, 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, + 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, 0xC4F9, + 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, 0xC4FD, 0x89BD, + 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, 0xC542, 0x8D13, 0xC543, + 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, 0xC546, 0x8F5F, 0xC547, 0x8FAF, + 0xC548, 0x91BA, 0xC549, 0x942E, 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, + 0x943A, 0xC54D, 0x9438, 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, + 0xC551, 0x9738, 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, + 0x9867, 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, 0xC55E, + 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, 0xC562, 0x9DB4, + 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, 0xC566, 0x9EEF, 0xC567, + 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, 0xC56A, 0x9F67, 0xC56B, 0x513C, + 0xC56C, 0x513B, 0xC56D, 0x56C8, 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, + 0x5B7F, 0xC571, 0x5DD4, 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, + 0xC575, 0x6524, 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, + 0x7058, 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, + 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, 0xC5A4, + 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, 0xC5A8, 0x896F, + 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, 0xC5AC, 0x8D17, 0xC5AD, + 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, 0xC5B0, 0x9148, 0xC5B1, 0x9444, + 0xC5B2, 0x9451, 0xC5B3, 0x9452, 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, + 0x97C3, 0xC5B7, 0x97C1, 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, + 0xC5BB, 0x9A4D, 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, + 0x9C31, 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, 0xC5C8, + 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, 0xC5CC, 0x652B, + 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, 0xC5D0, 0x74DA, 0xC5D1, + 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, + 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, + 0x863F, 0xC5DB, 0x8831, 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, + 0xC5DF, 0x9463, 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, + 0x986F, 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, + 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, 0xC5EC, + 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, 0xC5F0, 0x9EF4, + 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, 0xC5F4, 0x705E, 0xC5F5, + 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, + 0xC5FA, 0x8836, 0xC5FB, 0x8839, 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, + 0x8B92, 0xC640, 0x8B96, 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, + 0xC644, 0x946A, 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, + 0x97C6, 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, 0xC651, + 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, 0xC655, 0x5EF3, + 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, 0xC659, 0x7C6E, 0xC65A, + 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, 0xC65D, 0x91C1, 0xC65E, 0x9472, + 0xC65F, 0x9470, 0xC660, 0x9871, 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, + 0x9B23, 0xC664, 0x9ECC, 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, + 0xC668, 0x9477, 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, + 0x7E9C, 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, + 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, 0xC675, + 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, 0xC679, 0x7228, + 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, 0xC67D, 0x9E1E, 0xC67E, + 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, 0xC942, 0x51F5, 0xC943, 0x531A, + 0xC944, 0x5382, 0xC945, 0x4E07, 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, + 0x4E8D, 0xC949, 0x56D7, 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, + 0xC94D, 0x4E0F, 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, + 0x4E93, 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, 0xC95A, + 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, 0xC95E, 0x65E1, + 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, 0xC962, 0x723F, 0xC963, + 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, 0xC966, 0x4EDC, 0xC967, 0x4EE9, + 0xC968, 0x4EE1, 0xC969, 0x4EDD, 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, + 0x531C, 0xC96D, 0x534C, 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, + 0xC971, 0x592F, 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, + 0x5C3B, 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, + 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, 0xC97E, + 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, 0xC9A4, 0x6C3B, + 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, 0xC9A8, 0x79B8, 0xC9A9, + 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, + 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, + 0x4EF7, 0xC9B3, 0x4F08, 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, + 0xC9B7, 0x4F22, 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, + 0x4F12, 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, 0xC9C4, + 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, 0xC9C8, 0x572E, + 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, 0xC9CC, 0x5980, 0xC9CD, + 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, 0xC9D0, 0x597E, 0xC9D1, 0x5977, + 0xC9D2, 0x597F, 0xC9D3, 0x5B56, 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, + 0x5C7C, 0xC9D7, 0x5C7A, 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, + 0xC9DB, 0x5E75, 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, + 0x5F74, 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, + 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, 0xC9E8, + 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, 0xC9EC, 0x6265, + 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, 0xC9F0, 0x6739, 0xC9F1, + 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, 0xC9F4, 0x673F, 0xC9F5, 0x673C, + 0xC9F6, 0x6733, 0xC9F7, 0x6C18, 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, + 0x6C5C, 0xC9FB, 0x6C4F, 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, + 0xCA40, 0x6C4C, 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, + 0x72B5, 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, 0xCA4D, + 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, 0xCA51, 0x9099, + 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, 0xCA55, 0x9094, 0xCA56, + 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, 0xCA59, 0x9623, 0xCA5A, 0x4F56, + 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, + 0x4F64, 0xCA60, 0x4F3E, 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, + 0xCA64, 0x4F41, 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, + 0x4F3F, 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, + 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, 0xCA71, + 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, 0xCA75, 0x538F, + 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, 0xCA79, 0x5454, 0xCA7A, + 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, 0xCA7D, 0x5425, 0xCA7E, 0x5418, + 0xCAA1, 0x543D, 0xCAA2, 0x544F, 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, + 0x5424, 0xCAA6, 0x5447, 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, + 0xCAAA, 0x5741, 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, + 0x574B, 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, 0xCAB7, + 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, 0xCABB, 0x59A1, + 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, 0xCABF, 0x5C2A, 0xCAC0, + 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, + 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, + 0x5C95, 0xCACA, 0x5DE0, 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, + 0xCACE, 0x5E89, 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, + 0x5F05, 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, + 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, 0xCADB, + 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, 0xCADF, 0x5FE3, + 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, 0xCAE3, 0x5FFB, 0xCAE4, + 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, 0xCAE7, 0x6283, 0xCAE8, 0x628C, + 0xCAE9, 0x628E, 0xCAEA, 0x628F, 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, + 0x6271, 0xCAEE, 0x627B, 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, + 0xCAF2, 0x6288, 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, + 0x6274, 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, 0xCB40, + 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, 0xCB44, 0x675D, + 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, 0xCB48, 0x6BD0, 0xCB49, + 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, + 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, + 0x6C6F, 0xCB53, 0x6C69, 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, + 0xCB57, 0x6C95, 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, + 0x6C65, 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, + 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, 0xCB64, + 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, 0xCB68, 0x7395, + 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, 0xCB6C, 0x7392, 0xCB6D, + 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, 0xCB70, 0x7595, 0xCB71, 0x7681, + 0xCB72, 0x793D, 0xCB73, 0x8034, 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, + 0x8090, 0xCB77, 0x8092, 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, + 0xCB7B, 0x8285, 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, + 0x828A, 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, 0xCBAA, + 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, 0xCBAE, 0x9628, + 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, 0xCBB2, 0x4F98, 0xCBB3, + 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, + 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, + 0x4F77, 0xCBBD, 0x4F4C, 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, + 0xCBC1, 0x4F79, 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, + 0x4F9C, 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, + 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, 0xCBCE, + 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, 0xCBD2, 0x5233, + 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, 0xCBD6, 0x530A, 0xCBD7, + 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, 0xCBDA, 0x5394, 0xCBDB, 0x5487, + 0xCBDC, 0x547F, 0xCBDD, 0x5481, 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, + 0x5488, 0xCBE1, 0x546B, 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, + 0xCBE5, 0x546C, 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, + 0x546F, 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, 0xCBF2, + 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, 0xCBF6, 0x5771, + 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, 0xCBFA, 0x5775, 0xCBFB, + 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, 0xCBFE, 0x5762, 0xCC40, 0x5768, + 0xCC41, 0x577D, 0xCC42, 0x590C, 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, + 0x59BA, 0xCC46, 0x59CF, 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, + 0xCC4A, 0x59C1, 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, + 0x59D6, 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, + 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, 0xCC57, + 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, 0xCC5B, 0x5CAE, + 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, 0xCC5F, 0x5CAF, 0xCC60, + 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, + 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, + 0x5CA5, 0xCC6A, 0x5CB6, 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, + 0xCC6E, 0x5E14, 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, + 0x5F23, 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, 0xCC7B, + 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, 0xCCA1, 0x6034, + 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, 0xCCA5, 0x601A, 0xCCA6, + 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, 0xCCA9, 0x600D, 0xCCAA, 0x6010, + 0xCCAB, 0x602E, 0xCCAC, 0x6013, 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, + 0x6009, 0xCCB0, 0x601C, 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, + 0xCCB4, 0x62B4, 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, + 0x62B6, 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, + 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, 0xCCC1, + 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, 0xCCC5, 0x65FC, + 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, 0xCCC9, 0x65FB, 0xCCCA, + 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, 0xCCCD, 0x6605, 0xCCCE, 0x65FD, + 0xCCCF, 0x6611, 0xCCD0, 0x6610, 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, + 0x6785, 0xCCD4, 0x676C, 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, + 0xCCD8, 0x677B, 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, + 0x6774, 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, 0xCCE5, + 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, 0xCCE9, 0x6B25, + 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, 0xCCED, 0x6C1D, 0xCCEE, + 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, + 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, + 0x6CB7, 0xCCF8, 0x6CD0, 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, + 0xCCFC, 0x6CC6, 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, + 0x6CDD, 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, + 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, 0xCD4A, + 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, 0xCD4E, 0x6CE9, + 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, 0xCD52, 0x7085, 0xCD53, + 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, 0xCD56, 0x7091, 0xCD57, 0x7096, + 0xCD58, 0x7082, 0xCD59, 0x709A, 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, + 0x72D6, 0xCD5D, 0x72CB, 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, + 0xCD61, 0x72D2, 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, + 0x72D1, 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, 0xCD6E, + 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, 0xCD72, 0x753E, + 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, 0xCD76, 0x76F3, 0xCD77, + 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, + 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, + 0x7942, 0xCDA3, 0x793F, 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, + 0xCDA7, 0x7AFB, 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, + 0x808F, 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, + 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, 0xCDB4, + 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, 0xCDB8, 0x82B5, + 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, 0xCDBC, 0x829E, 0xCDBD, + 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, + 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, + 0x82A2, 0xCDC7, 0x8670, 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, + 0xCDCB, 0x8C56, 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, + 0x8FCD, 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, 0xCDD8, + 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, 0xCDDC, 0x9643, + 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, 0xCDE0, 0x4FB2, 0xCDE1, + 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, + 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, + 0x4FC7, 0xCDEB, 0x4FD6, 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, + 0xCDEF, 0x4FEC, 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, + 0x52C2, 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, + 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, 0xCDFC, + 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, 0xCE41, 0x830D, + 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, 0xCE45, 0x54B6, 0xCE46, + 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, 0xCE49, 0x5470, 0xCE4A, 0x54BC, + 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, + 0x54B0, 0xCE50, 0x57B5, 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, + 0xCE54, 0x578C, 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, + 0x5794, 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, 0xCE61, + 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, 0xCE65, 0x5A00, + 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, 0xCE69, 0x59FD, 0xCE6A, + 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, + 0xCE6F, 0x59DB, 0xCE70, 0x59E9, 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, + 0x59E0, 0xCE74, 0x59FE, 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, + 0xCE78, 0x5C4C, 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, + 0x5CD7, 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, + 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, 0xCEA7, + 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, 0xCEAB, 0x5CC6, + 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, 0xCEAF, 0x5DF9, 0xCEB0, + 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, + 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, + 0x5EA3, 0xCEBA, 0x5EA5, 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, + 0xCEBE, 0x5F86, 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, + 0x6072, 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, 0xCECB, + 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, 0xCECF, 0x6058, + 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, 0xCED3, 0x6243, 0xCED4, + 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, 0xCED7, 0x62F5, 0xCED8, 0x630E, + 0xCED9, 0x6303, 0xCEDA, 0x62EB, 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, + 0x630C, 0xCEDE, 0x62F8, 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, + 0xCEE2, 0x6314, 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, + 0x62F0, 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, + 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, 0xCEEF, + 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, 0xCEF3, 0x662B, + 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, 0xCEF7, 0x6639, 0xCEF8, + 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, + 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, + 0x67F8, 0xCF43, 0x67D8, 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, + 0xCF47, 0x67EB, 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, + 0x67CD, 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, 0xCF54, + 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, 0xCF58, 0x67C6, + 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, 0xCF5C, 0x67E6, 0xCF5D, + 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, 0xCF60, 0x67CA, 0xCF61, 0x67C3, + 0xCF62, 0x67EA, 0xCF63, 0x67CB, 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, + 0x6B84, 0xCF67, 0x6BB6, 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, + 0xCF6B, 0x6C20, 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, + 0x6D2D, 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, + 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, 0xCF78, + 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, 0xCF7C, 0x6D00, + 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, 0xCFA2, 0x6D18, 0xCFA3, + 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, + 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, + 0x6D09, 0xCFAD, 0x6D10, 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, + 0xCFB1, 0x70B1, 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, + 0x70B5, 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, 0xCFBE, + 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, 0xCFC2, 0x72DF, + 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, 0xCFC6, 0x7385, 0xCFC7, + 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, + 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, + 0x73BF, 0xCFD1, 0x73C7, 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, + 0xCFD5, 0x73B8, 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, + 0x752E, 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, + 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, 0xCFE2, + 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, 0xCFE6, 0x76FB, + 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, 0xCFEA, 0x7806, 0xCFEB, + 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, 0xCFEE, 0x7810, 0xCFEF, 0x780F, + 0xCFF0, 0x780E, 0xCFF1, 0x7809, 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, + 0x794A, 0xCFF5, 0x794C, 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, + 0xCFF9, 0x79D5, 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, + 0x79CE, 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, 0xD047, + 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, 0xD04B, 0x7D08, + 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, 0xD04F, 0x7F8D, 0xD050, + 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, 0xD053, 0x800F, 0xD054, 0x8014, + 0xD055, 0x8037, 0xD056, 0x80D8, 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, + 0x80D1, 0xD05A, 0x80C8, 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, + 0xD05E, 0x80E3, 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, + 0x80D5, 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, + 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, 0xD06B, + 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, 0xD06F, 0x82E8, + 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, 0xD073, 0x82EB, 0xD074, + 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, 0xD077, 0x82E1, 0xD078, 0x82F2, + 0xD079, 0x82F5, 0xD07A, 0x830C, 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, + 0x82F0, 0xD07E, 0x82EA, 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, + 0xD0A4, 0x82F3, 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, + 0x867C, 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, 0xD0B1, + 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, 0xD0B5, 0x8FEE, + 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, 0xD0B9, 0x90BF, 0xD0BA, + 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, + 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, + 0x964F, 0xD0C4, 0x9651, 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, + 0xD0C8, 0x501E, 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, + 0x5022, 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, + 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, 0xD0D5, + 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, 0xD0D9, 0x5027, + 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, 0xD0DD, 0x500E, 0xD0DE, + 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, + 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, + 0x525A, 0xD0E8, 0x5252, 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, + 0xD0EC, 0x5262, 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, + 0x5526, 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, 0xD0F9, + 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, 0xD0FD, 0x5505, + 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, 0xD142, 0x54F7, 0xD143, + 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, 0xD146, 0x5503, 0xD147, 0x550B, + 0xD148, 0x5701, 0xD149, 0x5702, 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, + 0x57D5, 0xD14D, 0x57D2, 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, + 0xD151, 0x57BC, 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, + 0x57C7, 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, + 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, 0xD15E, + 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, 0xD162, 0x5A0A, + 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, 0xD166, 0x5BA7, 0xD167, + 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, 0xD16A, 0x5C56, 0xD16B, 0x5C54, + 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, + 0x5CF7, 0xD171, 0x5D00, 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, + 0xD175, 0x5EA8, 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, + 0x5F33, 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, 0xD1A4, + 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, 0xD1A8, 0x6083, + 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, 0xD1AC, 0x6087, 0xD1AD, + 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, 0xD1B0, 0x6246, 0xD1B1, 0x62F2, + 0xD1B2, 0x6310, 0xD1B3, 0x6356, 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, + 0x6345, 0xD1B7, 0x6336, 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, + 0xD1BB, 0x634B, 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, + 0x6341, 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, + 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, 0xD1C8, + 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, 0xD1CC, 0x6348, + 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, 0xD1D0, 0x65C3, 0xD1D1, + 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, 0xD1D4, 0x665F, 0xD1D5, 0x6647, + 0xD1D6, 0x6651, 0xD1D7, 0x6712, 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, + 0x681A, 0xD1DB, 0x6849, 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, + 0xD1DF, 0x684B, 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, + 0x681C, 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, 0xD1EC, + 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, 0xD1F0, 0x682E, + 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, 0xD1F4, 0x6820, 0xD1F5, + 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, + 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, + 0x6BE4, 0xD240, 0x6BE8, 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, + 0xD244, 0x6C25, 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, + 0x6D76, 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, + 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, 0xD251, + 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, 0xD255, 0x6D5E, + 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, 0xD259, 0x6D70, 0xD25A, + 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, 0xD25D, 0x6D98, 0xD25E, 0x6D2F, + 0xD25F, 0x6D68, 0xD260, 0x6D8B, 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, + 0x6D84, 0xD264, 0x6D16, 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, + 0xD268, 0x6D75, 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, + 0x70D1, 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, 0xD275, + 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, 0xD279, 0x70C7, + 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, 0xD27D, 0x7242, 0xD27E, + 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, 0xD2A3, 0x7300, 0xD2A4, 0x72FA, + 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, + 0x72FB, 0xD2AA, 0x7301, 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, + 0xD2AE, 0x73D6, 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, + 0x73E9, 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, + 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, 0xD2BB, + 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, 0xD2BF, 0x74F5, + 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, 0xD2C3, 0x75B0, 0xD2C4, + 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, + 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, + 0x771D, 0xD2CE, 0x771B, 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, + 0xD2D2, 0x7723, 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, + 0x771A, 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, 0xD2DF, + 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, 0xD2E3, 0x7833, + 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, 0xD2E7, 0x795B, 0xD2E8, + 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, 0xD2EB, 0x7952, 0xD2EC, 0x7951, + 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, + 0x79ED, 0xD2F2, 0x79EA, 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, + 0xD2F6, 0x7A86, 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, + 0x7A8C, 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, + 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, 0xD344, + 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, 0xD348, 0x7B12, + 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, 0xD34C, 0x7C8C, 0xD34D, + 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, 0xD350, 0x7D1E, 0xD351, 0x7D1D, + 0xD352, 0x7D11, 0xD353, 0x7D0E, 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, + 0x7D13, 0xD357, 0x7D1F, 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, + 0xD35B, 0x7F5C, 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, + 0x7F5D, 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, 0xD368, + 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, 0xD36C, 0x80F5, + 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, 0xD370, 0x8201, 0xD371, + 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, 0xD374, 0x832D, 0xD375, 0x8344, + 0xD376, 0x8319, 0xD377, 0x8351, 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, + 0x833F, 0xD37B, 0x8341, 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, + 0xD3A1, 0x8342, 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, + 0x8308, 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, + 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, 0xD3AE, + 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, 0xD3B2, 0x831E, + 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, 0xD3B6, 0x8348, 0xD3B7, + 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, 0xD3BA, 0x86A8, 0xD3BB, 0x8696, + 0xD3BC, 0x868D, 0xD3BD, 0x8691, 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, + 0x8697, 0xD3C1, 0x8686, 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, + 0xD3C5, 0x86A5, 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, + 0x8695, 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, 0xD3D2, + 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, 0xD3D6, 0x8871, + 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, 0xD3DA, 0x887E, 0xD3DB, + 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, + 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, + 0x8D78, 0xD3E5, 0x8DB5, 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, + 0xD3E9, 0x8ED3, 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, + 0x8FFF, 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, + 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, 0xD3F6, + 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, 0xD3FA, 0x90DB, + 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, 0xD3FE, 0x9150, 0xD440, + 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, 0xD443, 0x91E2, 0xD444, 0x91DA, + 0xD445, 0x965C, 0xD446, 0x965F, 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, + 0x9ADF, 0xD44A, 0x9B2F, 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, + 0xD44E, 0x5061, 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, + 0x504B, 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, 0xD45B, + 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, 0xD45F, 0x506B, + 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, 0xD463, 0x5040, 0xD464, + 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, 0xD467, 0x5051, 0xD468, 0x51D0, + 0xD469, 0x526B, 0xD46A, 0x526D, 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, + 0x52D6, 0xD46E, 0x52D3, 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, + 0xD472, 0x5576, 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, + 0x5534, 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, + 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, 0xD4A1, + 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, 0xD4A5, 0x5539, + 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, 0xD4A9, 0x5540, 0xD4AA, + 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, 0xD4AD, 0x57FB, 0xD4AE, 0x5814, + 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, + 0x5800, 0xD4B4, 0x57ED, 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, + 0xD4B8, 0x580B, 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, + 0x57EE, 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, 0xD4C5, + 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, 0xD4C9, 0x57E9, + 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, 0xD4CD, 0x595C, 0xD4CE, + 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, + 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, + 0x5A5F, 0xD4D8, 0x5A65, 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, + 0xD4DC, 0x5A57, 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, + 0x5A44, 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, + 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, 0xD4E9, + 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, 0xD4ED, 0x5A42, + 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, 0xD4F1, 0x5BC1, 0xD4F2, + 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, + 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, + 0x5D0D, 0xD4FC, 0x5D26, 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, + 0xD541, 0x5D12, 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, + 0x5E3E, 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, 0xD54E, + 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, 0xD552, 0x6090, + 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, 0xD556, 0x60BA, 0xD557, + 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, 0xD55A, 0x60E4, 0xD55B, 0x60D9, + 0xD55C, 0x60DD, 0xD55D, 0x60C8, 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, + 0x60B7, 0xD561, 0x60CA, 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, + 0xD565, 0x60C0, 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, + 0x6382, 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, + 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, 0xD572, + 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, 0xD576, 0x63AF, + 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, 0xD57A, 0x63AE, 0xD57B, + 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, 0xD57E, 0x639F, 0xD5A1, 0x6378, + 0xD5A2, 0x6385, 0xD5A3, 0x6381, 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, + 0x6370, 0xD5A7, 0x6553, 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, + 0xD5AB, 0x665B, 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, + 0x6718, 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, 0xD5B8, + 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, 0xD5BC, 0x68A9, + 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, 0xD5C0, 0x688F, 0xD5C1, + 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, 0xD5C4, 0x686B, 0xD5C5, 0x6872, + 0xD5C6, 0x68AA, 0xD5C7, 0x6880, 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, + 0x689B, 0xD5CB, 0x6896, 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, + 0xD5CF, 0x68A4, 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, + 0x688C, 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, + 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, 0xD5DC, + 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, 0xD5E0, 0x6DC0, + 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, 0xD5E4, 0x6E74, 0xD5E5, + 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, + 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, + 0x6DDF, 0xD5EF, 0x6DD6, 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, + 0xD5F3, 0x6DDD, 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, + 0x6DBD, 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, 0xD641, + 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, 0xD645, 0x6DCD, + 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, 0xD649, 0x710D, 0xD64A, + 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, 0xD64D, 0x710C, 0xD64E, 0x70F0, + 0xD64F, 0x7104, 0xD650, 0x70F3, 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, + 0x70FF, 0xD654, 0x7106, 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, + 0xD658, 0x70F6, 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, + 0x727E, 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, + 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, 0xD665, + 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, 0xD669, 0x731E, + 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, 0xD66D, 0x73F5, 0xD66E, + 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, 0xD671, 0x7407, 0xD672, 0x7400, + 0xD673, 0x73FA, 0xD674, 0x73FC, 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, + 0x740B, 0xD678, 0x73F4, 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, + 0xD67C, 0x75CE, 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, + 0x75CC, 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, 0xD6AB, + 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, 0xD6AF, 0x773D, + 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, 0xD6B3, 0x7848, 0xD6B4, + 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, 0xD6B7, 0x784A, 0xD6B8, 0x784C, + 0xD6B9, 0x7826, 0xD6BA, 0x7845, 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, + 0x7967, 0xD6BE, 0x7969, 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, + 0xD6C2, 0x7961, 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, + 0x79F6, 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, + 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, 0xD6CF, + 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, 0xD6D3, 0x7B18, + 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, 0xD6D7, 0x7B2B, 0xD6D8, + 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, + 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, + 0x7CA3, 0xD6E2, 0x7D35, 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, + 0xD6E6, 0x7D3A, 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, + 0x7D41, 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, 0xD6F3, + 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, 0xD6F7, 0x7FCB, + 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, 0xD6FB, 0x7FC7, 0xD6FC, + 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, 0xD740, 0x801E, 0xD741, 0x801B, + 0xD742, 0x8047, 0xD743, 0x8043, 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, + 0x8125, 0xD747, 0x8119, 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, + 0xD74B, 0x812C, 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, + 0x8127, 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, + 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, 0xD758, + 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, 0xD75C, 0x838D, + 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, 0xD760, 0x8374, 0xD761, + 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, 0xD764, 0x8399, 0xD765, 0x8375, + 0xD766, 0x8394, 0xD767, 0x83A9, 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, + 0x838C, 0xD76B, 0x839D, 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, + 0xD76F, 0x837E, 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, + 0x8397, 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, 0xD77C, + 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, 0xD7A2, 0x86C1, + 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, 0xD7A6, 0x86C8, 0xD7A7, + 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, + 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, + 0x86BE, 0xD7B1, 0x8852, 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, + 0xD7B5, 0x88A2, 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, + 0x88A1, 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, + 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, 0xD7C2, + 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, 0xD7C6, 0x89D6, + 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, 0xD7CA, 0x8A27, 0xD7CB, + 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, + 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, + 0x8D7B, 0xD7D5, 0x8D79, 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, + 0xD7D9, 0x8DBF, 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, + 0x8EDD, 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, 0xD7E6, + 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, 0xD7EA, 0x90F0, + 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, 0xD7EE, 0x90D4, 0xD7EF, + 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, 0xD7F2, 0x9156, 0xD7F3, 0x9158, + 0xD7F4, 0x915A, 0xD7F5, 0x9153, 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, + 0x91F4, 0xD7F9, 0x91F1, 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, + 0xD7FD, 0x91F9, 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, + 0x91E8, 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, + 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, 0xD84B, + 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, 0xD84F, 0x98E5, + 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, 0xD853, 0x5094, 0xD854, + 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, 0xD857, 0x5083, 0xD858, 0x508C, + 0xD859, 0x508E, 0xD85A, 0x509D, 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, + 0x5092, 0xD85E, 0x5082, 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, + 0xD862, 0x5312, 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, + 0x5591, 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, 0xD86F, + 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, 0xD873, 0x5592, + 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, 0xD877, 0x55A6, 0xD878, + 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, 0xD87B, 0x558E, 0xD87C, 0x570C, + 0xD87D, 0x5829, 0xD87E, 0x5837, 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, + 0x5827, 0xD8A4, 0x5823, 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, + 0xD8A8, 0x5825, 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, + 0x583F, 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, + 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, 0xD8B5, + 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, 0xD8B9, 0x5AA2, + 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, 0xD8BD, 0x5A7C, 0xD8BE, + 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, + 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, + 0x5A8B, 0xD8C8, 0x5AA9, 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, + 0xD8CC, 0x5A9C, 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, + 0x5BEA, 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, 0xD8D9, + 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, 0xD8DD, 0x5D4B, + 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, 0xD8E1, 0x5D4E, 0xD8E2, + 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, + 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, + 0x5D49, 0xD8EC, 0x5D38, 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, + 0xD8F0, 0x5D40, 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, + 0x5F58, 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, + 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, 0xD8FD, + 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, 0xD942, 0x6116, + 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, 0xD946, 0x60F8, 0xD947, + 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, 0xD94A, 0x6103, 0xD94B, 0x6118, + 0xD94C, 0x611D, 0xD94D, 0x6110, 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, + 0x610B, 0xD951, 0x624A, 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, + 0xD955, 0x63CE, 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, + 0x63C3, 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, 0xD962, + 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, 0xD966, 0x63DC, + 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, 0xD96A, 0x63C2, 0xD96B, + 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, 0xD96E, 0x63C8, 0xD96F, 0x63F0, + 0xD970, 0x63D7, 0xD971, 0x63D9, 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, + 0x656A, 0xD975, 0x6564, 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, + 0xD979, 0x658C, 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, + 0x65D0, 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, + 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, 0xD9A8, + 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, 0xD9AC, 0x6904, + 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, 0xD9B0, 0x68EA, 0xD9B1, + 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, + 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, + 0x68F3, 0xD9BB, 0x68E1, 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, + 0xD9BF, 0x6970, 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, + 0x68C6, 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, 0xD9CC, + 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, 0xD9D0, 0x68DE, + 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, 0xD9D4, 0x6906, 0xD9D5, + 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, 0xD9D8, 0x6925, 0xD9D9, 0x68C7, + 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, + 0x6B94, 0xD9DF, 0x6B97, 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, + 0xD9E3, 0x6BF0, 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, + 0x6DFC, 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, + 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, 0xD9F0, + 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, 0xD9F4, 0x6E5D, + 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, 0xD9F8, 0x6E4B, 0xD9F9, + 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, + 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, + 0x6E31, 0xDA44, 0x6E28, 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, + 0xDA48, 0x6E39, 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, + 0x6E65, 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, 0xDA55, + 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, 0xDA59, 0x711E, + 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, 0xDA5D, 0x7131, 0xDA5E, + 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, 0xDA61, 0x7132, 0xDA62, 0x711F, + 0xDA63, 0x7128, 0xDA64, 0x713A, 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, + 0x725A, 0xDA68, 0x7288, 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, + 0xDA6C, 0x728B, 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, + 0x7322, 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, + 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, 0xDA79, + 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, 0xDA7D, 0x742B, + 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, 0xDAA3, 0x742D, 0xDAA4, + 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, 0xDAA7, 0x741D, 0xDAA8, 0x7429, + 0xDAA9, 0x7420, 0xDAAA, 0x7432, 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, + 0x756F, 0xDAAE, 0x756C, 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, + 0xDAB2, 0x75E6, 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, + 0x75D7, 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, 0xDABF, + 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, 0xDAC3, 0x77DE, + 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, 0xDAC7, 0x7865, 0xDAC8, + 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, 0xDACB, 0x786A, 0xDACC, 0x786E, + 0xDACD, 0x7870, 0xDACE, 0x7869, 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, + 0x7862, 0xDAD2, 0x7974, 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, + 0xDAD6, 0x7A02, 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, + 0x7A04, 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, + 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, 0xDAE3, + 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, 0xDAE7, 0x7CA2, + 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, 0xDAEB, 0x7D58, 0xDAEC, + 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, + 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, + 0x7D6B, 0xDAF6, 0x7D52, 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, + 0xDAFA, 0x7D5F, 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, + 0x7F65, 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, 0xDB48, + 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, 0xDB4C, 0x8152, + 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, 0xDB50, 0x814D, 0xDB51, + 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, 0xDB54, 0x81F7, 0xDB55, 0x81F8, + 0xDB56, 0x81F9, 0xDB57, 0x8204, 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, + 0x823F, 0xDB5B, 0x8275, 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, + 0xDB5F, 0x8423, 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, + 0x83E7, 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, + 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, 0xDB6C, + 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, 0xDB70, 0x83D8, + 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, 0xDB74, 0x83CE, 0xDB75, + 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, 0xDB78, 0x8409, 0xDB79, 0x840F, + 0xDB7A, 0x83DE, 0xDB7B, 0x8411, 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, + 0x83F3, 0xDBA1, 0x83D5, 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, + 0xDBA5, 0x83EA, 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, + 0x83EE, 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, 0xDBB2, + 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, 0xDBB6, 0x86DA, + 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, 0xDBBA, 0x86DC, 0xDBBB, + 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, + 0xDBC0, 0x8848, 0xDBC1, 0x8856, 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, + 0x88D7, 0xDBC5, 0x88B9, 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, + 0xDBC9, 0x88B6, 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, + 0x88B2, 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, + 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, 0xDBD6, + 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, 0xDBDA, 0x8A40, + 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, 0xDBDE, 0x8A45, 0xDBDF, + 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, + 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, + 0x8CBA, 0xDBE9, 0x8CBE, 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, + 0xDBED, 0x8D84, 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, + 0x8DD3, 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, 0xDBFA, + 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, 0xDBFE, 0x8EFA, + 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, 0xDC43, 0x8EE5, 0xDC44, + 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, + 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, + 0x902D, 0xDC4E, 0x9034, 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, + 0xDC52, 0x9104, 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, + 0x90F9, 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, + 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, 0xDC5F, + 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, 0xDC63, 0x920A, + 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, 0xDC67, 0x9226, 0xDC68, + 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, 0xDC6B, 0x9212, 0xDC6C, 0x91FF, + 0xDC6D, 0x91FD, 0xDC6E, 0x9206, 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, + 0x9202, 0xDC72, 0x921C, 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, + 0xDC76, 0x9205, 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, + 0x958C, 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, 0xDCA5, + 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, 0xDCA9, 0x976C, + 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, 0xDCAD, 0x98A9, 0xDCAE, + 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, + 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, + 0x50AE, 0xDCB8, 0x50C4, 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, + 0xDCBC, 0x50C2, 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, + 0x50B1, 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, + 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, 0xDCC9, + 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, 0xDCCD, 0x55D0, + 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, 0xDCD1, 0x55C0, 0xDCD2, + 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, + 0xDCD7, 0x558D, 0xDCD8, 0x55CF, 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, + 0x55D6, 0xDCDC, 0x55C8, 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, + 0xDCE0, 0x55C2, 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, + 0x5864, 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, 0xDCED, + 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, 0xDCF1, 0x5871, + 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, 0xDCF5, 0x5ACB, 0xDCF6, + 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, + 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, + 0x5AB7, 0xDD41, 0x5AC0, 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, + 0xDD45, 0x5ACD, 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, + 0x5BD8, 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, + 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, 0xDD52, + 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, 0xDD56, 0x5D62, + 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, 0xDD5A, 0x5E4A, 0xDD5B, + 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, + 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, + 0x5FAD, 0xDD65, 0x60F7, 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, + 0xDD69, 0x6145, 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, + 0x6146, 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, 0xDD76, + 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, 0xDD7A, 0x6410, + 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, 0xDD7E, 0x6424, 0xDDA1, + 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, 0xDDA4, 0x6415, 0xDDA5, 0x6418, + 0xDDA6, 0x6439, 0xDDA7, 0x6437, 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, + 0x640C, 0xDDAB, 0x6426, 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, + 0xDDAF, 0x6435, 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, + 0x6440, 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, + 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, 0xDDBC, + 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, 0xDDC0, 0x668C, + 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, 0xDDC4, 0x668A, 0xDDC5, + 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, 0xDDC8, 0x6720, 0xDDC9, 0x6966, + 0xDDCA, 0x695F, 0xDDCB, 0x6938, 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, + 0x6971, 0xDDCF, 0x693F, 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, + 0xDDD3, 0x6942, 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, + 0x6948, 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, 0xDDE0, + 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, 0xDDE4, 0x6944, + 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, 0xDDE8, 0x6974, 0xDDE9, + 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, 0xDDEC, 0x6937, 0xDDED, 0x695C, + 0xDDEE, 0x694F, 0xDDEF, 0x6951, 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, + 0x692F, 0xDDF3, 0x697B, 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, + 0xDDF7, 0x6B43, 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, + 0x6B9B, 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, + 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, 0xDE45, + 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, 0xDE49, 0x6E93, + 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, 0xDE4D, 0x6EB9, 0xDE4E, + 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, + 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, + 0x6EA6, 0xDE58, 0x6ECF, 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, + 0xDE5C, 0x6EDC, 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, + 0x6E8E, 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, 0xDE69, + 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, 0xDE6D, 0x7152, + 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, 0xDE71, 0x715D, 0xDE72, + 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, 0xDE75, 0x716A, 0xDE76, 0x7161, + 0xDE77, 0x7142, 0xDE78, 0x7158, 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, + 0x7170, 0xDE7C, 0x715F, 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, + 0xDEA2, 0x714D, 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, + 0x728C, 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, + 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, 0xDEAF, + 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, 0xDEB3, 0x744B, + 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, 0xDEB7, 0x7440, 0xDEB8, + 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, 0xDEBB, 0x7442, 0xDEBC, 0x7446, + 0xDEBD, 0x744D, 0xDEBE, 0x7454, 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, + 0x74FE, 0xDEC2, 0x74FD, 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, + 0xDEC6, 0x6983, 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, + 0x75F7, 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, 0xDED3, + 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, 0xDED7, 0x76DD, + 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, 0xDEDB, 0x7752, 0xDEDC, + 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, 0xDEDF, 0x7767, 0xDEE0, 0x7754, + 0xDEE1, 0x7759, 0xDEE2, 0x776D, 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, + 0x789A, 0xDEE6, 0x7894, 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, + 0xDEEA, 0x7885, 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, + 0x7879, 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, + 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, 0xDEF7, + 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, 0xDEFB, 0x7A17, + 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, 0xDF40, 0x7A1B, 0xDF41, + 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, + 0xDF46, 0x7B66, 0xDF47, 0x7B64, 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, + 0x7B69, 0xDF4B, 0x7B72, 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, + 0xDF4F, 0x7B70, 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, + 0x7B63, 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, 0xDF5C, + 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, 0xDF60, 0x7D83, + 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, 0xDF64, 0x7D84, 0xDF65, + 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, 0xDF68, 0x7F6B, 0xDF69, 0x7F67, + 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, + 0x7FA7, 0xDF6F, 0x7FDB, 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, + 0xDF73, 0x8160, 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, + 0x815B, 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, + 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, 0xDFA2, + 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, 0xDFA6, 0x8240, + 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, 0xDFAA, 0x843F, 0xDFAB, + 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, 0xDFAE, 0x848F, 0xDFAF, 0x848D, + 0xDFB0, 0x8465, 0xDFB1, 0x8451, 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, + 0x8467, 0xDFB5, 0x8430, 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, + 0xDFB9, 0x8459, 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, + 0x8507, 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, 0xDFC6, + 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, 0xDFCA, 0x842F, + 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, 0xDFCE, 0x8470, 0xDFCF, + 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, 0xDFD2, 0x8452, 0xDFD3, 0x846F, + 0xDFD4, 0x84C5, 0xDFD5, 0x848E, 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, + 0x8436, 0xDFD9, 0x8433, 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, + 0xDFDD, 0x842B, 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, + 0x8450, 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, + 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, 0xDFEA, + 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, 0xDFEE, 0x86F6, + 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, 0xDFF2, 0x88CB, 0xDFF3, + 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, + 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, + 0x89DF, 0xDFFD, 0x89E5, 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, + 0xE042, 0x89E2, 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, + 0x8A86, 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, 0xE04F, + 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, 0xE053, 0x8C4B, + 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, 0xE057, 0x8C66, 0xE058, + 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, 0xE05B, 0x8CCC, 0xE05C, 0x8D68, + 0xE05D, 0x8D69, 0xE05E, 0x8D91, 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, + 0x8D8F, 0xE062, 0x8D8D, 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, + 0xE066, 0x8D92, 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, + 0x8DF1, 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, + 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, 0xE073, + 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, 0xE077, 0x8F00, + 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, 0xE07B, 0x8F02, 0xE07C, + 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, 0xE0A1, 0x9044, 0xE0A2, 0x9049, + 0xE0A3, 0x903D, 0xE0A4, 0x9110, 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, + 0x9111, 0xE0A8, 0x9116, 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, + 0xE0AC, 0x916E, 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, + 0x9230, 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, 0xE0B9, + 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, 0xE0BD, 0x9260, + 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, 0xE0C1, 0x9261, 0xE0C2, + 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, 0xE0C5, 0x9263, 0xE0C6, 0x9250, + 0xE0C7, 0x9272, 0xE0C8, 0x924E, 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, + 0x9256, 0xE0CC, 0x9232, 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, + 0xE0D0, 0x959B, 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, + 0x9697, 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, + 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, 0xE0DD, + 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, 0xE0E1, 0x98AC, + 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, 0xE0E5, 0x99B2, 0xE0E6, + 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, + 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, + 0x9EFD, 0xE0F0, 0x50E6, 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, + 0xE0F4, 0x50F3, 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, + 0x50E4, 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, 0xE142, + 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, 0xE146, 0x53AC, + 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, 0xE14A, 0x5612, 0xE14B, + 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, 0xE14E, 0x5601, 0xE14F, 0x5613, + 0xE150, 0x5602, 0xE151, 0x55FA, 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, + 0x55FF, 0xE155, 0x55F9, 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, + 0xE159, 0x5898, 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, + 0x5874, 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, + 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, 0xE166, + 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, 0xE16A, 0x596B, + 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, 0xE16E, 0x5AD5, 0xE16F, + 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, 0xE172, 0x5AEB, 0xE173, 0x5AF3, + 0xE174, 0x5AE2, 0xE175, 0x5AE0, 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, + 0x5ADE, 0xE179, 0x5ADD, 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, + 0xE17D, 0x5B77, 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, + 0x5D82, 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, 0xE1AC, + 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, 0xE1B0, 0x5D79, + 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, 0xE1B4, 0x5E53, 0xE1B5, + 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, + 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, + 0x5F44, 0xE1BF, 0x5F43, 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, + 0xE1C3, 0x6128, 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, + 0x6173, 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, + 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, 0xE1D0, + 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, 0xE1D4, 0x6161, + 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, 0xE1D8, 0x622B, 0xE1D9, + 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, 0xE1DC, 0x645D, 0xE1DD, 0x6474, + 0xE1DE, 0x6476, 0xE1DF, 0x6472, 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, + 0x6475, 0xE1E3, 0x6466, 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, + 0xE1E7, 0x645E, 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, + 0x6460, 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, 0xE1F4, + 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, 0xE1F8, 0x669F, + 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, 0xE1FC, 0x69B1, 0xE1FD, + 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, 0xE241, 0x69CE, 0xE242, 0x6996, + 0xE243, 0x69B0, 0xE244, 0x69AC, 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, + 0x6999, 0xE248, 0x698E, 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, + 0xE24C, 0x69BE, 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, + 0x69BD, 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, + 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, 0xE259, + 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, 0xE25D, 0x6997, + 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, 0xE261, 0x69A5, 0xE262, + 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, 0xE265, 0x6B4B, 0xE266, 0x6B9E, + 0xE267, 0x6B9F, 0xE268, 0x6BA0, 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, + 0x6BFE, 0xE26C, 0x6ECE, 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, + 0xE270, 0x6F25, 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, + 0x6F2E, 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, 0xE27D, + 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, 0xE2A3, 0x6EF9, + 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, 0xE2A7, 0x6F30, 0xE2A8, + 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, + 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, + 0x6F39, 0xE2B2, 0x6F1C, 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, + 0xE2B6, 0x6F0D, 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, + 0x7187, 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, + 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, 0xE2C3, + 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, 0xE2C7, 0x7297, + 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, 0xE2CB, 0x734D, 0xE2CC, + 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, 0xE2CF, 0x7473, 0xE2D0, 0x7471, + 0xE2D1, 0x7475, 0xE2D2, 0x7472, 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, + 0x7500, 0xE2D6, 0x7502, 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, + 0xE2DA, 0x7616, 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, + 0x7611, 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, 0xE2E7, + 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, 0xE2EB, 0x78B2, + 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, 0xE2EF, 0x78A8, 0xE2F0, + 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, + 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, + 0x798A, 0xE2FA, 0x798B, 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, + 0xE2FE, 0x7993, 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, + 0x7990, 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, + 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, 0xE34C, + 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, 0xE350, 0x7B8A, + 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, 0xE354, 0x7B8D, 0xE355, + 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, 0xE358, 0x7B85, 0xE359, 0x7B98, + 0xE35A, 0x5284, 0xE35B, 0x7B99, 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, + 0x7CBB, 0xE35F, 0x7CBF, 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, + 0xE363, 0x7DB7, 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, + 0x7DC1, 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, 0xE370, + 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, 0xE374, 0x7D9F, + 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, 0xE378, 0x7DA1, 0xE379, + 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, + 0xE37E, 0x7FDE, 0xE3A1, 0x8024, 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, + 0x8189, 0xE3A5, 0x8186, 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, + 0xE3A9, 0x818C, 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, + 0x84A4, 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, + 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, 0xE3B6, + 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, 0xE3BA, 0x84AA, + 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, 0xE3BE, 0x849D, 0xE3BF, + 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, 0xE3C2, 0x8494, 0xE3C3, 0x84C7, + 0xE3C4, 0x84CC, 0xE3C5, 0x849B, 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, + 0x84A8, 0xE3C9, 0x84D6, 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, + 0xE3CD, 0x84A0, 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, + 0x84DB, 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, 0xE3DA, + 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, 0xE3DE, 0x871B, + 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, 0xE3E2, 0x873E, 0xE3E3, + 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, 0xE3E6, 0x872A, 0xE3E7, 0x872D, + 0xE3E8, 0x873C, 0xE3E9, 0x8712, 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, + 0x8735, 0xE3ED, 0x8742, 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, + 0xE3F1, 0x8724, 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, + 0x88F7, 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, + 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, 0xE3FE, + 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, 0xE443, 0x899D, + 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, 0xE447, 0x89E9, 0xE448, + 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, 0xE44B, 0x8A99, 0xE44C, 0x8A8B, + 0xE44D, 0x8A92, 0xE44E, 0x8A8F, 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, + 0x8C68, 0xE452, 0x8C69, 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, + 0xE456, 0x8D96, 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, + 0x8E0D, 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, 0xE463, + 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, 0xE467, 0x8F0D, + 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, 0xE46B, 0x9122, 0xE46C, + 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, 0xE46F, 0x9124, 0xE470, 0x9121, + 0xE471, 0x911B, 0xE472, 0x917A, 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, + 0x9173, 0xE476, 0x92A5, 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, + 0xE47A, 0x927A, 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, + 0x928D, 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, + 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, 0xE4A9, + 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, 0xE4AD, 0x927D, + 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, 0xE4B1, 0x9286, 0xE4B2, + 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, 0xE4B5, 0x927E, 0xE4B6, 0x9287, + 0xE4B7, 0x92A9, 0xE4B8, 0x929D, 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, + 0x969E, 0xE4BC, 0x96A1, 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, + 0xE4C0, 0x977A, 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, + 0x9782, 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, 0xE4CD, + 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, 0xE4D1, 0x999D, + 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, 0xE4D5, 0x99BB, 0xE4D6, + 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, + 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, + 0x9B60, 0xE4E0, 0x9B61, 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, + 0xE4E4, 0x9CF5, 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, + 0x5130, 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, + 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, 0xE4F1, + 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, 0xE4F5, 0x52EF, + 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, 0xE4F9, 0x5635, 0xE4FA, + 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, 0xE4FD, 0x5646, 0xE4FE, 0x5658, + 0xE540, 0x565A, 0xE541, 0x5640, 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, + 0x562C, 0xE545, 0x563E, 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, + 0xE549, 0x571A, 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, + 0x58A0, 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, 0xE556, + 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, 0xE55A, 0x5AF8, + 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, 0xE55E, 0x5B07, 0xE55F, + 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, 0xE562, 0x5D99, 0xE563, 0x5D97, + 0xE564, 0x5D9F, 0xE565, 0x5D92, 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, + 0x5D95, 0xE569, 0x5DA0, 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, + 0xE56D, 0x5D9E, 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, + 0x5E5C, 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, + 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, 0xE57A, + 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, 0xE57E, 0x6189, + 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, 0xE5A4, 0x61AD, 0xE5A5, + 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, 0xE5A8, 0x61A1, 0xE5A9, 0x618D, + 0xE5AA, 0x6166, 0xE5AB, 0x61B3, 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, + 0x6470, 0xE5AF, 0x6496, 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, + 0xE5B3, 0x649C, 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, + 0x648C, 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, 0xE5C0, + 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, 0xE5C4, 0x66B0, + 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, 0xE5C8, 0x66AA, 0xE5C9, + 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, + 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, + 0x6A20, 0xE5D3, 0x69FF, 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, + 0xE5D7, 0x6A1D, 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, + 0x69EE, 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, + 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, 0xE5E4, + 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, 0xE5E8, 0x6A18, + 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, 0xE5EC, 0x6A26, 0xE5ED, + 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, + 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, + 0x6C00, 0xE5F7, 0x6BFF, 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, + 0xE5FB, 0x6F7E, 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, + 0x6F8D, 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, 0xE649, + 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, 0xE64D, 0x6F52, + 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, 0xE651, 0x6F93, 0xE652, + 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, 0xE655, 0x6F6B, 0xE656, 0x6F7D, + 0xE657, 0x6F67, 0xE658, 0x6F90, 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, + 0x6F69, 0xE65C, 0x6F7F, 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, + 0xE660, 0x6F6A, 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, + 0x719B, 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, + 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, 0xE66D, + 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, 0xE671, 0x71A7, + 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, 0xE675, 0x7358, 0xE676, + 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, 0xE679, 0x7360, 0xE67A, 0x735D, + 0xE67B, 0x735B, 0xE67C, 0x7361, 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, + 0x7362, 0xE6A2, 0x7487, 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, + 0xE6A6, 0x7481, 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, + 0x747C, 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, 0xE6B3, + 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, 0xE6B7, 0x761B, + 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, 0xE6BB, 0x769B, 0xE6BC, + 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, 0xE6BF, 0x7788, 0xE6C0, 0x78CD, + 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, + 0x78CE, 0xE6C6, 0x78D4, 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, + 0xE6CA, 0x78C9, 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, + 0x799C, 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, + 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, 0xE6D7, + 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, 0xE6DB, 0x7BAF, + 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, 0xE6DF, 0x7CC5, 0xE6E0, + 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, + 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, + 0x7E03, 0xE6EA, 0x7DFA, 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, + 0xE6EE, 0x7DF0, 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, + 0x7FAC, 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, 0xE6FB, + 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, 0xE740, 0x819E, + 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, 0xE744, 0x8197, 0xE745, + 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, 0xE748, 0x8252, 0xE749, 0x8250, + 0xE74A, 0x824E, 0xE74B, 0x8251, 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, + 0x850F, 0xE74F, 0x8500, 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, + 0xE753, 0x850D, 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, + 0x851C, 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, + 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, 0xE760, + 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, 0xE764, 0x84FC, + 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, 0xE768, 0x8516, 0xE769, + 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, 0xE76C, 0x852E, 0xE76D, 0x8502, + 0xE76E, 0x84FD, 0xE76F, 0x851E, 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, + 0x8526, 0xE773, 0x84E7, 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, + 0xE777, 0x84F9, 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, + 0x850B, 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, 0xE7A6, + 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, 0xE7AA, 0x8752, + 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, 0xE7AE, 0x875E, 0xE7AF, + 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, 0xE7B2, 0x874E, 0xE7B3, 0x875F, + 0xE7B4, 0x875D, 0xE7B5, 0x876F, 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, + 0x876E, 0xE7B9, 0x875C, 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, + 0xE7BD, 0x8775, 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, + 0x885A, 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, + 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, 0xE7CA, + 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, 0xE7CE, 0x89A2, + 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, 0xE7D2, 0x89F0, 0xE7D3, + 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, + 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, + 0x8AD7, 0xE7DD, 0x8ABE, 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, + 0xE7E1, 0x8AC3, 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, + 0x8C3E, 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, 0xE7EE, + 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, 0xE7F2, 0x8D9B, + 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, 0xE7F6, 0x8E24, 0xE7F7, + 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, + 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, + 0x8E12, 0xE842, 0x8E18, 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, + 0xE846, 0x8E1A, 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, + 0x8F1A, 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, + 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, 0xE853, + 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, 0xE857, 0x912A, + 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, 0xE85B, 0x9185, 0xE85C, + 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, 0xE85F, 0x9182, 0xE860, 0x9184, + 0xE861, 0x9180, 0xE862, 0x92D0, 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, + 0x92C0, 0xE866, 0x92D9, 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, + 0xE86A, 0x92DF, 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, + 0x92DD, 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, 0xE877, + 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, 0xE87B, 0x92DE, + 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, 0xE8A1, 0x92B5, 0xE8A2, + 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, 0xE8A5, 0x957C, 0xE8A6, 0x95AC, + 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, + 0x96A2, 0xE8AC, 0x96D3, 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, + 0xE8B0, 0x975A, 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, + 0x97D0, 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, + 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, 0xE8BD, + 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, 0xE8C1, 0x9911, + 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, 0xE8C5, 0x9915, 0xE8C6, + 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, + 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, + 0x99CB, 0xE8D0, 0x99D7, 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, + 0xE8D4, 0x9AEB, 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, + 0x9B46, 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, 0xE8E1, + 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, 0xE8E5, 0x9CFA, + 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, 0xE8E9, 0x9D07, 0xE8EA, + 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, + 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, + 0x9F10, 0xE8F4, 0x511C, 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, + 0xE8F8, 0x5111, 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, + 0x5670, 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, + 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, 0xE946, + 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, 0xE94A, 0x58BD, + 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, 0xE94E, 0x58C2, 0xE94F, + 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, 0xE952, 0x5B19, 0xE953, 0x5B1B, + 0xE954, 0x5B21, 0xE955, 0x5B14, 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, + 0x5B16, 0xE959, 0x5B28, 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, + 0xE95D, 0x5BEF, 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, + 0x5DA7, 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, 0xE96A, + 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, 0xE96E, 0x5E6F, + 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, 0xE972, 0x5EE8, 0xE973, + 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, 0xE976, 0x619D, 0xE977, 0x61A8, + 0xE978, 0x6196, 0xE979, 0x61C5, 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, + 0x61C1, 0xE97D, 0x61CC, 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, + 0xE9A3, 0x618C, 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, + 0x64CF, 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, + 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, 0xE9B0, + 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, 0xE9B4, 0x66BE, + 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, 0xE9B8, 0x66CF, 0xE9B9, + 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, 0xE9BC, 0x66CC, 0xE9BD, 0x6723, + 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, + 0x6A32, 0xE9C3, 0x6A68, 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, + 0xE9C7, 0x6A76, 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, + 0x6A5A, 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, 0xE9D4, + 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, 0xE9D8, 0x6A5E, + 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, 0xE9DC, 0x6A4E, 0xE9DD, + 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, + 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, + 0x6C04, 0xE9E7, 0x6C03, 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, + 0xE9EB, 0x6FA3, 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, + 0x6FC8, 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, + 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, 0xE9F8, + 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, 0xE9FC, 0x6FCF, + 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, 0xEA41, 0x6FC9, 0xEA42, + 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, + 0xEA47, 0x71C5, 0xEA48, 0x71C2, 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, + 0x71D6, 0xEA4C, 0x71C0, 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, + 0xEA50, 0x71CA, 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, + 0x71D8, 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, 0xEA5D, + 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, 0xEA61, 0x736A, + 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, 0xEA65, 0x7494, 0xEA66, + 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, 0xEA69, 0x750B, 0xEA6A, 0x7580, + 0xEA6B, 0x762F, 0xEA6C, 0x762D, 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, + 0x7633, 0xEA70, 0x763C, 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, + 0xEA74, 0x76BB, 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, + 0x77A1, 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, + 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, 0xEAA3, + 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, 0xEAA7, 0x78E3, + 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, 0xEAAB, 0x78ED, 0xEAAC, + 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, + 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, + 0x7AB1, 0xEAB6, 0x7AB7, 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, + 0xEABA, 0x7BDD, 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, + 0x7BE8, 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, 0xEAC7, + 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, 0xEACB, 0x7CD1, + 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, 0xEACF, 0x7E0C, 0xEAD0, + 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, + 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, + 0x7E0F, 0xEADA, 0x7E16, 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, + 0xEADE, 0x7E24, 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, + 0x7F7A, 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, + 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, 0xEAEB, + 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, 0xEAEF, 0x81AC, + 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, 0xEAF3, 0x81A7, 0xEAF4, + 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, 0xEAF7, 0x8257, 0xEAF8, 0x8556, + 0xEAF9, 0x8545, 0xEAFA, 0x856B, 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, + 0x8561, 0xEAFE, 0x8558, 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, + 0xEB43, 0x8541, 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, + 0x8547, 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, 0xEB50, + 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, 0xEB54, 0x855D, + 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, 0xEB58, 0x8663, 0xEB59, + 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, 0xEB5C, 0x878F, 0xEB5D, 0x8797, + 0xEB5E, 0x8793, 0xEB5F, 0x8792, 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, + 0x8796, 0xEB63, 0x8798, 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, + 0xEB67, 0x8785, 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, + 0x8784, 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, + 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, 0xEB74, + 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, 0xEB78, 0x8929, + 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, 0xEB7C, 0x891F, 0xEB7D, + 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, + 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, + 0x8ADF, 0xEBA9, 0x8AF0, 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, + 0xEBAD, 0x8AE8, 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, + 0x8C91, 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, 0xEBBA, + 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, 0xEBBE, 0x8E3E, + 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, 0xEBC2, 0x8E36, 0xEBC3, + 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, + 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, + 0x8F32, 0xEBCD, 0x8F39, 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, + 0xEBD1, 0x9079, 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, + 0x9133, 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, + 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, 0xEBDE, + 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, 0xEBE2, 0x930F, + 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, 0xEBE6, 0x931B, 0xEBE7, + 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, 0xEBEA, 0x9346, 0xEBEB, 0x932D, + 0xEBEC, 0x930E, 0xEBED, 0x930D, 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, + 0x92FA, 0xEBF1, 0x9325, 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, + 0xEBF5, 0x9334, 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, + 0x9329, 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, 0xEC43, + 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, 0xEC47, 0x95CD, + 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, 0xEC4B, 0x95B6, 0xEC4C, + 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, 0xEC4F, 0x96A9, 0xEC50, 0x96D4, + 0xEC51, 0x970B, 0xEC52, 0x9712, 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, + 0x9797, 0xEC56, 0x9794, 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, + 0xEC5A, 0x982F, 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, + 0x9927, 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, + 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, 0xEC67, + 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, 0xEC6B, 0x9ABF, + 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, 0xEC6F, 0x9AFA, 0xEC70, + 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, 0xEC73, 0x9B80, 0xEC74, 0x9B85, + 0xEC75, 0x9B87, 0xEC76, 0x9B7C, 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, + 0x9B82, 0xEC7A, 0x9B93, 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, + 0xEC7E, 0x9B95, 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, + 0x9D17, 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, 0xECAD, + 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, 0xECB1, 0x9E87, + 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, 0xECB5, 0x9ED6, 0xECB6, + 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, 0xECB9, 0x5126, 0xECBA, 0x5125, + 0xECBB, 0x5122, 0xECBC, 0x5124, 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, + 0x52F4, 0xECC0, 0x5693, 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, + 0xECC4, 0x5684, 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, + 0x567F, 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, + 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, 0xECD1, + 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, 0xECD5, 0x5B2F, + 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, 0xECD9, 0x5BF2, 0xECDA, + 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, + 0xECDF, 0x61C3, 0xECE0, 0x61B5, 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, + 0x61E0, 0xECE4, 0x61E5, 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, + 0xECE8, 0x64EF, 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, + 0x64E4, 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, 0xECF5, + 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, 0xECF9, 0x6A9B, + 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, 0xECFD, 0x6A93, 0xECFE, + 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, 0xED42, 0x6AA8, 0xED43, 0x6AA4, + 0xED44, 0x6A91, 0xED45, 0x6A7F, 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, + 0x6A85, 0xED49, 0x6A8C, 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, + 0xED4D, 0x6C09, 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, + 0x6FD4, 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, + 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, 0xED5A, + 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, 0xED5E, 0x71E8, + 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, 0xED62, 0x71E2, 0xED63, + 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, 0xED66, 0x7497, 0xED67, 0x74B2, + 0xED68, 0x74AB, 0xED69, 0x7490, 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, + 0x74B1, 0xED6D, 0x74A5, 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, + 0xED71, 0x7512, 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, + 0x7648, 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, 0xED7E, + 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, 0xEDA4, 0x77F0, + 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, 0xEDA8, 0x78FB, 0xEDA9, + 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, + 0xEDAE, 0x7904, 0xEDAF, 0x79AB, 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, + 0x7A5B, 0xEDB3, 0x7A56, 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, + 0xEDB7, 0x7ABE, 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, + 0x7C0F, 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, + 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, 0xEDC4, + 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, 0xEDC8, 0x7BF8, + 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, 0xEDCC, 0x7BF1, 0xEDCD, + 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, + 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, + 0x7E2A, 0xEDD7, 0x7E49, 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, + 0xEDDB, 0x7E4C, 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, + 0x7E44, 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, 0xEDE8, + 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, 0xEDEC, 0x81C5, + 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, 0xEDF0, 0x825B, 0xEDF1, + 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, 0xEDF4, 0x8580, 0xEDF5, 0x858F, + 0xEDF6, 0x85A7, 0xEDF7, 0x8595, 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, + 0x85A3, 0xEDFB, 0x857B, 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, + 0xEE40, 0x8577, 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, + 0x857A, 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, + 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, 0xEE4D, + 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, 0xEE51, 0x8585, + 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, 0xEE55, 0x8590, 0xEE56, + 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, 0xEE59, 0x87AA, 0xEE5A, 0x87AD, + 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, + 0x87B5, 0xEE60, 0x87BC, 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, + 0xEE64, 0x87C2, 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, + 0x87C4, 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, 0xEE71, + 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, 0xEE75, 0x8941, + 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, 0xEE79, 0x89AD, 0xEE7A, + 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, + 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, + 0x8B0B, 0xEEA6, 0x8B22, 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, + 0xEEAA, 0x8B07, 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, + 0x8B1C, 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, + 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, 0xEEB7, + 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, 0xEEBB, 0x8E4D, + 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, 0xEEBF, 0x8E47, 0xEEC0, + 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, 0xEEC3, 0x907E, 0xEEC4, 0x9138, + 0xEEC5, 0x919A, 0xEEC6, 0x91A2, 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, + 0x919F, 0xEECA, 0x91A1, 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, + 0xEECE, 0x9383, 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, + 0x9347, 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, 0xEEDB, + 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, 0xEEDF, 0x9379, + 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, 0xEEE3, 0x934F, 0xEEE4, + 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, 0xEEE7, 0x9361, 0xEEE8, 0x935E, + 0xEEE9, 0x9363, 0xEEEA, 0x9367, 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, + 0x9359, 0xEEEE, 0x95C7, 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, + 0xEEF2, 0x95C5, 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, + 0x96AC, 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, + 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, 0xEF40, + 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, 0xEF44, 0x97F1, + 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, 0xEF48, 0x9849, 0xEF49, + 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, 0xEF4C, 0x992B, 0xEF4D, 0x992C, + 0xEF4E, 0x992A, 0xEF4F, 0x9933, 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, + 0x992D, 0xEF53, 0x9931, 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, + 0xEF57, 0x99A1, 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, + 0x99F7, 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, 0xEF64, + 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, 0xEF68, 0x9AFC, + 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, 0xEF6C, 0x9B9E, 0xEF6D, + 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, + 0xEF72, 0x9B86, 0xEF73, 0x9BA2, 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, + 0x9D33, 0xEF77, 0x9D41, 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, + 0xEF7B, 0x9D2F, 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, + 0x9D45, 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, + 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, 0xEFAA, + 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, 0xEFAE, 0x9EC8, + 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, 0xEFB2, 0x9F24, 0xEFB3, + 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, + 0xEFB8, 0x512D, 0xEFB9, 0x512E, 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, + 0x5697, 0xEFBD, 0x569A, 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, + 0xEFC1, 0x5B3C, 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, + 0x5E6D, 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, 0xEFCE, + 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, 0xEFD2, 0x6504, + 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, 0xEFD6, 0x6503, 0xEFD7, + 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, + 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, + 0x6AE1, 0xEFE1, 0x6AC6, 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, + 0xEFE5, 0x6AC7, 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, + 0x6BC9, 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, + 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, 0xEFF2, + 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, 0xEFF6, 0x6FFC, + 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, 0xEFFA, 0x71FF, 0xEFFB, + 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, 0xEFFE, 0x7376, 0xF040, 0x74B8, + 0xF041, 0x74C0, 0xF042, 0x74B5, 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, + 0x74B6, 0xF046, 0x74BB, 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, + 0xF04A, 0x765C, 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, + 0x7653, 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, 0xF057, + 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, 0xF05B, 0x7910, + 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, 0xF05F, 0x79AC, 0xF060, + 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, 0xF063, 0x7C19, 0xF064, 0x7C20, + 0xF065, 0x7C1F, 0xF066, 0x7C2D, 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, + 0x7C28, 0xF06A, 0x7C22, 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, + 0xF06E, 0x7E50, 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, + 0x7E62, 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, + 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, 0xF07B, + 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, 0xF0A1, 0x81D0, + 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, 0xF0A5, 0x85C6, 0xF0A6, + 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, + 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, + 0x85CB, 0xF0B0, 0x85CE, 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, + 0xF0B4, 0x85B6, 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, + 0x85B7, 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, 0xF0C1, + 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, 0xF0C5, 0x87D4, + 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, 0xF0C9, 0x87D8, 0xF0CA, + 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, 0xF0CD, 0x87D9, 0xF0CE, 0x8801, + 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, + 0x894B, 0xF0D4, 0x894F, 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, + 0xF0D8, 0x8951, 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, + 0x8B23, 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, + 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, 0xF0E5, + 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, 0xF0E9, 0x8B2E, + 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, 0xF0ED, 0x8B3A, 0xF0EE, + 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, + 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, + 0x8E5C, 0xF0F8, 0x8E62, 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, + 0xF0FC, 0x8E5E, 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, + 0x8E5A, 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, 0xF14A, + 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, 0xF14E, 0x91A8, + 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, 0xF152, 0x91AA, 0xF153, + 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, 0xF156, 0x93B7, 0xF157, 0x939B, + 0xF158, 0x939D, 0xF159, 0x9389, 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, + 0x93AA, 0xF15D, 0x939E, 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, + 0xF161, 0x9399, 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, + 0x9391, 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, + 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, 0xF16E, + 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, 0xF172, 0x5DC2, + 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, 0xF176, 0x9723, 0xF177, + 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, 0xF17A, 0x97AE, 0xF17B, 0x97A8, + 0xF17C, 0x97AB, 0xF17D, 0x97A4, 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, + 0x97A5, 0xF1A3, 0x97D7, 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, + 0xF1A7, 0x97FA, 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, + 0x98B8, 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, 0xF1B4, + 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, 0xF1B8, 0x9A06, + 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, 0xF1BC, 0x9B04, 0xF1BD, + 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, + 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, + 0x9BBF, 0xF1C7, 0x9BC1, 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, + 0xF1CB, 0x9BB6, 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, + 0x9D5C, 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, + 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, 0xF1D8, + 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, 0xF1DC, 0x9D58, + 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, 0xF1E0, 0x9EDF, 0xF1E1, + 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, + 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, + 0x9F55, 0xF1EB, 0x5134, 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, + 0xF1EF, 0x53B4, 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, + 0x56A7, 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, 0xF1FC, + 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, 0xF241, 0x61FB, + 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, 0xF245, 0x6509, 0xF246, + 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, 0xF249, 0x65DE, 0xF24A, 0x65DD, + 0xF24B, 0x66DE, 0xF24C, 0x6AE7, 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, + 0x6AD1, 0xF250, 0x6AD9, 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, + 0xF254, 0x6AD0, 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, + 0x6ADE, 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, + 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, 0xF261, + 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, 0xF265, 0x7017, + 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, 0xF269, 0x720C, 0xF26A, + 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, 0xF26D, 0x7205, 0xF26E, 0x72A5, + 0xF26F, 0x72A6, 0xF270, 0x72A4, 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, + 0x74CB, 0xF274, 0x74C5, 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, + 0xF278, 0x7660, 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, + 0x77F1, 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, 0xF2A7, + 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, 0xF2AB, 0x7C2C, + 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, 0xF2AF, 0x7E76, 0xF2B0, + 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, + 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, + 0x7F4B, 0xF2BA, 0x7F4A, 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, + 0xF2BE, 0x7FFD, 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, + 0x81D5, 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, + 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, 0xF2CB, + 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, 0xF2CF, 0x85F2, + 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, 0xF2D3, 0x85E3, 0xF2D4, + 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, + 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, + 0x8803, 0xF2DE, 0x87F6, 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, + 0xF2E2, 0x880B, 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, + 0x87FF, 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, 0xF2EF, + 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, 0xF2F3, 0x89B7, + 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, 0xF2F7, 0x8B48, 0xF2F8, + 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, + 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, + 0x8B52, 0xF343, 0x8B57, 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, + 0xF347, 0x8C9A, 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, + 0x8DAC, 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, + 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, 0xF354, + 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, 0xF358, 0x8F4F, + 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, 0xF35C, 0x9140, 0xF35D, + 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, 0xF360, 0x93DE, 0xF361, 0x93C7, + 0xF362, 0x93CF, 0xF363, 0x93C2, 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, + 0x93F9, 0xF367, 0x93EC, 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, + 0xF36B, 0x93E6, 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, + 0x93E3, 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, 0xF378, + 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, 0xF37C, 0x972C, + 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, 0xF3A2, 0x97B7, 0xF3A3, + 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, 0xF3A6, 0x97DF, 0xF3A7, 0x985C, + 0xF3A8, 0x9859, 0xF3A9, 0x985D, 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, + 0x98BD, 0xF3AD, 0x98BB, 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, + 0xF3B1, 0x9943, 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, + 0x9A15, 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, + 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, 0xF3BE, + 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, 0xF3C2, 0x9B0B, + 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, 0xF3C6, 0x9B37, 0xF3C7, + 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, + 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, + 0x9BD7, 0xF3D1, 0x9BEC, 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, + 0xF3D5, 0x9BD5, 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, + 0x9D81, 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, 0xF3E2, + 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, 0xF3E6, 0x9D75, + 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, 0xF3EA, 0x9D73, 0xF3EB, + 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, + 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, + 0x9EC0, 0xF3F5, 0x9EFC, 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, + 0xF3F9, 0x9F4D, 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, + 0x5337, 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, + 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, 0xF447, + 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, 0xF44B, 0x6517, + 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, 0xF44F, 0x65DF, 0xF450, + 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, 0xF453, 0x6AF3, 0xF454, 0x6AF0, + 0xF455, 0x6AEA, 0xF456, 0x6AE8, 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, + 0x6AEE, 0xF45A, 0x6AEF, 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, + 0xF45E, 0x7037, 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, + 0x7038, 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, 0xF46B, + 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, 0xF46F, 0x74BA, + 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, 0xF473, 0x76ED, 0xF474, + 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, 0xF477, 0x77CD, 0xF478, 0x77F2, + 0xF479, 0x7925, 0xF47A, 0x7923, 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, + 0x7924, 0xF47E, 0x7929, 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, + 0xF4A4, 0x7A6D, 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, + 0x7C4A, 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, + 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, 0xF4B1, + 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, 0xF4B5, 0x820B, + 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, 0xF4B9, 0x85FF, 0xF4BA, + 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, 0xF4BD, 0x8600, 0xF4BE, 0x85F6, + 0xF4BF, 0x8604, 0xF4C0, 0x8609, 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, + 0x85FD, 0xF4C4, 0x8819, 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, + 0xF4C8, 0x8813, 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, + 0x89B9, 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, 0xF4D5, + 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, 0xF4D9, 0x8E84, + 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, 0xF4DD, 0x8F55, 0xF4DE, + 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, 0xF4E1, 0x9143, 0xF4E2, 0x9141, + 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, + 0x940B, 0xF4E8, 0x9413, 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, + 0xF4EC, 0x9414, 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, + 0x9428, 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, + 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, 0xF4F9, + 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, 0xF4FD, 0x940A, + 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, 0xF542, 0x93F6, 0xF543, + 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, 0xF546, 0x95E0, 0xF547, 0x95DF, + 0xF548, 0x972E, 0xF549, 0x972F, 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, + 0x97FD, 0xF54D, 0x97FE, 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, + 0xF551, 0x985F, 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, + 0x994E, 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, 0xF55E, + 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, 0xF562, 0x9A38, + 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, 0xF566, 0x9AC6, 0xF567, + 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, 0xF56A, 0x9C0B, 0xF56B, 0x9C08, + 0xF56C, 0x9BF7, 0xF56D, 0x9C05, 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, + 0x9C40, 0xF571, 0x9C07, 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, + 0xF575, 0x9C14, 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, + 0x9DA4, 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, + 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, 0xF5A4, + 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, 0xF5A8, 0x9DA2, + 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, 0xF5AC, 0x9DBF, 0xF5AD, + 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, + 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, + 0x9EE7, 0xF5B7, 0x9EE6, 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, + 0xF5BB, 0x9F60, 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, + 0x9F91, 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, 0xF5C8, + 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, 0xF5CC, 0x61FD, + 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, 0xF5D0, 0x6B03, 0xF5D1, + 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, 0xF5D4, 0x7044, 0xF5D5, 0x704A, + 0xF5D6, 0x7048, 0xF5D7, 0x7049, 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, + 0x721D, 0xF5DB, 0x721A, 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, + 0xF5DF, 0x766A, 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, + 0x792F, 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, + 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, 0xF5EC, + 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, 0xF5F0, 0x81DD, + 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, 0xF5F4, 0x861F, 0xF5F5, + 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, 0xF5F8, 0x8627, 0xF5F9, 0x862E, + 0xF5FA, 0x8621, 0xF5FB, 0x8620, 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, + 0x8625, 0xF640, 0x8829, 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, + 0xF644, 0x8824, 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, + 0x896D, 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, 0xF651, + 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, 0xF655, 0x8E8E, + 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, 0xF659, 0x8F5D, 0xF65A, + 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, 0xF65D, 0x91B9, 0xF65E, 0x943F, + 0xF65F, 0x943B, 0xF660, 0x9436, 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, + 0x943C, 0xF664, 0x9430, 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, + 0xF668, 0x942C, 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, + 0x95E4, 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, + 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, 0xF675, + 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, 0xF679, 0x9A3D, + 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, 0xF67D, 0x9A41, 0xF67E, + 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, + 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, + 0x9C2B, 0xF6AA, 0x9C1D, 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, + 0xF6AE, 0x9C28, 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, + 0x9DB7, 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, 0xF6BB, + 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, 0xF6BF, 0x9DB9, + 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, 0xF6C3, 0x9DB1, 0xF6C4, + 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, + 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, + 0x9EED, 0xF6CE, 0x9F1B, 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, + 0xF6D2, 0x9F4E, 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, + 0x4EB9, 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, + 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, 0xF6DF, + 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, 0xF6E3, 0x6522, + 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, 0xF6E7, 0x6C0D, 0xF6E8, + 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, 0xF6EB, 0x7052, 0xF6EC, 0x721E, + 0xF6ED, 0x721F, 0xF6EE, 0x72A9, 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, + 0x74D5, 0xF6F2, 0x74D9, 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, + 0xF6F6, 0x7935, 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, + 0x7C57, 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, 0xF744, + 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, 0xF748, 0x8635, + 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, 0xF74C, 0x8636, 0xF74D, + 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, 0xF750, 0x882A, 0xF751, 0x8825, + 0xF752, 0x8971, 0xF753, 0x89BF, 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, + 0x8B7E, 0xF757, 0x8B84, 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, + 0xF75B, 0x8B7F, 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, + 0x8E9A, 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, + 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, 0xF768, + 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, 0xF76C, 0x9447, + 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, 0xF770, 0x9446, 0xF771, + 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, 0xF774, 0x9869, 0xF775, 0x98CB, + 0xF776, 0x9954, 0xF777, 0x995B, 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, + 0x9A54, 0xF77B, 0x9A4C, 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, + 0xF7A1, 0x9A49, 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, + 0x9B19, 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, 0xF7AE, + 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, 0xF7B2, 0x9C37, + 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, 0xF7B6, 0x9C36, 0xF7B7, + 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, + 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, + 0x9DE9, 0xF7C1, 0x9DD9, 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, + 0xF7C5, 0x9DD5, 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, + 0x9F35, 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, + 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, 0xF7D2, + 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, 0xF7D6, 0x5DD8, + 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, 0xF7DA, 0x6203, 0xF7DB, + 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, 0xF7DE, 0x6596, 0xF7DF, 0x66EB, + 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, + 0x705B, 0xF7E5, 0x705A, 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, + 0xF7E9, 0x7383, 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, + 0x7C66, 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, 0xF7F6, + 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, 0xF7FA, 0x8833, + 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, 0xF7FE, 0x89FE, 0xF840, + 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, 0xF843, 0x8B88, 0xF844, 0x8C45, + 0xF845, 0x8D19, 0xF846, 0x8E98, 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, + 0x91BC, 0xF84A, 0x9462, 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, + 0xF84E, 0x945E, 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, + 0x9A56, 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, + 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, 0xF85B, + 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, 0xF85F, 0x9C4C, + 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, 0xF863, 0x9DEF, 0xF864, + 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, 0xF867, 0x9DE4, 0xF868, 0x9DF6, + 0xF869, 0x9DE1, 0xF86A, 0x9DEE, 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, + 0x9DF0, 0xF86E, 0x9DE2, 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, + 0xF872, 0x9DE8, 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, + 0x9EF2, 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, 0xF8A1, + 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, 0xF8A5, 0x56D3, + 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, 0xF8A9, 0x652D, 0xF8AA, + 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, 0xF8AD, 0x705F, 0xF8AE, 0x7061, + 0xF8AF, 0x705D, 0xF8B0, 0x7060, 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, + 0x74E5, 0xF8B4, 0x77D5, 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, + 0xF8B8, 0x7C6A, 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, + 0x8643, 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, + 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, 0xF8C5, + 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, 0xF8C9, 0x91C2, + 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, 0xF8CD, 0x96E5, 0xF8CE, + 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, + 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, + 0x9C67, 0xF8D8, 0x9C66, 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, + 0xF8DC, 0x9E02, 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, + 0x9E06, 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, 0xF8E9, + 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, 0xF8ED, 0x9F76, + 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, 0xF8F1, 0x6B18, 0xF8F2, + 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, 0xF8F5, 0x7062, 0xF8F6, 0x7226, + 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, + 0x7C69, 0xF8FC, 0x7C6B, 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, + 0xF941, 0x7E9B, 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, + 0x8646, 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, + 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, 0xF94E, + 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, 0xF952, 0x946E, + 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, 0xF956, 0x9473, 0xF957, + 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, 0xF95A, 0x9C68, 0xF95B, 0x9C6E, + 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, + 0x9E0F, 0xF961, 0x9E12, 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, + 0xF965, 0x9F09, 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, + 0x9F7A, 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, 0xF972, + 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, 0xF976, 0x9A60, + 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, 0xF97A, 0x9C75, 0xF97B, + 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, + 0xF9A2, 0x7068, 0xF9A3, 0x7065, 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, + 0x883E, 0xF9A7, 0x883D, 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, + 0xF9AB, 0x8EA9, 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, + 0x9874, 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, + 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, 0xF9B8, + 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, 0xF9BC, 0x7227, + 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, 0xF9C0, 0x9480, 0xF9C1, + 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, + 0xF9C6, 0x7229, 0xF9C7, 0x864B, 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, + 0x9C79, 0xF9CB, 0x9EB7, 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, + 0xF9CF, 0x9E1D, 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, + 0x9F7E, 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, 0xF9DC, + 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, 0xF9E0, 0x2560, + 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, 0xF9E4, 0x2569, 0xF9E5, + 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, 0xF9E8, 0x2555, 0xF9E9, 0x255E, + 0xF9EA, 0x256A, 0xF9EB, 0x2561, 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, + 0x255B, 0xF9EF, 0x2553, 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, + 0xF9F3, 0x256B, 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, + 0x255C, 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, + 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 }; +# endif + +# if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0 +/// CP437(U.S.) to Unicode conversion table +static const WCHAR uc437[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, + 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, + 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, + 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, + 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, + 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0 +/// CP720(Arabic) to Unicode conversion table +static const WCHAR uc720[] + = { 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0651, + 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, + 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, + 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, + 0x0635, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x0636, 0x0637, 0x0638, + 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, + 0x0647, 0x0648, 0x0649, 0x064A, 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, + 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0 +/// CP737(Greek) to Unicode conversion table +static const WCHAR uc737[] + = { 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, + 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, + 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, + 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, + 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, + 0x03C6, 0x03C7, 0x03C8, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03C9, 0x03AC, 0x03AD, + 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, + 0x0389, 0x038A, 0x038C, 0x038E, 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, + 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0 +/// CP771(KBL) to Unicode conversion table +static const WCHAR uc771[] + = { 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, + 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, + 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, + 0x043D, 0x043E, 0x043F, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, + 0x044C, 0x044D, 0x044E, 0x044F, 0x0118, 0x0119, 0x0116, 0x0117, 0x012E, + 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0 +/// CP775(Baltic) to Unicode conversion table +static const WCHAR uc775[] + = { 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, + 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, 0x00C9, 0x00E6, + 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, + 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, 0x0100, 0x012A, 0x00F3, 0x017B, + 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, + 0x0141, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, + 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, 0x0105, + 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x00D3, 0x00DF, 0x014C, + 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, + 0x0146, 0x0112, 0x0145, 0x2019, 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, + 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0 +/// CP850(Latin 1) to Unicode conversion table +static const WCHAR uc850[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C9, 0x00E6, + 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, + 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, + 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x00F0, + 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, + 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, 0x00D3, 0x00DF, 0x00D4, + 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, + 0x00FD, 0x00DD, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, + 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0 +/// CP852(Latin 2) to Unicode conversion table +static const WCHAR uc852[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, + 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, 0x00C9, 0x0139, + 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, + 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, + 0x015F, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, + 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x0111, + 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, + 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, 0x00D3, 0x00DF, 0x00D4, + 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, + 0x00FD, 0x00DD, 0x0163, 0x00B4, 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, + 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0 +/// CP855(Cyrillic) to Unicode conversion table +static const WCHAR uc855[] + = { 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, + 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, 0x0459, 0x0409, + 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, + 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, 0x0430, 0x0410, 0x0431, 0x0411, + 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, + 0x0413, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, + 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x043B, + 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, + 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, 0x042F, 0x0440, 0x0420, + 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, + 0x0412, 0x044C, 0x042C, 0x2116, 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, + 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0 +/// CP857(Turkish) to Unicode conversion table +static const WCHAR uc857[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, 0x00C9, 0x00E6, + 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, + 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, + 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, 0x00BA, + 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, + 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, 0x00D3, 0x00DF, 0x00D4, + 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, + 0x00EC, 0x00FF, 0x00AF, 0x00B4, 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, + 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0 +/// CP860(Portuguese) to Unicode conversion table +static const WCHAR uc860[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, + 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2, 0x00C9, 0x00C0, + 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, + 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, + 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, + 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, + 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0 +/// CP861(Icelandic) to Unicode conversion table +static const WCHAR uc861[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5, 0x00C9, 0x00E6, + 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, + 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, + 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, + 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, + 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0 +/// CP862(Hebrew) to Unicode conversion table +static const WCHAR uc862[] + = { 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, + 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, 0x05E0, 0x05E1, + 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, + 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, + 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, + 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, + 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0 +/// CP863(Canadian French) to Unicode conversion table +static const WCHAR uc863[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0, 0x00C9, 0x00C8, + 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, + 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192, 0x00A6, 0x00B4, 0x00F3, 0x00FA, + 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, + 0x00BE, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, + 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, + 0x221E, 0x03C6, 0x03B5, 0x2219, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, + 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0 +/// CP864(Arabic) to Unicode conversion table +static const WCHAR uc864[] + = { 0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, + 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518, 0x03B2, 0x221E, + 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, + 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000, 0x00A0, 0x00AD, 0xFE82, 0x00A3, + 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, + 0xFE9D, 0xFEA1, 0xFEA5, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, + 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, + 0x061F, 0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, + 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9, 0xFEAB, + 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, + 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9, 0x0640, 0xFED3, 0xFED7, + 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, + 0xFECC, 0xFECE, 0xFECD, 0xFEE1, 0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, + 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, + 0x25A0, 0x0000 }; +# endif +# if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0 +/// CP865(Nordic) to Unicode conversion table +static const WCHAR uc865[] + = { 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, + 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, 0x00C5, 0x00E6, + 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, + 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192, 0x00E1, 0x00ED, 0x00F3, 0x00FA, + 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, + 0x00A1, 0x00AB, 0x00A4, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x03B1, 0x00DF, 0x0393, + 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, + 0x221E, 0x03C6, 0x03B5, 0x2229, 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, + 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0 +/// CP866(Russian) to Unicode conversion table +static const WCHAR uc866[] + = { 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, + 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, + 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, + 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, 0x0430, 0x0431, 0x0432, 0x0433, + 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, + 0x043D, 0x043E, 0x043F, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, + 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, 0x2568, + 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, + 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, 0x0440, 0x0441, 0x0442, + 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, + 0x044C, 0x044D, 0x044E, 0x044F, 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, + 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, + 0x25A0, 0x00A0 }; +# endif +# if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0 +/// CP869(Greek 2) to Unicode conversion table +static const WCHAR uc869[] + = { 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, + 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389, 0x038A, 0x03AA, + 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, + 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x0390, 0x03CC, 0x03CD, + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, + 0x0399, 0x00AB, 0x00BB, 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, + 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, + 0x2510, 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3, 0x03A4, + 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, + 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, + 0x03C3, 0x03C2, 0x03C4, 0x0384, 0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, + 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, + 0x25A0, 0x00A0 }; +# endif + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode Conversions for Static Code Page Configuration with */ +/* SBCS Fixed Code Page */ +/*------------------------------------------------------------------------*/ + +# if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900 +WCHAR ff_uni2oem(DWORD _uni, WORD _cp) { + WCHAR c = 0; + const WCHAR* p = CVTBL(uc, FF_CODE_PAGE); + + // ASCII? + if (_uni < 0x80) { + c = (WCHAR)_uni; + + // Non-ASCII + } + else { + // Is it in BMP and valid code page? + if (_uni < 0x10000 && _cp == FF_CODE_PAGE) { + for (c = 0; c < 0x80 && _uni != p[c]; c++) + ; + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + +WCHAR ff_oem2uni(WCHAR _oem, WORD _cp) { + WCHAR c = 0; + const WCHAR* p = CVTBL(uc, FF_CODE_PAGE); + + // ASCII? + if (_oem < 0x80) { + c = _oem; + + // Extended char + } + else { + // Is it a valid code page? + if (_cp == FF_CODE_PAGE) { + if (_oem < 0x100) { + c = p[_oem - 0x80]; + } + } + } + + return c; +} + +# endif + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode Conversions for Static Code Page Configuration with */ +/* DBCS Fixed Code Page */ +/*------------------------------------------------------------------------*/ + +# if FF_CODE_PAGE >= 900 +// Returns OEM code character, zero on error +WCHAR ff_uni2oem( + // UTF-16 encoded character to be converted + DWORD _uni, + // Code page for the conversion + WORD _cp) { + const WCHAR* p; + WCHAR c = 0, uc; + UINT i = 0, n, li, hi; + + // ASCII? + if (_uni < 0x80) { + c = (WCHAR)_uni; + } + // Non-ASCII + else { + if (_uni < 0x10000 + // Is it in BMP and valid code page? + && _cp == FF_CODE_PAGE) { + uc = (WCHAR)_uni; + p = CVTBL(uni2oem, FF_CODE_PAGE); + hi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (uc == p[i * 2]) { + break; + } + if (uc > p[i * 2]) { + li = i; + } + else { + hi = i; + } + } + if (n != 0) { + c = p[i * 2 + 1]; + } + } + } + + return c; +} + +WCHAR ff_oem2uni(WCHAR _oem, WORD _cp) { + const WCHAR* p; + WCHAR c = 0; + UINT i = 0, n, li, hi; + + // ASCII? + if (_oem < 0x80) { + c = _oem; + } + // Extended char + else { + // Is it valid code page? + if (_cp == FF_CODE_PAGE) { + p = CVTBL(oem2uni, FF_CODE_PAGE); + hi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1; + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (_oem == p[i * 2]) { + break; + } + if (_oem > p[i * 2]) { + li = i; + } + else { + hi = i; + } + } + if (n != 0) { + c = p[i * 2 + 1]; + } + } + } + + return c; +} +# endif + +/*------------------------------------------------------------------------*/ +/* OEM <==> Unicode Conversions for Dynamic Code Page Configuration */ +/*------------------------------------------------------------------------*/ + +# if FF_CODE_PAGE == 0 + +static const WORD cp_code[] = { 437, 720, 737, 771, 775, 850, 852, 855, 857, + 860, 861, 862, 863, 864, 865, 866, 869, 0 }; +static const WCHAR* const cp_table[] + = { uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, + uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0 }; + +// Returns OEM code character, zero on error +WCHAR ff_uni2oem( + // UTF-16 encoded character to be converted + DWORD _uni, + // Code page for the conversion + WORD _cp) { + const WCHAR* p; + WCHAR c = 0, uc; + UINT i, n, li, hi; + + // ASCII? + if (_uni < 0x80) { + c = (WCHAR)_uni; + } + // Non-ASCII + else { + // Is it in BMP? + if (_uni < 0x10000) { + uc = (WCHAR)_uni; + p = 0; + // SBCS + if (_cp < 900) { + for (i = 0; cp_code[i] != 0 && cp_code[i] != _cp; i++) + // Get conversion table + ; + p = cp_table[i]; + // Is it valid code page ? + if (p) { + for (c = 0; c < 0x80 && uc != p[c]; c++) + // Find OEM code in the table + ; + c = (c + 0x80) & 0xFF; + } + } + // DBCS + else { + // Get conversion table + switch (_cp) { + case 932: + p = uni2oem932; + hi = sizeof uni2oem932 / 4 - 1; + break; + case 936: + p = uni2oem936; + hi = sizeof uni2oem936 / 4 - 1; + break; + case 949: + p = uni2oem949; + hi = sizeof uni2oem949 / 4 - 1; + break; + case 950: + p = uni2oem950; + hi = sizeof uni2oem950 / 4 - 1; + break; + } + // Is it valid code page? + if (p) { + li = 0; + // Find OEM code + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (uc == p[i * 2]) { + break; + } + if (uc > p[i * 2]) { + li = i; + } + else { + hi = i; + } + } + if (n != 0) { + c = p[i * 2 + 1]; + } + } + } + } + } + + return c; +} + +// _oem: OEM code to be converted (DBC if >=0x100) +WCHAR ff_oem2uni(WCHAR _oem, WORD _cp) { + const WCHAR* p; + WCHAR c = 0; + UINT i, n, li, hi; + + // ASCII? + if (_oem < 0x80) { + c = _oem; + } + // Extended char + else { + p = 0; + // SBCS + if (_cp < 900) { + for (i = 0; cp_code[i] != 0 && cp_code[i] != _cp; i++) + // Get table + ; + p = cp_table[i]; + // Is it a valid CP ? + if (p) { + if (_oem < 0x100) { + c = p[_oem - 0x80]; + } + } + } + // DBCS + else { + switch (_cp) { + case 932: + p = oem2uni932; + hi = sizeof oem2uni932 / 4 - 1; + break; + case 936: + p = oem2uni936; + hi = sizeof oem2uni936 / 4 - 1; + break; + case 949: + p = oem2uni949; + hi = sizeof oem2uni949 / 4 - 1; + break; + case 950: + p = oem2uni950; + hi = sizeof oem2uni950 / 4 - 1; + break; + } + if (p) { + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (_oem == p[i * 2]) { + break; + } + if (_oem > p[i * 2]) { + li = i; + } + else { + hi = i; + } + } + if (n != 0) { + c = p[i * 2 + 1]; + } + } + } + } + + return c; +} +# endif + +DWORD ff_wtoupper(DWORD _uni) { + const WORD* p; + WORD uc, bc, nc, cmd; + // Compressed up conversion table for U+0000 - U+0FFF + static const WORD cvt1[] = { + // Basic Latin + 0x0061, 0x031A, + + // Latin-1 Supplement + 0x00E0, 0x0317, 0x00F8, 0x0307, 0x00FF, 0x0001, 0x0178, + + // Latin Extended-A + 0x0100, 0x0130, 0x0132, 0x0106, 0x0139, 0x0110, 0x014A, 0x012E, 0x0179, + 0x0106, + + // Latin Extended-B + 0x0180, 0x004D, 0x0243, 0x0181, 0x0182, 0x0182, 0x0184, 0x0184, 0x0186, + 0x0187, 0x0187, 0x0189, 0x018A, 0x018B, 0x018B, 0x018D, 0x018E, 0x018F, + 0x0190, 0x0191, 0x0191, 0x0193, 0x0194, 0x01F6, 0x0196, 0x0197, 0x0198, + 0x0198, 0x023D, 0x019B, 0x019C, 0x019D, 0x0220, 0x019F, 0x01A0, 0x01A0, + 0x01A2, 0x01A2, 0x01A4, 0x01A4, 0x01A6, 0x01A7, 0x01A7, 0x01A9, 0x01AA, + 0x01AB, 0x01AC, 0x01AC, 0x01AE, 0x01AF, 0x01AF, 0x01B1, 0x01B2, 0x01B3, + 0x01B3, 0x01B5, 0x01B5, 0x01B7, 0x01B8, 0x01B8, 0x01BA, 0x01BB, 0x01BC, + 0x01BC, 0x01BE, 0x01F7, 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C4, 0x01C5, + 0x01C4, 0x01C7, 0x01C8, 0x01C7, 0x01CA, 0x01CB, 0x01CA, 0x01CD, 0x0110, + 0x01DD, 0x0001, 0x018E, 0x01DE, 0x0112, 0x01F3, 0x0003, 0x01F1, 0x01F4, + 0x01F4, 0x01F8, 0x0128, 0x0222, 0x0112, 0x023A, 0x0009, 0x2C65, 0x023B, + 0x023B, 0x023D, 0x2C66, 0x023F, 0x0240, 0x0241, 0x0241, 0x0246, 0x010A, + + // IPA Extensions + 0x0253, 0x0040, 0x0181, 0x0186, 0x0255, 0x0189, 0x018A, 0x0258, 0x018F, + 0x025A, 0x0190, 0x025C, 0x025D, 0x025E, 0x025F, 0x0193, 0x0261, 0x0262, + 0x0194, 0x0264, 0x0265, 0x0266, 0x0267, 0x0197, 0x0196, 0x026A, 0x2C62, + 0x026C, 0x026D, 0x026E, 0x019C, 0x0270, 0x0271, 0x019D, 0x0273, 0x0274, + 0x019F, 0x0276, 0x0277, 0x0278, 0x0279, 0x027A, 0x027B, 0x027C, 0x2C64, + 0x027E, 0x027F, 0x01A6, 0x0281, 0x0282, 0x01A9, 0x0284, 0x0285, 0x0286, + 0x0287, 0x01AE, 0x0244, 0x01B1, 0x01B2, 0x0245, 0x028D, 0x028E, 0x028F, + 0x0290, 0x0291, 0x01B7, + + // Greek, Coptic + 0x037B, 0x0003, 0x03FD, 0x03FE, 0x03FF, 0x03AC, 0x0004, 0x0386, 0x0388, + 0x0389, 0x038A, 0x03B1, 0x0311, 0x03C2, 0x0002, 0x03A3, 0x03A3, 0x03C4, + 0x0308, 0x03CC, 0x0003, 0x038C, 0x038E, 0x038F, 0x03D8, 0x0118, 0x03F2, + 0x000A, 0x03F9, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, 0x03F7, 0x03F9, + 0x03FA, 0x03FA, + + // Cyrillic + 0x0430, 0x0320, 0x0450, 0x0710, 0x0460, 0x0122, 0x048A, 0x0136, 0x04C1, + 0x010E, 0x04CF, 0x0001, 0x04C0, 0x04D0, 0x0144, + + // Armenian + 0x0561, 0x0426, + + // EOT + 0x0000 + }; + // Compressed up conversion table for U+1000 - U+FFFF + static const WORD cvt2[] = { + // Phonetic Extensions + 0x1D7D, 0x0001, 0x2C63, + + // Latin Extended Additional + 0x1E00, 0x0196, 0x1EA0, 0x015A, + + // Greek Extended + 0x1F00, 0x0608, 0x1F10, 0x0606, 0x1F20, 0x0608, 0x1F30, 0x0608, 0x1F40, + 0x0606, 0x1F51, 0x0007, 0x1F59, 0x1F52, 0x1F5B, 0x1F54, 0x1F5D, 0x1F56, + 0x1F5F, 0x1F60, 0x0608, 0x1F70, 0x000E, 0x1FBA, 0x1FBB, 0x1FC8, 0x1FC9, + 0x1FCA, 0x1FCB, 0x1FDA, 0x1FDB, 0x1FF8, 0x1FF9, 0x1FEA, 0x1FEB, 0x1FFA, + 0x1FFB, 0x1F80, 0x0608, 0x1F90, 0x0608, 0x1FA0, 0x0608, 0x1FB0, 0x0004, + 0x1FB8, 0x1FB9, 0x1FB2, 0x1FBC, 0x1FCC, 0x0001, 0x1FC3, 0x1FD0, 0x0602, + 0x1FE0, 0x0602, 0x1FE5, 0x0001, 0x1FEC, 0x1FF3, 0x0001, 0x1FFC, + + // Letterlike Symbols + 0x214E, 0x0001, 0x2132, + + // Number forms + 0x2170, 0x0210, 0x2184, 0x0001, 0x2183, + + // Enclosed Alphanumerics + 0x24D0, 0x051A, 0x2C30, 0x042F, + + // Latin Extended-C + 0x2C60, 0x0102, 0x2C67, 0x0106, 0x2C75, 0x0102, + + // Coptic + 0x2C80, 0x0164, + + // Georgian Supplement + 0x2D00, 0x0826, + + // Full-width + 0xFF41, 0x031A, + + // EOT + 0x0000 + }; + + // Is it in BMP? + if (_uni < 0x10000) { + uc = (WORD)_uni; + p = uc < 0x1000 ? cvt1 : cvt2; + for (;;) { + // Get the block base + bc = *p++; + // Not matched? + if (bc == 0 || uc < bc) { + break; + } + // Get processing command and block size + nc = *p++; + cmd = nc >> 8; + nc &= 0xFF; + // In the block? + if (uc < bc + nc) { + switch (cmd) { + // Table conversion + case 0: + uc = p[uc - bc]; + break; + // Case pairs + case 1: + uc -= (uc - bc) & 1; + break; + // Shift -16 + case 2: + uc -= 16; + break; + // Shift -32 + case 3: + uc -= 32; + break; + // Shift -48 + case 4: + uc -= 48; + break; + // Shift -26 + case 5: + uc -= 26; + break; + // Shift +8 + case 6: + uc += 8; + break; + // Shift -80 + case 7: + uc -= 80; + break; + // Shift -0x1C60 + case 8: + uc -= 0x1C60; + break; + } + break; + } + // Skip table if needed + if (cmd == 0) { + p += nc; + } + } + _uni = uc; + } + + return _uni; +} + +#endif /* #if FF_USE_LFN != 0 */ diff --git a/src/fs/fatfs/include/diskio.h b/src/fs/fatfs/include/diskio.h new file mode 100644 index 000000000..709cf9fba --- /dev/null +++ b/src/fs/fatfs/include/diskio.h @@ -0,0 +1,156 @@ + +/** + * @file diskio.h + * @brief Low level disk interface module include file + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_DISKIO_H +#define SIMPLEKERNEL_DISKIO_H + +#ifndef _DISKIO_DEFINED +# define _DISKIO_DEFINED + +# ifdef __cplusplus +extern "C" { +# endif + +/// Status of Disk Functions +typedef BYTE DSTATUS; + +/** + * @brief Results of Disk Functions + */ +typedef enum { + /// 0: Successful + RES_OK = 0, + /// 1: R/W Error + RES_ERROR, + /// 2: Write Protected + RES_WRPRT, + /// 3: Not Ready + RES_NOTRDY, + /// 4: Invalid Parameter + RES_PARERR +} DRESULT; + +/** + * @brief Inidialize a Drive + * @param _pdrv Physical drive number to identify the drive + * @return DSTATUS result + */ +DSTATUS disk_initialize(BYTE _pdrv); + +/** + * @brief Get Drive Status + * @param _pdrv Physical drive number to identify the drive + * @return DSTATUS Drive Status + */ +DSTATUS disk_status(BYTE _pdrv); + +/** + * @brief Read Sector(s) + * @param _pdrv Physical drive number to identify the drive + * @param _buff Data buffer to store read data + * @param _sector Start sector in LBA + * @param _count Number of sectors to read + * @return DRESULT result + */ +DRESULT disk_read(BYTE _pdrv, BYTE* _buff, LBA_t _sector, UINT _count); + +/** + * @brief Write Sector(s) + * @param _pdrv Physical drive number to identify the drive + * @param _buff Data to be written + * @param _sector Start sector in LBA + * @param _count Number of sectors to write + * @return DRESULT result + */ +DRESULT disk_write(BYTE _pdrv, const BYTE* _buff, LBA_t _sector, UINT _count); + +/** + * @brief Miscellaneous Functions + * @param _pdrv Physical drive number (0..) + * @param _cmd Control code + * @param _buff Buffer to send/receive control data + * @return DRESULT result + */ +DRESULT disk_ioctl(BYTE _pdrv, BYTE _cmd, void* _buff); + +/// Disk Status Bits (DSTATUS) +# define STA_OK 0x00 +/// Drive not initialized +# define STA_NOINIT 0x01 +/// No medium in the drive +# define STA_NODISK 0x02 +/// Write protected +# define STA_PROTECT 0x04 + +/// Command code for disk_ioctl function + +/// Generic command (Used by FatFs) +/// Complete pending write process (needed at FF_FS_READONLY == 0) +# define CTRL_SYNC 0 +/// Get media size (needed at FF_USE_MKFS == 1) +# define GET_SECTOR_COUNT 1 +/// Get sector size (needed at FF_MAX_SS != FF_MIN_SS) +# define GET_SECTOR_SIZE 2 +/// Get erase block size (needed at FF_USE_MKFS == 1) +# define GET_BLOCK_SIZE 3 +/// Inform device that the data on the block of sectors is no longer used +/// (needed at FF_USE_TRIM == 1) +# define CTRL_TRIM 4 + +/// Generic command (Not used by FatFs) +/// Get/Set power status +# define CTRL_POWER 5 +/// Lock/Unlock media removal +# define CTRL_LOCK 6 +/// Eject media +# define CTRL_EJECT 7 +/// Create physical format on the media +# define CTRL_FORMAT 8 + +/// MMC/SDC specific ioctl command +/// Get card type +# define MMC_GET_TYPE 10 +/// Get CSD +# define MMC_GET_CSD 11 +/// Get CID +# define MMC_GET_CID 12 +/// Get OCR +# define MMC_GET_OCR 13 +/// Get SD status +# define MMC_GET_SDSTAT 14 +/// Read data form SD iSDIO register +# define ISDIO_READ 55 +/// Write data to SD iSDIO register +# define ISDIO_WRITE 56 +/// Masked write data to SD iSDIO register +# define ISDIO_MRITE 57 + +/// ATA/CF specific ioctl command +/// Get F/W revision +# define ATA_GET_REV 20 +/// Get model name +# define ATA_GET_MODEL 21 +/// Get serial number +# define ATA_GET_SN 22 + +# ifdef __cplusplus +} +# endif + +#endif + +#endif /* SIMPLEKERNEL_DISKIO_H */ diff --git a/src/fs/fatfs/include/fatfs.h b/src/fs/fatfs/include/fatfs.h new file mode 100644 index 000000000..d77185b2f --- /dev/null +++ b/src/fs/fatfs/include/fatfs.h @@ -0,0 +1,30 @@ + +/** + * @file fatfs.h + * @brief fat 文件系统头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_FATFS_H +#define SIMPLEKERNEL_FATFS_H + +#include "ff.h" + +class fatfs_t { +private: + +public: + fatfs_t(void); + ~fatfs_t(void); +}; + +#endif /* SIMPLEKERNEL_FATFS_H */ diff --git a/src/fs/fatfs/include/ff.h b/src/fs/fatfs/include/ff.h new file mode 100644 index 000000000..7becb13cd --- /dev/null +++ b/src/fs/fatfs/include/ff.h @@ -0,0 +1,835 @@ + +/** + * @file ff.h + * @brief FatFs - Generic FAT Filesystem module R0.15 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_FF_H +#define SIMPLEKERNEL_FF_H + +/*----------------------------------------------------------------------------/ +/ +/ Copyright (C) 2022, ChaN, all right reserved. +/ +/ FatFs module is an open source software. Redistribution and use of FatFs in +/ source and binary forms, with or without modification, are permitted provided +/ that the following condition is met: + +/ 1. Redistributions of source code must retain the above copyright notice, +/ this condition and the following disclaimer. +/ +/ This software is provided by the copyright holder and contributors "AS IS" +/ and any warranties related to this software are DISCLAIMED. +/ The copyright owner or contributors be NOT LIABLE for any damages caused +/ by use of this software. +/ +/----------------------------------------------------------------------------*/ + +#ifndef FF_DEFINED +/// Revision ID +# define FF_DEFINED 80286 + +# ifdef __cplusplus +extern "C" { +# endif + +/// FatFs configuration options +# include "ffconf.h" + +# if FF_DEFINED != FFCONF_DEF +# error Wrong configuration file (ffconf.h). +# endif + +/// Integer types used for FatFs API +# if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) \ + || defined(__cplusplus) +# define FF_INTDEF 2 +# include +/// int must be 16-bit or 32-bit +typedef unsigned int UINT; +/// char must be 8-bit +typedef unsigned char BYTE; +/// 16-bit unsigned integer +typedef uint16_t WORD; +/// 32-bit unsigned integer +typedef uint32_t DWORD; +/// 64-bit unsigned integer +typedef uint64_t QWORD; +/// UTF-16 character type +typedef WORD WCHAR; +# endif + +/// Type of file size and LBA variables +# if FF_FS_EXFAT +# if FF_INTDEF != 2 +# error exFAT feature wants C99 or later +# endif +typedef QWORD FSIZE_t; +# if FF_LBA64 +typedef QWORD LBA_t; +# else +typedef DWORD LBA_t; +# endif +# else +# if FF_LBA64 +# error exFAT needs to be enabled when enable 64-bit LBA +# endif +typedef DWORD FSIZE_t; +typedef DWORD LBA_t; +# endif + +/// Type of path name strings on FatFs API (TCHAR) +/// Unicode in UTF-16 encoding +# if FF_USE_LFN && FF_LFN_UNICODE == 1 +typedef WCHAR TCHAR; +# define _T(_x) L##_x +# define _TEXT(_x) L##_x +/// Unicode in UTF-8 encoding +# elif FF_USE_LFN && FF_LFN_UNICODE == 2 +typedef char TCHAR; +# define _T(_x) u8##_x +# define _TEXT(_x) u8##_x +/// Unicode in UTF-32 encoding +# elif FF_USE_LFN && FF_LFN_UNICODE == 3 +typedef DWORD TCHAR; +# define _T(_x) U##_x +# define _TEXT(_x) U##_x +# elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3) +# error Wrong FF_LFN_UNICODE setting +/// ANSI/OEM code in SBCS/DBCS +# else +typedef char TCHAR; +# define _T(_x) _x +# define _TEXT(_x) _x +# endif + +/// Definitions of volume management + +/// Multiple partition configuration +# if FF_MULTI_PARTITION +struct PARTITION { + /// Physical drive number + BYTE pd; + /// Partition: 0:Auto detect, 1-4:Forced partition) + BYTE pt; +}; + +/// Volume - Partition mapping table +extern PARTITION VolToPart[]; +# endif + +# if FF_STR_VOLUME_ID +# ifndef FF_VOLUME_STRS +/// User defied volume ID +extern const char* VolumeStr[FF_VOLUMES]; +# endif +# endif + +/// Filesystem object structure (FATFS) +struct FATFS { + /// Filesystem type (0:not mounted) + BYTE fs_type; + /// Volume hosting physical drive + BYTE pdrv; + /// Logical drive number (used only when FF_FS_REENTRANT) + BYTE ldrv; + /// Number of FATs (1 or 2) + BYTE n_fats; + /// win[] status (b0:dirty) + BYTE wflag; + /// FSINFO status (b7:disabled, b0:dirty) + BYTE fsi_flag; + /// Volume mount ID + WORD id; + /// Number of root directory entries (FAT12/16) + WORD n_rootdir; + /// Cluster size [sectors] + WORD csize; +# if FF_MAX_SS != FF_MIN_SS + /// Sector size (512, 1024, 2048 or 4096) + WORD ssize; +# endif +# if FF_USE_LFN + /// LFN working buffer + WCHAR* lfnbuf; +# endif +# if FF_FS_EXFAT + /// Directory entry block scratchpad buffer for exFAT + BYTE* dirbuf; +# endif +# if !FF_FS_READONLY + /// Last allocated cluster + DWORD last_clst; + /// Number of free clusters + DWORD free_clst; +# endif +# if FF_FS_RPATH + /// Current directory start cluster (0:root) + DWORD cdir; +# if FF_FS_EXFAT + /// Containing directory start cluster (invalid when cdir is 0) + DWORD cdc_scl; + /// b31-b8:Size of containing directory, b7-b0: Chain status + DWORD cdc_size; + /// Offset in the containing directory (invalid when cdir is 0) + DWORD cdc_ofs; +# endif +# endif + /// Number of FAT entries (number of clusters + 2) + DWORD n_fatent; + /// Number of sectors per FAT + DWORD fsize; + /// Volume base sector + LBA_t volbase; + /// FAT base sector + LBA_t fatbase; + /// Root directory base sector (FAT12/16) or cluster (FAT32/exFAT) + LBA_t dirbase; + /// Data base sector + LBA_t database; +# if FF_FS_EXFAT + /// Allocation bitmap base sector + LBA_t bitbase; +# endif + /// Current sector appearing in the win[] + LBA_t winsect; + /// Disk access window for Directory, FAT (and file data at tiny cfg) + BYTE win[FF_MAX_SS]; +}; + +/// Object ID and allocation information (FFOBJID) +struct FFOBJID { + /// Pointer to the hosting volume of this object + FATFS* fs; + /// Hosting volume's mount ID + WORD id; + /// Object attribute + BYTE attr; + /// Object chain status (b1-0: =0:not contiguous, =2:contiguous, + /// =3:fragmented in this session, b2:sub-directory stretched) + BYTE stat; + /// Object data start cluster (0:no cluster or root directory) + DWORD sclust; + /// Object size (valid when sclust != 0) + FSIZE_t objsize; +# if FF_FS_EXFAT + /// Size of first fragment - 1 (valid when stat == 3) + DWORD n_cont; + /// Size of last fragment needs to be written to FAT (valid when not zero) + DWORD n_frag; + /// Containing directory start cluster (valid when sclust != 0) + DWORD c_scl; + /// b31-b8:Size of containing directory, b7-b0: Chain status (valid when + /// c_scl != 0) + DWORD c_size; + /// Offset in the containing directory (valid when file object and sclust != + /// 0) + DWORD c_ofs; +# endif +# if FF_FS_LOCK + /// File lock ID origin from 1 (index of file semaphore table Files[]) + UINT lockid; +# endif +}; + +/// File object structure (FIL) +struct FIL { + /// Object identifier (must be the 1st member to detect invalid object + /// pointer) + FFOBJID obj; + /// File status flags + BYTE flag; + /// Abort flag (error code) + BYTE err; + /// File read/write pointer (Zeroed on file open) + FSIZE_t fptr; + /// Current cluster of fpter (invalid when fptr is 0) + DWORD clust; + /// Sector number appearing in buf[] (0:invalid) + LBA_t sect; +# if !FF_FS_READONLY + /// Sector number containing the directory entry (not used at exFAT) + LBA_t dir_sect; + /// Pointer to the directory entry in the win[] (not used at exFAT) + BYTE* dir_ptr; +# endif +# if FF_USE_FASTSEEK + /// Pointer to the cluster link map table (nulled on open, set by + /// application) + DWORD* cltbl; +# endif +# if !FF_FS_TINY + /// File private data read/write window + BYTE buf[FF_MAX_SS]; +# endif +}; + +/// Directory object structure (DIR) +struct DIR { + /// Object identifier + FFOBJID obj; + /// Current read/write offset + DWORD dptr; + /// Current cluster + DWORD clust; + /// Current sector (0:Read operation has terminated) + LBA_t sect; + /// Pointer to the directory item in the win[] + BYTE* dir; + /// SFN (in/out) {body[8],ext[3],status[1]} + BYTE fn[12]; +# if FF_USE_LFN + /// Offset of current entry block being processed (0xFFFFFFFF:Invalid) + DWORD blk_ofs; +# endif +# if FF_USE_FIND + /// Pointer to the name matching pattern + const TCHAR* pat; +# endif +}; + +/// File information structure (FILINFO) +struct FILINFO { + /// File size + FSIZE_t fsize; + /// Modified date + WORD fdate; + /// Modified time + WORD ftime; + /// File attribute + BYTE fattrib; +# if FF_USE_LFN + /// Alternative file name + TCHAR altname[FF_SFN_BUF + 1]; + /// Primary file name + TCHAR fname[FF_LFN_BUF + 1]; +# else + /// File name + TCHAR fname[12 + 1]; +# endif +}; + +/// Format parameter structure (MKFS_PARM) +struct MKFS_PARM { + /// Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD) + BYTE fmt; + /// Number of FATs + BYTE n_fat; + /// Data area alignment (sector) + UINT align; + /// Number of root directory entries + UINT n_root; + /// Cluster size (byte) + DWORD au_size; +}; + +/** + * @brief File function return code (FRESULT) + */ +enum FRESULT { + /// (0) Succeeded + FR_OK = 0, + /// (1) A hard error occurred in the low level disk I/O layer + FR_DISK_ERR, + /// (2) Assertion failed + FR_INT_ERR, + /// (3) The physical drive cannot work + FR_NOT_READY, + /// (4) Could not find the file + FR_NO_FILE, + /// (5) Could not find the path + FR_NO_PATH, + /// (6) The path name format is invalid + FR_INVALID_NAME, + /// (7) Access denied due to prohibited access or directory full + FR_DENIED, + /// (8) Access denied due to prohibited access + FR_EXIST, + /// (9) The file/directory object is invalid + FR_INVALID_OBJECT, + /// (10) The physical drive is write protected + FR_WRITE_PROTECTED, + /// (11) The logical drive number is invalid + FR_INVALID_DRIVE, + /// (12) The volume has no work area + FR_NOT_ENABLED, + /// (13) There is no valid FAT volume + FR_NO_FILESYSTEM, + /// (14) The f_mkfs() aborted due to any problem + FR_MKFS_ABORTED, + /// (15) Could not get a grant to access the volume within defined period + FR_TIMEOUT, + /// (16) The operation is rejected according to the file sharing policy + FR_LOCKED, + /// (17) LFN working buffer could not be allocated + FR_NOT_ENOUGH_CORE, + /// (18) Number of open files > FF_FS_LOCK + FR_TOO_MANY_OPEN_FILES, + /// (19) Given parameter is invalid + FR_INVALID_PARAMETER +}; + +// FatFs Module Application Interface + +/** + * @brief Open or create a file + * @param _fp Pointer to the blank file object + * @param _path Pointer to the file name + * @param _mode Access mode and open mode flags + * @return FRESULT @see FRESULT + */ +FRESULT f_open(FIL* _fp, const TCHAR* _path, BYTE _mode); + +/** + * @brief Close an open file object + * @param _fp Open file to be closed + * @return FRESULT @see FRESULT + */ +FRESULT f_close(FIL* _fp); + +/** + * @brief Read data from the file + * @param _fp Open file to be read + * @param _buff Data buffer to store the read data + * @param _btr Number of bytes to read + * @param _br Number of bytes read + * @return FRESULT @see FRESULT + */ +FRESULT f_read(FIL* _fp, void* _buff, UINT _btr, UINT* _br); + +/** + * @brief Write data to the file + * @param _fp Open file to be written + * @param _buff Data to be written + * @param _btw Number of bytes to write + * @param _bw Number of bytes written + * @return FRESULT @see FRESULT + */ +FRESULT f_write(FIL* _fp, const void* _buff, UINT _btw, UINT* _bw); + +/** + * @brief Move file pointer of the file object + * @param _fp Pointer to the file object + * @param _ofs File pointer from top of file + * @return FRESULT @see FRESULT + */ +FRESULT f_lseek(FIL* _fp, FSIZE_t _ofs); + +/** + * @brief Truncate the file + * @param _fp Pointer to the file object + * @return FRESULT @see FRESULT + */ +FRESULT f_truncate(FIL* _fp); + +/** + * @brief Flush cached data of the writing file + * @param _fp Open file to be synced + * @return FRESULT @see FRESULT + */ +FRESULT f_sync(FIL* _fp); + +/** + * @brief Open a directory + * @param _dp Pointer to directory object to create + * @param _path Pointer to the directory path + * @return FRESULT @see FRESULT + */ +FRESULT f_opendir(DIR* _dp, const TCHAR* _path); + +/** + * @brief Close an open directory + * @param _dp Pointer to the directory object to be closed + * @return FRESULT @see FRESULT + */ +FRESULT f_closedir(DIR* _dp); + +/** + * @brief Read a directory item + * @param _dp Pointer to the open directory object + * @param _fno Pointer to file information to return + * @return FRESULT @see FRESULT + */ +FRESULT f_readdir(DIR* _dp, FILINFO* _fno); + +/** + * @brief Find first file + * @param _dp Pointer to the blank directory object + * @param _fno Pointer to the file information structure + * @param _path Pointer to the directory to open + * @param _pattern Pointer to the matching pattern + * @return FRESULT @see FRESULT + */ +FRESULT +f_findfirst(DIR* _dp, FILINFO* _fno, const TCHAR* _path, const TCHAR* _pattern); + +/** + * @brief Find next file + * @param _dp Pointer to the open directory object + * @param _fno Pointer to the file information structure + * @return FRESULT @see FRESULT + */ +FRESULT f_findnext(DIR* _dp, FILINFO* _fno); + +/** + * @brief Create a sub directory + * @param _path Pointer to the directory path + * @return FRESULT @see FRESULT + */ +FRESULT f_mkdir(const TCHAR* _path); + +/** + * @brief Delete an existing file or directory + * @param _path Pointer to the file or directory path + * @return FRESULT @see FRESULT + */ +FRESULT f_unlink(const TCHAR* _path); + +/** + * @brief Rename/Move a file or directory + * @param _path_old Pointer to the object name to be renamed + * @param _path_new Pointer to the new name + * @return FRESULT @see FRESULT + */ +FRESULT f_rename(const TCHAR* _path_old, const TCHAR* _path_new); + +/** + * @brief Get file status + * @param _path Pointer to the file path + * @param _fno Pointer to file information to return + * @return FRESULT @see FRESULT + */ +FRESULT f_stat(const TCHAR* _path, FILINFO* _fno); + +/** + * @brief Change attribute of a file/dir + * @param _path Pointer to the file path + * @param _attr Attribute bits + * @param _mask Attribute mask to change + * @return FRESULT @see FRESULT + */ +FRESULT f_chmod(const TCHAR* _path, BYTE _attr, BYTE _mask); + +/** + * @brief Change timestamp of a file/dir + * @param _path Pointer to the file/directory name + * @param _fno Pointer to the timestamp to be set + * @return FRESULT @see FRESULT + */ +FRESULT f_utime(const TCHAR* _path, const FILINFO* _fno); + +/** + * @brief Change current directory + * @param _path Pointer to the directory path + * @return FRESULT @see FRESULT + */ +FRESULT f_chdir(const TCHAR* _path); + +/** + * @brief Change current drive + * @param _path Drive number to set + * @return FRESULT @see FRESULT + */ +FRESULT f_chdrive(const TCHAR* _path); + +/** + * @brief Get current directory + * @param _buff Pointer to the directory path + * @param _len Size of buff in unit of TCHAR + * @return FRESULT @see FRESULT + */ +FRESULT f_getcwd(TCHAR* _buff, UINT _len); + +/** + * @brief Get number of free clusters on the drive + * @param _path Logical drive number + * @param _nclst Pointer to a variable to return number of free + * clusters + * @param _fatfs Pointer to return pointer to corresponding + * filesystem object + * @return FRESULT @see FRESULT + */ +FRESULT f_getfree(const TCHAR* _path, DWORD* _nclst, FATFS** _fatfs); + +/** + * @brief Get volume label + * @param _path Logical drive number + * @param _label Buffer to store the volume label + * @param _vsn Variable to store the volume serial number + * @return FRESULT @see FRESULT + */ +FRESULT f_getlabel(const TCHAR* _path, TCHAR* _label, DWORD* _vsn); + +/** + * @brief Set volume label + * @param _label Volume label to set with heading logical drive + * number + * @return FRESULT @see FRESULT + */ +FRESULT f_setlabel(const TCHAR* _label); + +/** + * @brief Forward data to the stream + * @param _fp Pointer to the file object + * @param _func Pointer to the streaming function + * @param _btf Number of bytes to forward + * @param _bf Pointer to number of bytes forwarded + * @return FRESULT @see FRESULT + */ +FRESULT +f_forward(FIL* _fp, UINT (*_func)(const BYTE*, UINT), UINT _btf, UINT* _bf); + +/** + * @brief Allocate a contiguous block to the file + * @param _fp Pointer to the file object + * @param _fsz File size to be expanded to + * @param _opt Operation mode 0:Find and prepare or 1:Find and + * allocate + * @return FRESULT @see FRESULT + */ +FRESULT f_expand(FIL* _fp, FSIZE_t _fsz, BYTE _opt); + +/** + * @brief Mount/Unmount a logical drive + * @param _fs Pointer to the filesystem object to be registered + * (NULL:unmount) + * @param _path Logical drive number to be mounted/unmounted + * @param _opt Mount option: 0=Do not mount (delayed mount), + * 1=Mount immediately + * @return FRESULT @see FRESULT + */ +FRESULT f_mount(FATFS* _fs, const TCHAR* _path, BYTE _opt); + +/** + * @brief Create a FAT volume + * @param _path Logical drive number + * @param _opt Format options + * @param _work Pointer to working buffer (null: use len bytes of + * heap memory) + * @param _len Size of working buffer [byte] + * @return FRESULT @see FRESULT + */ +FRESULT +f_mkfs(const TCHAR* _path, const MKFS_PARM* _opt, void* _work, UINT _len); + +/** + * @brief Divide a physical drive into some partitions + * @param _pdrv Physical drive number + * @param _ptbl Pointer to the size table for each partitions + * @param _work Pointer to the working buffer (null: use heap + * memory) + * @return FRESULT @see FRESULT + */ +FRESULT f_fdisk(BYTE _pdrv, const LBA_t _ptbl[], void* _work); + +/** + * @brief Set current code page + * @param _cp Value to be set as active code page + * @return FRESULT @see FRESULT + */ +FRESULT f_setcp(WORD _cp); + +/** + * @brief Put a character to the file + * @param _c A character to be output + * @param _fp Pointer to the file object + * @return int put 的字节数 + */ +int f_putc(TCHAR _c, FIL* _fp); + +/** + * @brief Put a string to the file + * @param _str Pointer to the string to be output + * @param _cp Pointer to the file object + * @return int put 的字节数 + */ +int f_puts(const TCHAR* _str, FIL* _cp); + +/** + * @brief Put a formatted string to the file + * @param _fp Pointer to the file object + * @param _str Pointer to the format string + * @param ... Optional arguments... + * @return int printf 的字节数 + */ +int f_printf(FIL* _fp, const TCHAR* _str, ...); + +/** + * @brief Get a string from the file + * @param _buff Pointer to the buffer to store read string + * @param _len Size of string buffer (items) + * @param _fp Pointer to the file object + * @return TCHAR* get 的字节数 + */ +TCHAR* f_gets(TCHAR* _buff, int _len, FIL* _fp); + +/// Some API fucntions are implemented as macro + +# define f_eof(_fp) ((int)((_fp)->fptr == (_fp)->obj.objsize)) +# define f_error(_fp) ((_fp)->err) +# define f_tell(_fp) ((_fp)->fptr) +# define f_size(_fp) ((_fp)->obj.objsize) +# define f_rewind(_fp) f_lseek((_fp), 0) +# define f_rewinddir(_dp) f_readdir((_dp), 0) +# define f_rmdir(_path) f_unlink(_path) +# define f_unmount(_path) f_mount(0, _path, 0) + +// Additional Functions + +/// RTC function (provided by user) +# if !FF_FS_READONLY && !FF_FS_NORTC +/// Get current time +DWORD get_fattime(void); +# endif + +/// LFN support functions (defined in ffunicode.c) + +# if FF_USE_LFN >= 1 + +/** + * @brief OEM code to Unicode conversion + * @param _oem OEM code to be converted + * @param _cp Code page for the conversion + * @return WCHAR Returns Unicode character in UTF-16, zero on error + */ +WCHAR ff_oem2uni(WCHAR _oem, WORD _cp); + +/** + * @brief Unicode to OEM code conversion. + * @param _uni UTF-16 encoded character to be converted + * @param _cp Code page for the conversion + * @return WCHAR Returns OEM code character, zero on error + */ +WCHAR ff_uni2oem(DWORD _uni, WORD _cp); + +/** + * @brief Unicode upper-case conversion + * @param _uni Unicode code point to be up-converted + * @return DWORD Returns up-converted code point + */ +DWORD ff_wtoupper(DWORD _uni); +# endif + +/// O/S dependent functions (samples available in ffsystem.c) + +/// Dynamic memory allocation +# if FF_USE_LFN == 3 + +/** + * @brief Allocate memory block + * @param _msize Number of bytes to allocate + * @return void* Returns pointer to the allocated memory block (null + * if not enough core) + */ +void* ff_memalloc(UINT _msize); + +/** + * @brief Free memory block + * @param _mblock Pointer to the memory block to free (no effect if + * null) + */ +void ff_memfree(void* _mblock); + +# endif +/// Sync functions +# if FF_FS_REENTRANT + +/** + * @brief Create a sync object + * This function is called in f_mount function to create a new mutex or + * semaphore for the volume. When a 0 is returned, the f_mount function fails + * with FR_INT_ERR. + * @param _vol Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or + * system mutex (FF_VOLUMES) + * @return int Returns 1:Function succeeded or 0:Could not create + * the mutex + */ +int ff_mutex_create(int _vol); + +/** + * @brief Delete a sync object + * This function is called in f_mount function to delete a mutex or semaphore of + * the volume created with ff_mutex_create function. + * @param _vol Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or + * system mutex (FF_VOLUMES) + */ +void ff_mutex_delete(int _vol); + +/** + * @brief Lock sync object. + * Request a Grant to Access the Volume + * This function is called on enter file functions to lock the volume. + * When a 0 is returned, the file function fails with FR_TIMEOUT. + * @param _vol Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or + * system mutex (FF_VOLUMES) + * @return int Returns 1:Succeeded or 0:Timeout + */ +int ff_mutex_take(int _vol); + +/** + * @brief Unlock sync object. + * Release a Grant to Access the Volume + * This function is called on leave file functions to unlock the volume. + * @param _vol Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or + * system mutex (FF_VOLUMES) + */ +void ff_mutex_give(int _vol); +# endif + +/// Flags and Offset Address + +/// File access mode and open method flags (3rd argument of f_open) +static constexpr const uint32_t FA_READ = 0x01; +static constexpr const uint32_t FA_WRITE = 0x02; +static constexpr const uint32_t FA_OPEN_EXISTING = 0x00; +static constexpr const uint32_t FA_CREATE_NEW = 0x04; +static constexpr const uint32_t FA_CREATE_ALWAYS = 0x08; +static constexpr const uint32_t FA_OPEN_ALWAYS = 0x10; +static constexpr const uint32_t FA_OPEN_APPEND = 0x30; + +/// Fast seek controls (2nd argument of f_lseek) +static constexpr const uint32_t CREATE_LINKMAP = ((FSIZE_t)0 - 1); + +/// Format options (2nd argument of f_mkfs) +static constexpr const uint32_t FM_FAT = 0x01; +static constexpr const uint32_t FM_FAT32 = 0x02; +static constexpr const uint32_t FM_EXFAT = 0x04; +static constexpr const uint32_t FM_ANY = 0x07; +static constexpr const uint32_t FM_SFD = 0x08; + +/// Filesystem type (FATFS.fs_type) +static constexpr const uint32_t FS_FAT12 = 1; +static constexpr const uint32_t FS_FAT16 = 2; +static constexpr const uint32_t FS_FAT32 = 3; +static constexpr const uint32_t FS_EXFAT = 4; + +/// File attribute bits for directory entry (FILINFO.fattrib) +/// Read only +static constexpr const uint32_t AM_RDO = 0x01; +/// Hidden +static constexpr const uint32_t AM_HID = 0x02; +/// System +static constexpr const uint32_t AM_SYS = 0x04; +/// Directory +static constexpr const uint32_t AM_DIR = 0x10; +/// Archive +static constexpr const uint32_t AM_ARC = 0x20; + +# ifdef __cplusplus +} +# endif + +#endif /* FF_DEFINED */ + +#endif /* SIMPLEKERNEL_FF_H */ diff --git a/src/fs/fatfs/include/ffconf.h b/src/fs/fatfs/include/ffconf.h new file mode 100644 index 000000000..99b43df49 --- /dev/null +++ b/src/fs/fatfs/include/ffconf.h @@ -0,0 +1,312 @@ + +/** + * @file ffconf.h + * @brief Configurations of FatFs Module + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on http://elm-chan.org/fsw/ff/00index_e.html + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_FFCONF_H +#define SIMPLEKERNEL_FFCONF_H + +/// Revision ID +#define FFCONF_DEF 80286 + +// Function Configurations + +/** + * @brief This option switches read-only configuration. (0:Read/Write or + * 1:Read-only) Read-only configuration removes writing API functions, + * f_write(), f_sync(), f_unlink(), f_mkdir(), f_chmod(), f_rename(), + * f_truncate(), f_getfree() and optional writing functions as well. + */ +#define FF_FS_READONLY 0 + +/** + * @brief This option defines minimization level to remove some basic API + * functions. + * + * 0: Basic functions are fully enabled. + * 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() + * are removed. + * 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. + * 3: f_lseek() function is removed in addition to 2. + */ +#define FF_FS_MINIMIZE 0 + +/** + * @brief This option switches filtered directory read functions, f_findfirst() + * and f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) + */ +#define FF_USE_FIND 1 + +/** + * @brief This option switches f_mkfs() function. (0:Disable or 1:Enable) + */ +#define FF_USE_MKFS 0 + +/** + * @brief This option switches fast seek function. (0:Disable or 1:Enable) + */ +#define FF_USE_FASTSEEK 0 + +/** + * @brief This option switches f_expand function. (0:Disable or 1:Enable) + */ +#define FF_USE_EXPAND 0 + +/** + * @brief This option switches attribute manipulation functions, f_chmod() and + * f_utime(). / (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to + * enable this option. + */ +#define FF_USE_CHMOD 0 + +/** + * @brief This option switches volume label functions, f_getlabel() and + * f_setlabel(). (0:Disable or 1:Enable) + */ +#define FF_USE_LABEL 0 + +/** + * @brief This option switches f_forward() function. (0:Disable or 1:Enable) + */ +#define FF_USE_FORWARD 0 + +/** + * @brief FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() + * and f_printf(). 0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE + * have no effect. 1: Enable without LF-CRLF conversion. 2: Enable with LF-CRLF + * conversion. FF_PRINT_LLI = 1 makes f_printf() support long long argument and + * FF_PRINT_FLOAT = 1/2 / makes f_printf() support floating point argument. + * These features want C99 or later. / When FF_LFN_UNICODE >= 1 with LFN + * enabled, string functions convert the character / encoding in it. + * FF_STRF_ENCODE selects assumption of character encoding ON THE FILE / to be + * read/written via those functions. 0: ANSI/OEM in current CP 1: Unicode in + * UTF-16LE 2: Unicode in UTF-16BE 3: Unicode in UTF-8 + */ +#define FF_USE_STRFUNC 0 +#define FF_PRINT_LLI 1 +#define FF_PRINT_FLOAT 1 +#define FF_STRF_ENCODE 3 + +// Locale and Namespace Configurations + +/** + * @brief This option specifies the OEM code page to be used on the target + * system. Incorrect code page setting can cause a file open failure. + * 437 - U.S. + * 720 - Arabic + * 737 - Greek + * 771 - KBL + * 775 - Baltic + * 850 - Latin 1 + * 852 - Latin 2 + * 855 - Cyrillic + * 857 - Turkish + * 860 - Portuguese + * 861 - Icelandic + * 862 - Hebrew + * 863 - Canadian French + * 864 - Arabic + * 865 - Nordic + * 866 - Russian + * 869 - Greek 2 + * 932 - Japanese (DBCS) + * 936 - Simplified Chinese (DBCS) + * 949 - Korean (DBCS) + * 950 - Traditional Chinese (DBCS) + * 0 - Include all code pages above and configured by f_setcp() + */ +#define FF_CODE_PAGE 437 + +/** + * @brief The FF_USE_LFN switches the support for LFN (long file name). + * 0: Disable LFN. FF_MAX_LFN has no effect. + * 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. + * 2: Enable LFN with dynamic working buffer on the STACK. + * 3: Enable LFN with dynamic working buffer on the HEAP. + * To enable the LFN, ffunicode.c needs to be added to the project. + * The LFN function requires certain internal working buffer occupies + * (FF_MAX_LFN + 1) * 2 bytes and additional (FF_MAX_LFN + 44) / 15 * 32 bytes + * when exFAT is enabled. The FF_MAX_LFN defines size of the working buffer in + * UTF-16 code unit and it can be in range of 12 to 255. It is recommended to be + * set it 255 to fully support LFN specification. When use stack for the working + * buffer, take care on stack overflow. When use heap memory for the working + * buffer, memory management functions, ff_memalloc() and ff_memfree() + * exemplified in ffsystem.c, need to be added to the project. + */ +#define FF_USE_LFN 0 +#define FF_MAX_LFN 255 + +/** + * @brief This option switches the character encoding on the API when LFN is + * enabled. 0: ANSI/OEM in current CP (TCHAR = char) 1: Unicode in UTF-16 (TCHAR + * = WCHAR) 2: Unicode in UTF-8 (TCHAR = char) 3: Unicode in UTF-32 (TCHAR = + * DWORD) Also behavior of string I/O functions will be affected by this option. + * When LFN is not enabled, this option has no effect. + */ +#define FF_LFN_UNICODE 2 + +/** + * @brief This set of options defines size of file name members in the FILINFO + * structure which is used to read out directory items. These values should be + * sufficient for the file names to read. The maximum possible length of the + * read file name depends on character encoding. When LFN is not enabled, + * these options have no effect. + */ +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 + +/** + * @brief This option configures support for relative path. + * 0: Disable relative path and remove related functions. + * 1: Enable relative path. f_chdir() and f_chdrive() are available. + * 2: f_getcwd() function is available in addition to 1. + */ +#define FF_FS_RPATH 0 + +// Drive/Volume Configurations + +/** + * @brief Number of volumes (logical drives) to be used. (1-10) + */ +#define FF_VOLUMES 1 + +/** + * @brief FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. + * When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as + * drive number in the path name. FF_VOLUME_STRS defines the volume ID strings + * for each logical drives. Number of items must not be less than FF_VOLUMES. + * Valid characters for the volume ID strings are A-Z, a-z and 0-9, however, + * they are compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and + * FF_VOLUME_STRS is not defined, a user defined volume string table is needed + * as: const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... + */ +#define FF_STR_VOLUME_ID 0 +#define FF_VOLUME_STRS "RAM", "NAND", "CF", "SD", "SD2", "USB", "USB2", "USB3" + +/** + * @brief This option switches support for multiple volumes on the physical + * drive. By default (0), each logical drive number is bound to the same + * physical drive number and only an FAT volume found on the physical drive will + * be mounted. When this function is enabled (1), each logical drive number can + * be bound to arbitrary physical drive and partition listed in the VolToPart[]. + * Also f_fdisk() function will be available. + */ +#define FF_MULTI_PARTITION 0 + +/** + * @brief This set of options configures the range of sector size to be + * supported. (512, 1024, 2048 or 4096) Always set both 512 for most systems, + * generic memory card and harddisk, but a larger value may be required for + * on-board flash memory and some type of optical media. When FF_MAX_SS is + * larger than FF_MIN_SS, FatFs is configured for variable sector size mode and + * disk_ioctl() function needs to implement GET_SECTOR_SIZE command. + */ +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 + +/** + * @brief This option switches support for 64-bit LBA. (0:Disable or 1:Enable) + * To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) + */ +#define FF_LBA64 0 + +/** + * @brief Minimum number of sectors to switch GPT as partitioning format in + * f_mkfs and f_fdisk function. 0x100000000 max. This option has no effect when + * FF_LBA64 == 0. + */ +#define FF_MIN_GPT 0x10000000 + +/** + * @brief This option switches support for ATA-TRIM. (0:Disable or 1:Enable) + * To enable Trim function, also CTRL_TRIM command should be implemented to the + * disk_ioctl() function. + */ +#define FF_USE_TRIM 0 + +// System Configurations + +/** + * @brief This option switches tiny buffer configuration. (0:Normal or 1:Tiny) + * At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS + * bytes. Instead of private sector buffer eliminated from the file object, + * common sector buffer in the filesystem object (FATFS) is used for the file + * data transfer. + */ +#define FF_FS_TINY 0 + +/** + * @brief This option switches support for exFAT filesystem. (0:Disable or + * 1:Enable) To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) + * Note that enabling exFAT discards ANSI C (C89) compatibility. + */ +#define FF_FS_EXFAT 0 + +/** + * @brief The option FF_FS_NORTC switches timestamp feature. If the system does + * not have an RTC or valid timestamp is not needed, set FF_FS_NORTC = 1 to + * disable the timestamp feature. Every object modified by FatFs will have a + * fixed timestamp defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in + * local time. To enable timestamp function (FF_FS_NORTC = 0), get_fattime() + * function need to be added to the project to read current time form real-time + * clock. FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. These + * options have no effect in read-only configuration (FF_FS_READONLY = 1). + */ +#define FF_FS_NORTC 0 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2022 + +/** + * @brief If you need to know correct free space on the FAT32 volume, set bit 0 + * of this option, and f_getfree() function at the first time after volume mount + * will force a full FAT scan. Bit 1 controls the use of last allocated cluster + * number. + * bit0=0: Use free cluster count in the FSINFO if available. + * bit0=1: Do not trust free cluster count in the FSINFO. + * bit1=0: Use last allocated cluster number in the FSINFO if available. + * bit1=1: Do not trust last allocated cluster number in the FSINFO. + */ +#define FF_FS_NOFSINFO 0 + +/** + * @brief The option FF_FS_LOCK switches file lock function to control + * duplicated file open and illegal operation to open objects. This option must + * be 0 when FF_FS_READONLY is 1. 0: Disable file lock function. To avoid volume + * corruption, application program should avoid illegal open, remove and rename + * to the open objects. >0: Enable file lock function. The value defines how + * many files/sub-directories can be opened simultaneously under file lock + * control. Note that the file lock control is independent of re-entrancy. + */ +#define FF_FS_LOCK 0 + +/** + * @brief The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of + * the FatFs module itself. Note that regardless of this option, file access to + * different volume is always re-entrant and volume control functions, + * f_mount(), f_mkfs() and f_fdisk() function, are always not re-entrant. Only + * file/directory access to the same volume is under control of this feature. + * + * 0: Disable re-entrancy. FF_FS_TIMEOUT have no effect. + * 1: Enable re-entrancy. Also user provided synchronization handlers, + * ff_mutex_create(), ff_mutex_delete(), ff_mutex_take() and ff_mutex_give() + * function, must be added to the project. Samples are available in ffsystem.c. + * + * The FF_FS_TIMEOUT defines timeout period in unit of O/S time tick. + */ +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 + +#endif /* SIMPLEKERNEL_FFCONF_H */ diff --git a/src/include/DataStructure/DataStructuer.h b/src/include/DataStructure/DataStructuer.h deleted file mode 100644 index 207986776..000000000 --- a/src/include/DataStructure/DataStructuer.h +++ /dev/null @@ -1,138 +0,0 @@ - -#ifndef DataStructuer_h -#define DataStructuer_h - -#include "stddef.h" - - -// linkedlist -template -class LLNode { -public: - T data; - LLNode * next; - LLNode * prev; - LLNode(T data); - LLNode(void); - ~LLNode(); -}; - -template -class LinkedList { -private: - LLNode * head; - LLNode * tail; -public: - void test(void) const; // 测试函数 - LinkedList(void); - LinkedList(const T data); - void AddtoHead(const T data); // 添加到头部 - void AddtoTail(const T data); // 添加到尾部 - T RemoveFromHead(void); // 从头部删除 - T RemoveFromTail(void); // 从尾部删除 - T GetHead(void) const; // 获取头部数据 - T GetTail(void) const; // 获取尾部数据 - bool Search(const T key) const; // 判断 key 是否在链表内 - bool Empty(void) const; // 判断链表是否为空 - int size(void) const; // 返回链表大小 - ~LinkedList(void); -}; - -// binary tree -template -class BSTN { -public: - T data; - BSTN * left; - BSTN * right; - BSTN * parent; - BSTN(void); - BSTN(T data, BSTN * left=NULL, BSTN * right=NULL); - ~BSTN(void); -}; - -template -class BinarySearchTree { -protected: - BSTN * root; // 保存树根节点 - int height; // 保存树高 - int ipl(BSTN * bstn) const; // Internal Path Length 内部路径长度 - void visit(BSTN * bstn) const; // ok - void bfs(BSTN * bstn) const; // 广度优先遍历 ok - void bfs(BSTN *bstn, std::function*)> fun) const; - void dfs_vlr(BSTN * bstn) const; // VLR ok - void dfs_vlr(BSTN * bstn, std::function*)> fun) const; - void dfs_lvr(BSTN * bstn) const; // LVR ok - void dfs_lvr(BSTN * bstn, std::function*)> fun) const; - void dfs_lrv(BSTN * bstn) const; // LRV ok - void dfs_lrv(BSTN * bstn, std::function*)> fun) const; - void display_tree(BSTN * bstn) const; // 打印树结构 - const BSTN * array_to_bst(T * arr); // 将数组转换为 BST 算法见 IA 3e 中文版 p84 - void clear(BSTN *bstn); // 删除以指定节点为根的树 ok - int get_height(BSTN *bstn) const; // 返回指定树的树高 - int get_leaf(BSTN *bstn) const; // 返回以指定节点为根的树的叶子结点数量 - bool insert(BSTN * bstn, const T data) const; // 插入 ok - bool search_in_sub_tree(BSTN * bstn, const T data) const; // 在指定子树中搜索 data ok -public: - BinarySearchTree(void); - BinarySearchTree(const T data); - ~BinarySearchTree(void); - bool Search(const T data) const; // 搜索 data - bool Empty(void) const; // 返回是否为空 - bool Insert(const T data); // 插入 - int GetHeight(void) const; // 返回树高 - int GetLeaf(void) const; // 返回树叶子节点数量 - void Clear(); // 删除树 -}; - -// queue -template -class Queue{ -private: - LinkedList LL; -public: - Queue(); - Queue(const T data); - ~Queue(); - void EnQueue(const T data); - T DeQueue(void); - bool Empty(void) const; - T GetFirst(void) const; -}; - -// stack -template -class Stack { -private: - LinkedList LL; -public: - void test(void); // 测试函数 - Stack(void); - Stack(const T data); - ~Stack(); - T Top(void) const; // 返回栈顶数据 - T Bottom(void) const; // 返回栈底数据 - T Pop(void); // 出栈 - void Push(const T data); // 压栈 - int Size(void) const; // 返回栈的大小 - bool Empty(void) const; // 判断栈是否为空 -}; - -// alg -template -void sort_bubble233(T * begin, T * end); - -template -void sort_selection234(T * begin, T * end); - -template -void sort_selection233(T * begin, T * end); - -template -void mergesort(T a[], size_t l, size_t h); - -template -void sort_insert233(T * begin, T * end); - - -#endif diff --git a/src/include/DataStructure/LinkedList.cpp b/src/include/DataStructure/LinkedList.cpp deleted file mode 100755 index f2c00aa02..000000000 --- a/src/include/DataStructure/LinkedList.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// -// LinkedList.cpp -// DS -// -// Created by Zone.Niuzh on 2018/9/25. -// Copyright © 2018 MRNIU. All rights reserved. -// -// 双向链表的实现 -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// LinkedList.cpp for MRNIU/SimpleKernel. - - -#include "DataStructuer.h" - -template -class LLNode { -public: - T data; - LLNode * next; - LLNode * prev; - LLNode(T data); - LLNode(void); - ~LLNode(); -}; - -template -LLNode::LLNode(T data){ - this->data=data; - next=NULL; - prev=NULL; - return; -} - -template -LLNode::LLNode(){ - data=NULL; - next=NULL; - prev=NULL; - return; -} - -template -class LinkedList { -private: - LLNode * head; - LLNode * tail; -public: - void test(void) const; // 测试函数 - LinkedList(void); - LinkedList(const T data); - void AddtoHead(const T data); // 添加到头部 - void AddtoTail(const T data); // 添加到尾部 - T RemoveFromHead(void); // 从头部删除 - T RemoveFromTail(void); // 从尾部删除 - T GetHead(void) const; // 获取头部数据 - T GetTail(void) const; // 获取尾部数据 - bool Search(const T key) const; // 判断 key 是否在链表内 - bool Empty(void) const; // 判断链表是否为空 - int size(void) const; // 返回链表大小 - ~LinkedList(void); -}; - -template -LinkedList::LinkedList(){ - head=tail=NULL; - return; -} - -template -LinkedList::LinkedList(const T data){ - head=tail=new LLNode(data); - return; -} - -template -void LinkedList::AddtoHead(const T data){ - if(Empty()){ // 如果链表为空 - head=tail=new LLNode(data); // 则使头尾指针均指向 new 的节点 - } else{ // 否则将头指针换成 new 的节点 - head->prev=new LLNode(data); - head->prev->next=head; - head=head->prev; - } - return; -} - -template -void LinkedList::AddtoTail(const T data){ - if(Empty()){ // 如果链表为空 - head=tail=new LLNode(data); // 则使头尾指针均指向 new 的节点 - } else{ - tail->next=new LLNode(data); - tail->next->prev=tail; - tail=tail->next; - } - return; -} - -template -T LinkedList::RemoveFromHead(void){ - if(Empty()){ // 如果链表为空 - throw ("Linked List is empty!"); - } else if ((head==tail)&&(head!=NULL)){ // 仅有一个元素 - T tmp=head->data; - head=tail=NULL; - return tmp; - } else{ - head=head->next; - T tmp=head->prev->data; - head->prev=NULL; - return tmp; - } -} - -template -T LinkedList::RemoveFromTail(void){ - if(Empty()){ // 如果链表为空 -// return 0xCDCD; - return NULL; - } else if ((head==tail)&&(tail!=NULL)){ // 仅有一个元素 - T tmp=tail->data; - head=tail=NULL; - return tmp; - } else{ - tail=tail->prev; - T tmp=tail->next->data; - tail->next=NULL; - return tmp; - } -} - -template -T LinkedList::GetHead() const{ - if(Empty()) - return 0xCDCD; - else - return head->data; -} - -template -T LinkedList::GetTail() const{ - if(Empty()) - return 0xCDCD; - else - return tail->data; -} - - -template -bool LinkedList::Search(const T key) const{ - LLNode * tmp=head; - while (tmp->next!=NULL) { - if(tmp->data==key) - return true; - tmp=tmp->next; - } - return false; -} - -template -bool LinkedList::Empty(void) const{ - return head==NULL; // 如果头指针为空,则链表为空 -} - -template -int LinkedList::size() const{ - int count=1; - LLNode * tmp=head; - while(tmp->next!=NULL){ - count+=1; - tmp=tmp->next; - } - return count; -} - -template -LinkedList::~LinkedList(void){ - while(!Empty()){ - LLNode * tmp=head->next; - head=NULL; - head=tmp; - } - return; -} diff --git a/src/include/DataStructure/Queue.cpp b/src/include/DataStructure/Queue.cpp deleted file mode 100644 index 66b51fed7..000000000 --- a/src/include/DataStructure/Queue.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// Queue.cpp -// DataStructuer -// -// Created by Zone.Niuzh on 2018/9/27. -// Copyright © 2018 MRNIU. All rights reserved. -// -// 队列的链表实现 -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// Queue.cpp for MRNIU/SimpleKernel. - - -#include "DataStructuer.h" - -template -class Queue{ -private: - LinkedList LL; -public: - Queue(); - Queue(const T data); - ~Queue(); - void EnQueue(const T data); - T DeQueue(void); - bool Empty(void) const; - T GetFirst(void) const; -}; - -template -Queue::Queue(){ - return; -} - -template -Queue::Queue(const T data){ - LL.AddtoHead(data); - return; -} - -template -void Queue::EnQueue(const T data){ - LL.AddtoHead(data); - return; -} - -template -T Queue::DeQueue(){ - return LL.RemoveFromTail(); -} - -template -bool Queue::Empty() const{ - return LL.Empty(); -} - -template -T Queue::GetFirst() const{ - return LL.GetHead(); -} - -template -Queue::~Queue(){ - LL.~LinkedList(); - return; -} diff --git a/src/include/DataStructure/SortAlgorithm.cpp b/src/include/DataStructure/SortAlgorithm.cpp deleted file mode 100644 index a12eb8107..000000000 --- a/src/include/DataStructure/SortAlgorithm.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// -// SortAlgorithm.cpp -// DataStructuer -// -// Created by Zone.N on 2018/10/29. -// Copyright © 2018 Zone.N. All rights reserved. -// -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// SortAlgorithm.cpp for MRNIU/SimpleKernel. - - -#include "DataStructuer.h" - -#define PASS(addr, n) (*(addr+n)) -#define EOA(addr, end) (addr==end) -#define SIZE(b, e) (e-b) // C++11 - -template -void swap233(T & src, T & desc){ - T tmp=src; - src=desc; - desc=tmp; - return; -} - -// 插入排序 -template -void sort_insert233(T * begin, T * end){ - for(auto j=1; j=0 && begin[i]>key){ - begin[i+1] = begin[i]; - i--; - } - begin[i+1]=key; - } - return; -} - -// -//void sort233(int b,int e) { -// if(e-b<=0) return; -// int mid=(b+e)/2,p1=b,p2=mid+1,i=b; -// sort(b,mid); -// sort(mid+1,e); -// while( p1<=mid || p2<=e ) -// if( p2>e|| (p1<=mid&&a[p1]<=a[p2]) ) -// t[i++]=a[p1++]; -// else t[i++]=a[p2++]; -// for(i=b;i<=e; i++) -// a[i]=t[i]; -//} - - - -// 这个归并没搞懂,后面补上。 -template -void mergesort(T a[], size_t l, size_t h) { - if (h - l == 1) { - if (a[l] > a[h]) { - T t = a[l]; - a[l] = a[h]; - a[h] = t; - } - } else if (h == l) { - - } else if (h > l) { - size_t size = h - l + 1; - size_t m = l + (h - l) / 2; - mergesort(a, l, m); - mergesort(a, m+1, h); - T* b = new T[size]; - size_t k = 0; - size_t i = l; - size_t j = m+1; - while (i <= m && j <= h) - if (a[i] <= a[j]) - b[k++] = a[i++]; - else - b[k++] = a[j++]; - while(i <= m) - b[k++] = a[i++]; - while(j <= h) - b[k++] = a[j++]; - for (k = 0; k < size; k++) { - a[l+k] = b[k]; - } - delete[] b; - } -} - -template -void sort_merge233(T * begin, T * end) { - auto size=end-begin; - mergesort(begin, 0, size-1); -} - -// 选择排序 -template -void sort_selection233(T * begin, T * end){ - auto size=end-begin; - for(auto i=0;i -void sort_selection234(T * begin, T * end){ - auto size=end-begin; - for(auto i=0;ibegin[max_index]) - max_index=j; - } - swap233(begin[min_index], begin[i]); - swap233(begin[max_index], begin[size-i-1]); - //if( - } - return; -} - -// 冒泡排序 -template -void sort_bubble233(T * begin, T * end){ - auto size=end-begin; - for(auto i=0;ii;j--) - if(begin[j] -class Stack { -private: - LinkedList LL; -public: - void test(void); // 测试函数 - Stack(void); - Stack(const T data); - ~Stack(); - T Top(void) const; // 返回栈顶数据 - T Bottom(void) const; // 返回栈底数据 - T Pop(void); // 出栈 - void Push(const T data); // 压栈 - int Size(void) const; // 返回栈的大小 - bool Empty(void) const; // 判断栈是否为空 -}; - -template -Stack::Stack(const T data){ - LL.AddtoHead(data); - return; -} - -template -Stack::Stack(){ - return; -} - -template -T Stack::Top() const{ - return LL.GetHead(); -} - -template -T Stack::Bottom() const{ - return LL.GetTail(); -} - -template -T Stack::Pop(){ - return LL.RemoveFromHead(); -} - -template -void Stack::Push(const T data_input){ - LL.AddtoHead(data_input); - return; -} - -template -bool Stack::Empty() const{ - return LL.Empty(); -} - -template -int Stack::Size() const{ - return LL.size(); -} - -template -Stack::~Stack(){ - LL.~LinkedList(); - return; -} - -template -void Stack::test(void){ - LL.test(); - return; -} diff --git a/src/include/README.md b/src/include/README.md deleted file mode 100644 index 5c9820556..000000000 --- a/src/include/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# src/include/ - -## 文件说明 - -- kernel.h - 声明了内核要用到的函数与变量。 - -- tty.h - 命令行输出。 - -- vga.h - 显示相关的函数。 - -- port.h - 端口输入输出。 - -- debug.h - 调试函数 - -- libc - 基础库,包括字符串、输出、类型定义等 - -- mm/ - 内存相关 - -- pic.hpp - - pic 芯片的初始化与刷新 - - -- multiboot.h - - 多重引导规范相关结构 - -- elf.h - - elf 文件格式相关结构 - - - -## 参考资料 - -于渊 <操作系统实现> p268 - - diff --git a/src/include/boot_info.h b/src/include/boot_info.h new file mode 100644 index 000000000..2b4bbc981 --- /dev/null +++ b/src/include/boot_info.h @@ -0,0 +1,77 @@ + +/** + * @file boot_info.h + * @brief 启动信息接口 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_BOOT_INFO_H +#define SIMPLEKERNEL_BOOT_INFO_H + +#include "cstdint" +#include "resource.h" +#include "string" +#include "vector" + +/** + * @brief 启动信息接口 + * 由引导传递的机器信息处理 + * 如 grub2 传递的 multiboot2 结构 + * opensbi 传递的 dtb 结构 + * 注意这部分是通过内存传递的,在重新保存之前不能被覆盖 + * 架构专有的数据在 dtb.h 或 multiboot2.h + * 实现在 dtb.cpp 或 multiboot2.cpp + */ +namespace BOOT_INFO { +/// 声明,定义在具体的实现中 +/// 是否已经初始化过 +extern bool inited; +/// 地址 +extern "C" uintptr_t boot_info_addr; +/// 长度 +extern size_t boot_info_size; +/// 保存 sbi 传递的启动核 +extern "C" size_t dtb_init_hart; + +/** + * @brief 初始化,定义在具体实现中 + * @return true 成功 + * @return false 成功 + */ +extern bool init(void); + +/** + * @brief 获取物理内存信息 + * @return resource_t 物理内存资源信息 + */ +extern resource_t get_memory(void); + +/** + * @brief 获取 clint 信息 + * @return resource_t clint 资源信息 + */ +extern resource_t get_clint(void); + +/** + * @brief 获取 plic 信息 + * @return resource_t plic 资源信息 + */ +extern resource_t get_plic(void); + +// 根据 compatible 寻找节点 +// 返回一个二级数组,第一级是所有设备,第二级是使用的资源 +// 因为使用了 stl,只能在 lib 分支及其之后使用 +// TODO: 目前只实现了 riscv,ia32 还没有考虑 +extern size_t find_via_prefix(const char* _prefix, resource_t* _resource); +}; // namespace BOOT_INFO + +#endif /* SIMPLEKERNEL_BOOT_INFO_H */ diff --git a/src/include/buf.h b/src/include/buf.h new file mode 100644 index 000000000..90c1f674f --- /dev/null +++ b/src/include/buf.h @@ -0,0 +1,49 @@ + +/** + * @file buf.h + * @brief 设备缓冲区头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-10 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-10Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_BUF_H +#define SIMPLEKERNEL_BUF_H + +#include "atomic" +#include "common.h" +#include "cstdint" +#include "cstring" + +/** + * @brief 用于设备与内存数据交换 + */ +class buf_t { +private: + +protected: + +public: + /// 是否已经取回数据 + std::atomic_bool valid; + /// 硬盘扇区号 + uint64_t sector; + /// 数据缓冲 + uint8_t data[COMMON::BUFFFER_SIZE]; + + buf_t(void) { + memset(data, 0, COMMON::BUFFFER_SIZE); + return; + } + + ~buf_t(void) = default; +}; + +#endif /* SIMPLEKERNEL_BUF_H */ diff --git a/src/include/color.h b/src/include/color.h new file mode 100644 index 000000000..252323782 --- /dev/null +++ b/src/include/color.h @@ -0,0 +1,84 @@ + +/** + * @file color.h + * @brief 颜色相关定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_COLOR_H +#define SIMPLEKERNEL_COLOR_H + +#include "cstdint" + +/** + * @brief 颜色定义 + * @note 由于不同平台的颜色实现不同,实际效果有一定差异 + * @todo 标准化 + */ +namespace COLOR { +typedef enum : uint8_t { +#if defined(__i386__) || defined(__x86_64__) + /// RGB: 0 0 0 + BLACK = 0, + /// RGB: 0 0 170 + BLUE = 1, + /// RGB: 0 170 0 + GREEN = 2, + /// RGB: 0 170 170 + CYAN = 3, + /// RGB: 170 0 0 + RED = 4, + /// RGB: 170 0 170 + PURPLE = 5, + /// RGB: 170 85 0 + BROWN = 6, + /// RGB: 170 170 170 + GREY = 7, + /// RGB: 85 85 85 + DARK_GREY = 8, + /// RGB: 85 85 255 + LIGHT_BLUE = 9, + /// RGB: 85 255 85 + LIGHT_GREEN = 10, + /// RGB: 85 255 255 + LIGHT_CYAN = 11, + /// RGB: 255 85 85 + LIGHT_RED = 12, + /// RGB: 255 85 255 + LIGHT_PURPLE = 13, + /// RGB: 255 255 85 + YELLOW = 14, + /// RGB: 255 255 255 + WHITE = 15, +#elif defined(__riscv) + /// @see https://en.wikipedia.org/wiki/ANSI_escape_code + BLACK = 30, + RED = 31, + GREEN = 32, + YELLOW = 33, + BLUE = 34, + PURPLE = 35, + CYAN = 36, + WHITE = 37, + GREY = 90, + LIGHT_RED = 91, + LIGHT_GREEN = 92, + LIGHT_YELLOW = 93, + LIGHT_BLUE = 94, + LIGHT_PURPLE = 95, + LIGHT_CYAN = 96, + LIGHT_WHITE = 97, +#endif +} color_t; +}; // namespace COLOR + +#endif /* SIMPLEKERNEL_COLOR_H */ diff --git a/src/include/common.h b/src/include/common.h new file mode 100644 index 000000000..116f95c5a --- /dev/null +++ b/src/include/common.h @@ -0,0 +1,98 @@ + +/** + * @file common.h + * @brief 通用定义头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_COMMON_H +#define SIMPLEKERNEL_COMMON_H + +#include "cstddef" +#include "cstdint" + +namespace COMMON { +// 引用链接脚本中的变量 +/// @see http://wiki.osdev.org/Using_Linker_Script_Values +/// 内核开始 +extern "C" void* __executable_start[]; +/// 内核结束 +extern "C" void* end[]; + +/// 内核开始 +static const uintptr_t KERNEL_START_ADDR + = reinterpret_cast(__executable_start); +/// 内核结束 +static const uintptr_t KERNEL_END_ADDR = reinterpret_cast(end); + +// 规定数据大小,方便用 +/// 一个字节,8 bits +static constexpr const size_t BYTE = 0x1; +/// 1KB +static constexpr const size_t KB = 0x400; +/// 1MB +static constexpr const size_t MB = 0x100000; +/// 1GB +static constexpr const size_t GB = 0x40000000; +/// 页大小 4KB +static constexpr const size_t PAGE_SIZE = 4 * KB; +/// 内核空间占用大小,包括内核代码部分与预留的,8MB +static constexpr const uint32_t KERNEL_SPACE_SIZE = 8 * MB; +/// 映射内核空间需要的页数 +static constexpr const uint64_t KERNEL_SPACE_PAGES + = KERNEL_SPACE_SIZE / PAGE_SIZE; +/// 栈大小 +static constexpr const uintptr_t STACK_SIZE = 4 * KB; + +/// 缓冲区大小,512 字节,一个扇区 +static constexpr const uintptr_t BUFFFER_SIZE = 512 * BYTE; + +/// 页掩码 +static constexpr const uintptr_t PAGE_MASK = ~(PAGE_SIZE - 1); + +/** + * @brief 对齐 + * @tparam T + * @param _addr 要对齐的地址 + * @param _align 要对齐的目标 + * @return T 对齐过的地址 + * @note 向上取整 + * @note 针对指针 + */ +template +inline T ALIGN(const T _addr, const size_t _align) { + uint8_t* tmp = reinterpret_cast(_addr); + return (T)((ptrdiff_t)(tmp + _align - 1) & (~(_align - 1))); +} + +/** + * @brief 对齐 + * @tparam T + * @param _addr 要对齐的整数 + * @param _align 要对齐的目标 + * @return T 对齐过的整数 + * @note 向上取整 + * @note 针对整数 + */ +template <> +inline uint32_t ALIGN(uint32_t _x, size_t _align) { + return ((_x + _align - 1) & (~(_align - 1))); +} + +template <> +inline uint64_t ALIGN(uint64_t _x, size_t _align) { + return ((_x + _align - 1) & (~(_align - 1))); +} + +}; // namespace COMMON + +#endif /* SIMPLEKERNEL_COMMON_H */ diff --git a/src/include/cpu.hpp b/src/include/cpu.hpp deleted file mode 100644 index 773812c39..000000000 --- a/src/include/cpu.hpp +++ /dev/null @@ -1,251 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// port.h for MRNIU/SimpleKernel. - -#ifndef _CPU_HPP_ -#define _CPU_HPP_ - -#include "stdint.h" -#include "stdbool.h" - -#define EFLAGS_CF 0x00000001 // Carry Flag -#define EFLAGS_PF 0x00000004 // Parity Flag -#define EFLAGS_AF 0x00000010 // Auxiliary carry Flag -#define EFLAGS_ZF 0x00000040 // Zero Flag -#define EFLAGS_SF 0x00000080 // Sign Flag -#define EFLAGS_TF 0x00000100 // Trap Flag -#define EFLAGS_IF 0x00000200 // Interrupt Flag -#define EFLAGS_DF 0x00000400 // Direction Flag -#define EFLAGS_OF 0x00000800 // Overflow Flag -#define EFLAGS_IOPL_MASK 0x00003000 // I/O Privilege Level bitmask -#define EFLAGS_IOPL_0 0x00000000 // IOPL == 0 -#define EFLAGS_IOPL_1 0x00001000 // IOPL == 1 -#define EFLAGS_IOPL_2 0x00002000 // IOPL == 2 -#define EFLAGS_IOPL_3 0x00003000 // IOPL == 3 -#define EFLAGS_NT 0x00004000 // Nested Task -#define EFLAGS_RF 0x00010000 // Resume Flag -#define EFLAGS_VM 0x00020000 // Virtual 8086 mode -#define EFLAGS_AC 0x00040000 // Alignment Check -#define EFLAGS_VIF 0x00080000 // Virtual Interrupt Flag -#define EFLAGS_VIP 0x00100000 // Virtual Interrupt Pending -#define EFLAGS_ID 0x00200000 // ID flag - -// CR0:包含当前处理器运行的控制标志。 -// CR1:保留。 -// CR2:包含发生页面错误时的线性地址。 -// CR3:页面目录表(Page Directory Table)的物理地址。 -// 虚拟地址启用且CR0中PG位设置为1的情况下,CR3可以协助处理器将线性地址转换为物理地址。一般情况下为MMU提供页表的入口实现。 -// CR4:包含处理器扩展功能的标志位。 -// CR8:提供对任务优先级寄存器(Task Priority Register)的读写(仅在64位模式下存在)。 -// 对控制寄存器的读写是通过MOV CRn指令来实现 - -// PE:CR0的位0是启用保护(Protection Enable)标志。当设置该位时即开启了保护模式; -// 当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。 -#define CR0_PE 0x00000001 -#define CR0_MP 0x00000002 -#define CR0_EM 0x00000004 -#define CR0_TS 0x00000008 -#define CR0_ET 0x00000010 - -// NE:对于Intel 80486或以上的CPU,CR0的位5是协处理器错误(Numeric Error)标志。 -// 当设置该标志时,就启用了x87协处理器错误的内部报告机制;若复位该标志,那么就使用PC形式的x87协处理器错误报告机制。 -// 当NE为复位状态并且CPU的IGNNE输入引脚有信号时,那么数学协处理器x87错误将被忽略。 -// 当NE为复位状态并且CPU的IGNNE输入引脚无信号时,那么非屏蔽的数学协处理器x87错误将导致处理器通过FERR引脚在外部产生一个中断, -// 并且在执行下一个等待形式浮点指令或WAIT/FWAIT指令之前立刻停止指令执行。CPU的FERR引脚用于仿真外部协处理器80387的ERROR引脚, -// 因此通常连接到中断控制器输入请求引脚上。NE标志、IGNNE引脚和FERR引脚用于利用外部逻辑来实现PC形式的外部错误报告机制。 -#define CR0_NE 0x00000020 - -// WP:对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。 -// 当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。该标志有利于UNIX类操作系统在创建进程时实现写时复制(Copy on Write)技术。 -#define CR0_WP 0x00010020 -#define CR0_AM 0x00040020 -#define CR0_NW 0x20000000 -#define CR0_CD 0x40000000 - -// PG:CR0的位31是分页(Paging)标志。当设置该位时即开启了分页机制; -// 当复位时则禁止分页机制,此时所有线性地址等同于物理地址。在开启这个标志之前必须已经或者同时开启PE标志。即若要启用分页机制,那么PE和PG标志都要置位。 -#define CR0_PG 0x80000000 - -// 启用保护模式PE(Protected Enable)位(位0)和开启分页PG(Paging)位(位31)分别用于控制分段和分页机制。 -// PE用于控制分段机制。如果PE=1,处理器就工作在开启分段机制环境下,即运行在保护模式下。 -// 如果PE=0,则处理器关闭了分段机制,并如同8086工作于实地址模式下。PG用于控制分页机制。如果PG=1,则开启了分页机制。 -// 如果PG=0,分页机制被禁止,此时线性地址被直接作为物理地址使用。 -// 如果PE=0、PG=0,处理器工作在实地址模式下;如果PG=0、PE=1,处理器工作在没有开启分页机制的保护模式下; -// 如果PG=1、PE=0,此时由于不在保护模式下不能启用分页机制,因此处理器会产生一个一般保护异常,即这种标志组合无效; -// 如果PG=1、PE=1,则处理器工作在开启了分页机制的保护模式下。 - - -#define CR3_PWT 0x00000008 -#define CR3_PCD 0x00000010 - -#define CR4_VME 0x00000001 -#define CR4_PVI 0x00000002 -#define CR4_TSD 0x00000004 -#define CR4_DE 0x00000008 -#define CR4_PSE 0x00000010 -#define CR4_PAE 0x00000020 -#define CR4_MCE 0x00000040 -#define CR4_PGE 0x00000080 -#define CR4_PCE 0x00000100 -#define CR4_OSFXSR 0x00000200 -#define CR4_OSXMMEXCPT 0x00000400 -#define CR4_VMXE 0x00002000 -#define CR4_SMXE 0x00004000 -#define CR4_PCIDE 0x00020000 -#define CR4_OSXSAVE 0x00040000 -#define CR4_SMEP 0x00100000 - -// 执行CPU空操作 -static inline void cpu_hlt(void){ - asm volatile ("hlt"); -} - -// 开启中断 -static inline void cpu_sti(void){ - asm volatile ("sti"); -} - -// 关闭中断 -static inline void cpu_cli(void){ - asm volatile ("cli" ::: "memory"); -} - -// 读取 EFLAGS -static inline uint32_t read_eflags(void){ - uint32_t eflags; - asm volatile ("pushf;pop %0" - : "=r" (eflags)); - return eflags; -} - -// 读取 EFLAGS -static inline void debug_intr(void){ - __asm__ __volatile__ ("int $0x01"); - return; -} - - -// Identification flag -//程序能够设置或清除这个标志指示了处理器对 CPUID 指令的支持。 -static inline bool FL_ID_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_ID); -} - -// Virtual interrupt pending flag -// 该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。 -// 与VIF标志结合使用。 - -static inline bool EFLAGS_VIP_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_VIP); -} - -// Virtual interrupt flag -// 该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。 -// 使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就可以允许虚拟模式扩展(virtual mode extensions) -static inline bool EFLAGS_VIF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_VIF); -} - -// Alignment check flag 地址中的对齐检查 -static inline bool EFLAGS_AC_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_AC); -} - -// 虚拟 8086 ,为 1 时进入 -static inline bool EFLAGS_VM_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_VM); -} - -// Resume flag 控制处理器对调试异常的响应。 -static inline bool EFLAGS_RF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_RF); -} - -// Nested task flag -// 这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置 1,反之则清零。 -static inline bool EFLAGS_NT_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_NT); -} - -// 权限标志 -static inline uint32_t get_IOPL(void){ - uint32_t eflags= read_eflags(); - uint32_t level=0; - if(eflags&EFLAGS_IOPL_0) - level=0; - else if(eflags&EFLAGS_IOPL_1) - level=1; - else if(eflags&EFLAGS_IOPL_2) - level=2; - else if(eflags&EFLAGS_IOPL_3) - level=3; - else return 2333; - return level; -} - -// 溢出标志 -static inline bool EFLAGS_OF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_OF); -} - -// 控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。 -// 设置DF标志使得串指令自动递减(从高地址向低地址方向处理字符串) -// 清除该标志则使得串指令自动递增。 -// STD以及CLD指令分别用于设置以及清除DF标志。 -static inline bool EFLAGS_DF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_DF); -} - -// 中断标志 -static inline bool EFLAGS_IF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_IF); -} - -static inline bool EFLAGS_TF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_TF); -} - -// Sign flag 符号标志 -static inline bool EFLAGS_SF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_SF); -} - -// Zero flag 零标志 -static inline bool EFLAGS_ZF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_ZF); -} - -// Adjust flag调整位 -static inline bool EFLAGS_AF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_AF); -} - -// Parity flag奇偶位 -static inline bool EFLAGS_PF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_PF); -} - -// Carry flag 进位标志 -static inline bool EFLAGS_CF_status(void){ - uint32_t eflags= read_eflags(); - return (eflags&EFLAGS_CF); -} - - -#endif diff --git a/src/include/debug.h b/src/include/debug.h deleted file mode 100644 index 63ecfa73c..000000000 --- a/src/include/debug.h +++ /dev/null @@ -1,27 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on http://wiki.0xffffff.org/posts/hurlex-5.html -// debug.h for MRNIU/SimpleKernel. - - -#ifndef _DEBUG_H_ -#define _DEBUG_H_ - -#include "stdarg.h" -#include "stddef.h" -#include "stdio.h" -#include "stdbool.h" -#include "string.h" -#include "multiboot.h" -#include "elf.h" -#include "intr/intr.h" - -/* Check if the bit BIT in FLAGS is set. */ -#define CHECK_FLAG(flags,bit) ((flags) & (1 << (bit))) -#define ELF32_ST_TYPE(i) ((i)&0xf) - - -// void debug_init(uint64_t magic, multiboot_info_t * mb); - - -#endif diff --git a/src/include/drv/keyboard.h b/src/include/drv/keyboard.h deleted file mode 100644 index d58ebe2fb..000000000 --- a/src/include/drv/keyboard.h +++ /dev/null @@ -1,140 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on Orange's 一个操作系统的实现 -// keyboard.h for MRNIU/SimpleKernel. - -#ifndef _KEYBOARD_HPP_ -#define _KEYBOARD_HPP_ - -#include "stddef.h" -#include "string.h" -#include "stdio.h" -#include "stdint.h" -#include "intr/intr.h" -#include "stdbool.h" - -// 键盘缓冲区大小 -#define KB_BUFSIZE 50 - -#define KB_DATA 0x60 -#define KB_WRITE 0x60 -#define KB_STATUS 0x64 -#define KB_CMD 0x64 - -// 特殊键的扫描码 -#define KB_BACKSPACE 0x0E -#define KB_ENTER 0x1C -#define KB_TAB 0x0F -#define KB_ESC 0x01 -#define KB_SHIFT_L 0x2A -#define KB_SHIFT_R 0x36 -#define KB_ALT_L 0x38 -#define KB_CAPS_LOCK 0x3A -#define KB_CTRL_L 0x1D -#define KB_NUM_LOCK 0x45 - - -#define KB_IN_BYTES 32 /* size of keyboard input buffer */ -#define MAP_COLS 3 /* Number of columns in keymap */ -#define NR_SCAN_CODES 0x80 /* Number of scan codes (rows in keymap) */ - -// 8 位的键盘扫描码的接通码使用前7位 -// 其最高位置 1 即是其对应的断开码 -// 该宏可以和获取的扫描码用来判断一个键是按下还是抬起 -#define RELEASED_MASK 0x80 - -#define FLAG_EXT 0x00 /* Normal function keys */ - -/* Special keys */ -#define ESC (0x01 & FLAG_EXT) /* Esc */ -#define TAB (0x02 & FLAG_EXT) /* Tab */ -#define ENTER (0x03 & FLAG_EXT) /* Enter */ -#define BACKSPACE (0x04 & FLAG_EXT) /* BackSpace */ - -#define GUI_L (0x05 & FLAG_EXT) /* L GUI */ -#define GUI_R (0x06 & FLAG_EXT) /* R GUI */ -#define APPS (0x07 & FLAG_EXT) /* APPS */ - -/* Shift, Ctrl, Alt */ -#define SHIFT_L (0x08 & FLAG_EXT) /* L Shift */ -#define SHIFT_R (0x09 & FLAG_EXT) /* R Shift */ -#define CTRL_L (0x0A & FLAG_EXT) /* L Ctrl */ -#define CTRL_R (0x0B & FLAG_EXT) /* R Ctrl */ -#define ALT_L (0x0C & FLAG_EXT) /* L Alt */ -#define ALT_R (0x0D & FLAG_EXT) /* R Alt */ - -/* Lock keys */ -#define CAPS_LOCK (0x0E & FLAG_EXT) /* Caps Lock */ -#define NUM_LOCK (0x0F & FLAG_EXT) /* Number Lock */ -#define SCROLL_LOCK (0x10 & FLAG_EXT) /* Scroll Lock */ - -/* Function keys */ -#define F1 (0x11 & FLAG_EXT) /* F1 */ -#define F2 (0x12 & FLAG_EXT) /* F2 */ -#define F3 (0x13 & FLAG_EXT) /* F3 */ -#define F4 (0x14 & FLAG_EXT) /* F4 */ -#define F5 (0x15 & FLAG_EXT) /* F5 */ -#define F6 (0x16 & FLAG_EXT) /* F6 */ -#define F7 (0x17 & FLAG_EXT) /* F7 */ -#define F8 (0x18 & FLAG_EXT) /* F8 */ -#define F9 (0x19 & FLAG_EXT) /* F9 */ -#define F10 (0x1A & FLAG_EXT) /* F10 */ -#define F11 (0x1B & FLAG_EXT) /* F11 */ -#define F12 (0x1C & FLAG_EXT) /* F12 */ - -/* Control Pad */ -#define PRINTSCREEN (0x1D & FLAG_EXT) /* Print Screen */ -#define PAUSEBREAK (0x1E & FLAG_EXT) /* Pause/Break */ -#define INSERT (0x1F & FLAG_EXT) /* Insert */ -#define DELETE (0x20 & FLAG_EXT) /* Delete */ -#define HOME (0x21 & FLAG_EXT) /* Home */ -#define END (0x22 & FLAG_EXT) /* End */ -#define PAGEUP (0x23 & FLAG_EXT) /* Page Up */ -#define PAGEDOWN (0x24 & FLAG_EXT) /* Page Down */ -#define UP (0x25 & FLAG_EXT) /* Up */ -#define DOWN (0x26 & FLAG_EXT) /* Down */ -#define LEFT (0x27 & FLAG_EXT) /* Left */ -#define RIGHT (0x28 & FLAG_EXT) /* Right */ - -/* ACPI keys */ -#define POWER (0x29 & FLAG_EXT) /* Power */ -#define SLEEP (0x2A & FLAG_EXT) /* Sleep */ -#define WAKE (0x2B & FLAG_EXT) /* Wake Up */ - -/* Num Pad */ -#define PAD_SLASH (0x2C & FLAG_EXT) /* / */ -#define PAD_STAR (0x2D & FLAG_EXT) /* * */ -#define PAD_MINUS (0x2E & FLAG_EXT) /* - */ -#define PAD_PLUS (0x2F & FLAG_EXT) /* & */ -#define PAD_ENTER (0x30 & FLAG_EXT) /* Enter */ -#define PAD_DOT (0x31 & FLAG_EXT) /* . */ -#define PAD_0 (0x32 & FLAG_EXT) /* 0 */ -#define PAD_1 (0x33 & FLAG_EXT) /* 1 */ -#define PAD_2 (0x34 & FLAG_EXT) /* 2 */ -#define PAD_3 (0x35 & FLAG_EXT) /* 3 */ -#define PAD_4 (0x36 & FLAG_EXT) /* 4 */ -#define PAD_5 (0x37 & FLAG_EXT) /* 5 */ -#define PAD_6 (0x38 & FLAG_EXT) /* 6 */ -#define PAD_7 (0x39 & FLAG_EXT) /* 7 */ -#define PAD_8 (0x3A & FLAG_EXT) /* 8 */ -#define PAD_9 (0x3B & FLAG_EXT) /* 9 */ -#define PAD_UP PAD_8 /* Up */ -#define PAD_DOWN PAD_2 /* Down */ -#define PAD_LEFT PAD_4 /* Left */ -#define PAD_RIGHT PAD_6 /* Right */ -#define PAD_HOME PAD_7 /* Home */ -#define PAD_END PAD_1 /* End */ -#define PAD_PAGEUP PAD_9 /* Page Up */ -#define PAD_PAGEDOWN PAD_3 /* Page Down */ -#define PAD_INS PAD_0 /* Ins */ -#define PAD_MID PAD_5 /* Middle key */ -#define PAD_DEL PAD_DOT /* Del */ - - -extern void init_interrupt_chip(void); -extern void clear_interrupt_chip(uint32_t intr_no); // 重置 8259A -void keyboard_init(void); -void keyboard_handler(pt_regs_t * regs); - - -#endif diff --git a/src/include/drv/mouse.h b/src/include/drv/mouse.h deleted file mode 100644 index 978f5e8fc..000000000 --- a/src/include/drv/mouse.h +++ /dev/null @@ -1,34 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// mouse.h for MRNIU/SimpleKernel. -#ifndef _MOUSE_H_ -#define _MOUSE_H_ - -#include "stdint.h" -#include "stddef.h" - -#define MOU_DATA 0x60 -#define MOU_CMD 0x64 -#define KEYCMD_SENDTO_MOUSE 0xd4 -#define MOUSECMD_ENABLE 0xf4 -#define KBCMD_EN_MOUSE_INTFACE 0xa8 - - -typedef -struct mouse_desc_t{ - uint8_t buf[3]; - uint8_t phase; - uint32_t x, y, btn; -} mouse_desc_t; - - - - - - - - - - -#endif diff --git a/src/include/elf.h b/src/include/elf.h deleted file mode 100644 index e316ae4fb..000000000 --- a/src/include/elf.h +++ /dev/null @@ -1,87 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h -// elf.h for MRNIU/SimpleKernel. - - -#ifndef _ELF_H_ -#define _ELF_H_ - -#include "stdint.h" - -#define EI_NIDENT 16 -#define EI_MAG0 0 /* e_ident[] indexes */ -#define EI_MAG1 1 -#define EI_MAG2 2 -#define EI_MAG3 3 -#define EI_CLASS 4 -#define EI_DATA 5 -#define EI_VERSION 6 -#define EI_OSABI 7 -#define EI_PAD 8 - -#define ELFMAG0 0x7f /* EI_MAG */ -#define ELFMAG1 'E' -#define ELFMAG2 'L' -#define ELFMAG3 'F' -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -// ELF 格式符号 -typedef - struct elf32_symbol { - uint32_t name; - uint32_t value; - uint32_t size; - unsigned char info; - unsigned char other; - uint16_t shndx; -} elf_symbol_t; - - -// ELF 文件头 -typedef - struct elf32_hdr { - unsigned char ident[EI_NIDENT]; // 见 EI_ 宏定义 - uint16_t type; // ELF 文件类型 - uint16_t machine; // ELF 文件 CPU 平台属性 - uint32_t version; // ELF 版本号 - uint32_t entry; // 入口点 - uint32_t phoff; // - uint32_t shoff; // 段表在文件中的偏移 - uint32_t flags; // 标志位 0x0 - uint16_t ehsize; // ELF 文件头本身的大小 - uint16_t phentsize; // - uint16_t phnum; // - uint16_t shentsize;// 段表描述符的大小 - uint16_t shnum; // 段表描述符数量 - uint16_t shstrndx; // 段表字符串所在的段在表中的下标 -} Elf32_Ehdr; - -// ELF 段描述符 -typedef - struct elf32_section_header { - uint32_t name; // 段名,位于 .shstrtab - uint32_t type; // 段类型 - uint32_t flags; // 段标志 - uint32_t addr; // 段虚拟地址 - uint32_t offset; // 段偏移 - uint32_t size; // 段长度 - uint32_t link; // - uint32_t info; // 段链接信息 - uint32_t addralign; // 端地址对齐 - uint32_t entsize; // 项长度 -} elf32_section_header_t; - - -// ELF 信息 -typedef - struct elf_info { - elf_symbol_t * symtab; - uint32_t symtabsz; - const char * strtab; - uint32_t strtabsz; -} elf_info_t; - - -#endif diff --git a/src/include/intr/clock.c b/src/include/intr/clock.c deleted file mode 100644 index 97d823574..000000000 --- a/src/include/intr/clock.c +++ /dev/null @@ -1,27 +0,0 @@ -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// clock.c for MRNIU/SimpleKernel. - -#include "clock.h" -#include "stddef.h" - -void clock_handler(pt_regs_t * regs){ - static uint32_t tick = 0; - // printk_color(light_green, "Tick: %d\n", tick++); - UNUSED(regs); -} - -void clock_init(void){ - printk("initialize timer\n"); - uint32_t divisor = TIMER_FREQ / FREQUENCY; - outb(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16BIT); // 0x34 - // 拆分低字节和高字节 - uint8_t low = (uint8_t)(divisor & 0xFF); - uint8_t hign = (uint8_t)((divisor >> 8) & 0xFF); - // 分别写入低字节和高字节 - outb(IO_TIMER, low); - outb(IO_TIMER, hign); - // 注册时间相关的处理函数 - register_interrupt_handler(IRQ0, &clock_handler); - enable_irq(IRQ0); -} diff --git a/src/include/intr/clock.h b/src/include/intr/clock.h deleted file mode 100644 index 565a68852..000000000 --- a/src/include/intr/clock.h +++ /dev/null @@ -1,34 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// clock.h for MRNIU/SimpleKernel. - - -#ifndef _CLOCK_H_ -#define _CLOCK_H_ - -#include "stdint.h" -#include "stdio.h" -#include "port.hpp" -#include "intr/intr.h" - -#define FREQUENCY 100 - -// 定时中断由 8253/8254 芯片从 IRQ0 提供 -#define IO_TIMER 0x40 // 8253 Timer #1 - -// 输入频率为 1193180,frequency 即每秒中断次数 -#define TIMER_FREQ 1193180 - -// Intel 8253/8254 PIT芯片 I/O端口地址范围是40h~43h -#define TIMER_MODE (IO_TIMER + 3) // timer mode port - -#define TIMER_SEL0 0x00 // select counter 0 -#define TIMER_RATEGEN 0x04 // mode 2 -#define TIMER_CLK 0x06 // mode 3 -#define TIMER_16BIT 0x30 // r/w counter 16 bits, LSB first - -void clock_init(void); -void clock_handler(pt_regs_t *); - -#endif diff --git a/src/include/io.h b/src/include/io.h new file mode 100644 index 000000000..b29cc1f14 --- /dev/null +++ b/src/include/io.h @@ -0,0 +1,193 @@ + +/** + * @file io.h + * @brief IO 接口 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_IO_H +#define SIMPLEKERNEL_IO_H + +#include "color.h" +#include "cstdint" + +// 根据不同架构选择不同的输出方式 +#if defined(__i386__) || defined(__x86_64__) +# include "tui.h" +#elif defined(__arm__) || defined(__aarch64__) +# include "uart.h" +#elif defined(__riscv) +# include "sbi_console.h" +#endif + +/** + * @brief IO 接口抽象 + */ +class IO { +private: + // io 对象 +#if defined(__i386__) || defined(__x86_64__) + // x86 平台使用 TUI 接口 + TUI io; +#elif defined(__arm__) || defined(__aarch64__) + // arn 平台使用 UART 接口 + UART io; +#elif defined(__riscv) + // riscv 平台使用 opensbi 提供的接口 + SBI_CONSOLE io; +#endif + +protected: + +public: + /// 缓冲区大小 + static constexpr const size_t BUF_SIZE = 512; + + /** + * @brief 获取单例 + * @return IO& 静态对象 + */ + static IO& get_instance(void); + + /** + * @brief 端口读字节 + * @param _port 要读的端口 + * @return uint8_t 读到的数据 + */ + static uint8_t inb(const uint32_t _port); + + /** + * @brief 端口读字 + * @param _port 要读的端口 + * @return uint16_t 读到的数据 + */ + static uint16_t inw(const uint32_t _port); + + /** + * @brief 端口读双字 + * @param _port 要读的端口 + * @return uint32_t 读到的数据 + */ + static uint32_t ind(const uint32_t _port); + + /** + * @brief 端口写字节 + * @param _port 要写的端口 + * @param _data 要写的数据 + */ + static void outb(const uint32_t _port, const uint8_t _data); + + /** + * @brief 端口写字 + * @param _port 要写的端口 + * @param _data 要写的数据 + */ + static void outw(const uint32_t _port, const uint16_t _data); + + /** + * @brief 端口写双字 + * @param _port 要写的端口 + * @param _data 要写的数据 + */ + static void outd(const uint32_t _port, const uint32_t _data); + + /** + * @brief MMIO 读字节 + * @param _addr 要读的地址 + * @return uint8_t 读到的数据 + */ + static uint8_t read8(void* _addr); + + /** + * @brief MMIO 写字节 + * @param _addr 要写的地址 + * @param _val 要写的值 + */ + static void write8(void* _addr, uint8_t _val); + + /** + * @brief MMIO 读字 + * @param _addr 要读的地址 + * @return uint16_t 读到的数据 + */ + static uint16_t read16(void* _addr); + + /** + * @brief MMIO 写字 + * @param _addr 要写的地址 + * @param _val 要写的值 + */ + static void write16(void* _addr, uint16_t _val); + + /** + * @brief MMIO 读双字 + * @param _addr 要读的地址 + * @return uint32_t 读到的数据 + */ + static uint32_t read32(void* _addr); + + /** + * @brief MMIO 写双字 + * @param _addr 要写的地址 + * @param _val 要写的数据 + */ + static void write32(void* _addr, uint32_t _val); + + /** + * @brief MMIO 读四字 + * @param _addr 要读的地址 + * @return uint64_t 读到的数据 + */ + static uint64_t read64(void* _addr); + + /** + * @brief MMIO 写四字 + * @param _addr 要写的地址 + * @param _val 要写的数据 + */ + static void write64(void* _addr, uint64_t _val); + + /** + * @brief 获取当前颜色 + * @return COLOR::color_t 当前使用的颜色 + */ + COLOR::color_t get_color(void); + + /** + * @brief 设置当前颜色 + * @param _color 要设置的颜色 + */ + void set_color(const COLOR::color_t _color); + + /** + * @brief 输出字符 + * @param _c 要输出的字符 + */ + void put_char(const char _c); + + /** + * @brief 输入字符 + * @return char 读到的字符 + * @todo + */ + char get_char(void); + + /** + * @brief 输出字符串 + * @param _s 要输出的字符串 + * @return int32_t 输出的长度 + * @todo 返回值 + */ + int32_t write_string(const char* _s); +}; + +#endif /* SIMPLEKERNEL_IO_H */ diff --git a/src/include/kernel.h b/src/include/kernel.h deleted file mode 100644 index 37d589dd4..000000000 --- a/src/include/kernel.h +++ /dev/null @@ -1,54 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// kernel.h for MRNIU/SimpleKernel. - - -#ifndef _KERNEL_H_ -#define _KERNEL_H_ - -/* Check if the compiler thinks we are targeting the wrong operating system. */ -#if defined(__linux__) -#error "You are not using a cross-compiler, you will most certainly run into trouble" -#endif - -/* This tutorial will only work for the 32-bit ix86 targets. */ -#if !defined(__i386__) -#error "Please compile that with a ix86-elf compiler" -#endif - -#include "stdint.h" -#include "stdbool.h" -#include "stdio.h" -#include "tty.hpp" -#include "multiboot.h" -#include "debug.h" -#include "mm/pmm.h" -#include "mm/mm.h" -#include "intr/clock.h" -#include "cpu.hpp" -#include "drv/keyboard.h" - - - -// void debug_init(uint64_t magic, multiboot_info_t * mb); -void gdt_init(void); -void idt_init(void); -void clock_init(void); -void keyboard_init(void); -void mouse_init(void); - -void showinfo(void); -void showinfo(void){ - // 输出一些基本信息 - printk_color(magenta,"Welcome to my kernel.\n"); - printk_color(light_red,"kernel in memory start: 0x%08X\n", kernel_start); - printk_color(light_red,"kernel in memory end: 0x%08X\n", kernel_end); - printk_color(light_red,"kernel in memory size: %d KB, %d pages\n", - (kernel_end - kernel_start) / 1024, (kernel_end - kernel_start) / 1024 / 4); - // for(int i=0;i<20;i++) - // printk_color(light_red ,"kernel start data: 0x%08X\n", *(kernel_start+i)); - -} - -#endif diff --git a/src/include/libc/README.md b/src/include/libc/README.md deleted file mode 100644 index 0ee167844..000000000 --- a/src/include/libc/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# src/include/libc - -- stdarg.h - - 定义 va_list,为变长参数函数的实现提供支持。 - -- stddef.h - - 定义了常用的数据类型。 - -- stdint.h - - 定义了常用整数数据类型。 - -- /stdio - - 标准输入输出。 - -- /string - - 字符串。 - -- stdbool.h - - bool 类型定义 - diff --git a/src/include/libc/assert.h b/src/include/libc/assert.h deleted file mode 100644 index 83edc42ba..000000000 --- a/src/include/libc/assert.h +++ /dev/null @@ -1,17 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// assert.h for MRNIU/SimpleKernel. - - -#ifndef _ASSERT_H_ -#define _ASSERT_H_ -#include "stdio.h" - -#define assert(test) \ - if(!(test)) \ - printk_color(light_red, "ASSERT ERROR!"); - - - -#endif diff --git a/src/include/libc/stdarg.h b/src/include/libc/stdarg.h deleted file mode 100644 index 7fedb5393..000000000 --- a/src/include/libc/stdarg.h +++ /dev/null @@ -1,29 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// stdarg.h for MRNIU/SimpleKernel. - -#ifndef _STDARG_H_ -#define _STDARG_H_ - -typedef char * va_list; - -// 用来得到 TYPE 元素类型的字节大小,若不足4字节(short,char),那么认为这个元素的大小为4字节, -// 简单的说就是检测元素的大小,不足4字节的当作4字节看待. -#define __va_SIZE(TYPE) (((sizeof(TYPE)+sizeof(int)-1)/sizeof(int))*sizeof(int)) - -// AP 一般都是 va_list,LASTARG 则是指向参数变长函数的格式化字符串的指针, -// va_start 宏根据 (va_list)&LASTARG 得到第一个可变参数前的一个固定参数在堆栈中的内存地址, -// 加上 __va_SIZEOF(TYPE)即 TYPE 所占内存大小后,使ap指向固定参数后下个参数(第一个可变参数地址)。 -// va_start 的作用就很明显了。取得变长参数列表的第一个参数的地址。 -#define va_start(AP, LASTARG) (AP = ((va_list)&(LASTARG) + __va_SIZE (LASTARG))) - -// 取得 TYPE 类型的可变参数值。首先 AP+=__va_SIZE(TYPE),即 AP 跳过当前可变参数而指向下个变参的地址; -// 然后 AP-__va_SIZE(TYPE)得到当前变参的内存地址,类型转换后返回当前变参值。 -//#define va_arg(AP, TYPE) (*(TYPE *)((AP+=__va_SIZE(TYPE))-__va_SIZE(TYPE))) -#define va_arg(AP, TYPE) (AP+=__va_SIZE(TYPE), *((TYPE *)(AP-__va_SIZE (TYPE)))) - -// 把指针 va_list 置 0 -#define va_end(AP) (AP = (va_list) 0) - -#endif diff --git a/src/include/libc/stdbool.h b/src/include/libc/stdbool.h deleted file mode 100644 index 903d7c7f1..000000000 --- a/src/include/libc/stdbool.h +++ /dev/null @@ -1,17 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// stdbool.h for MRNIU/SimpleKernel. - -#ifndef _STDBOOL_H_ -#define _STDBOOL_H_ - -typedef - enum { - FALSE = 0, - false = 0, - TRUE = 1, - true = 1, -} bool; - -#endif diff --git a/src/include/libc/stddef.h b/src/include/libc/stddef.h deleted file mode 100644 index abb803fc8..000000000 --- a/src/include/libc/stddef.h +++ /dev/null @@ -1,25 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// stddef.h for MRNIU/SimpleKernel. - - -#ifndef _STDDEF_H_ -#define _STDDEF_H_ - -#ifndef _PTRDIFF_T -#define _PTRDIFF_T -typedef long ptrdiff_t; -#endif - -#ifndef _SIZE_T -#define _SIZE_T -typedef unsigned long size_t; -#endif - -#undef NULL -#define NULL ((void *)0) - -#define UNUSED(x) (void)(x) - -#endif diff --git a/src/include/libc/stdint.h b/src/include/libc/stdint.h deleted file mode 100644 index 29c05c018..000000000 --- a/src/include/libc/stdint.h +++ /dev/null @@ -1,19 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// stdint.h for MRNIU/SimpleKernel. - -#ifndef _STDINT_H_ -#define _STDINT_H_ - -typedef signed char int8_t; -typedef short int int16_t; -typedef int int32_t; -typedef long long int64_t; - -typedef unsigned char uint8_t; -typedef unsigned short int uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; - -#endif diff --git a/src/include/libc/stdio.h b/src/include/libc/stdio.h deleted file mode 100644 index 278ea9c1a..000000000 --- a/src/include/libc/stdio.h +++ /dev/null @@ -1,33 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// stdio.h for MRNIU/SimpleKernel. - -#ifndef _STDIO_H_ -#define _STDIO_H_ - -extern int printk(const char * fmt, ...); -extern int printk_color(unsigned char color, const char *format, ...); -// 枚举颜色,与 vga_color 相同 -enum color { - black= 0, - blue= 1, - green= 2, - cyan= 3, - red= 4, - magenta= 5, - brown= 6, - light_grey= 7, - dark_gray= 8, - light_blue= 9, - light_green= 10, - light_cyan= 11, - light_red= 12, - light_magenta= 13, - light_brown= 14, - white= 15, -}; - -extern int printf(const char * fmt, ...); - -#endif diff --git a/src/include/libc/stdio/printk.c b/src/include/libc/stdio/printk.c deleted file mode 100644 index 666378dc5..000000000 --- a/src/include/libc/stdio/printk.c +++ /dev/null @@ -1,108 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// printk.hpp for MRNIU/SimpleKernel. - -#ifndef _PRINTK_HPP_ -#define _PRINTK_HPP_ - -#include "stdio.h" -#include "stdarg.h" - - -static char buf[1024]; - -extern int vsprintf(char * buf, const char * fmt, va_list args); -extern void terminal_writestring(const char* data); -extern void terminal_setcolor(unsigned char color); -extern unsigned char terminal_getcolor(void); - -int printk(const char * fmt, ...){ - va_list args; - int i; - va_start(args, fmt); - i=vsprintf(buf, fmt, args); - va_end(args); - terminal_writestring(buf); - return i; -} - -int printk_color(unsigned char color, const char *fmt, ...){ - va_list args; - int i; - va_start(args, fmt); - i=vsprintf(buf, fmt, args); - va_end(args); - unsigned char old_color = terminal_getcolor(); - terminal_setcolor(color); - terminal_writestring(buf); - terminal_setcolor(old_color); - return i; -} - -// /* Format a string and print it on the screen, just like the libc -// function printf. */ -// void -// printf (const char *format, ...) -// { -// char **arg = (char **) &format; -// int c; -// char buf[20]; -// -// arg++; -// -// while ((c = *format++) != 0) -// { -// if (c != '%') -// putchar (c); -// else -// { -// char *p, *p2; -// int pad0 = 0, pad = 0; -// -// c = *format++; -// if (c == '0') -// { -// pad0 = 1; -// c = *format++; -// } -// -// if (c >= '0' && c <= '9') -// { -// pad = c - '0'; -// c = *format++; -// } -// -// switch (c) -// { -// case 'd': -// case 'u': -// case 'x': -// itoa (buf, c, *((int *) arg++)); -// p = buf; -// goto string; -// break; -// -// case 's': -// p = *arg++; -// if (!p) -// p = "(null)"; -// -// string: -// for (p2 = p; *p2; p2++); -// for (; p2 < p + pad; p2++) -// putchar (pad0 ? '0' : ' '); -// while (*p) -// putchar (*p++); -// break; -// -// default: -// putchar (*((int *) arg++)); -// break; -// } -// } -// } -// } - - -#endif diff --git a/src/include/libc/stdio/vsprintf.c b/src/include/libc/stdio/vsprintf.c deleted file mode 100644 index 24d6ff864..000000000 --- a/src/include/libc/stdio/vsprintf.c +++ /dev/null @@ -1,268 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on Linux kernel 0.11 -// vsprintf.c for MRNIU/SimpleKernel. - - -// TODO -// 修复整数和其它类型数据同时输出时只显示整数的问题 - -#include "../stdarg.h" -#include "../stddef.h" - -extern size_t strlen(const char* str); - -#define is_digit(c) ((c) >= '0' &&(c) <='9') // 判断字符是否数字字符 - -// 该函数将字符数字转换成整数。输入是数字串指针的指针,返回值是结果数值。另外指针将前移。 -static int skip_atoi(const char **s){ - int i=0; - while(is_digit(**s)) - i=i*10+*((*s)++)-'0'; - return i; -} - -// 这里定义转换类型的各种符号常数 -#define ZEROPAD 1 // pad with zero 填充 0 -#define SIGN 2 // unsigned/signed long 无符号/符号长整数 -#define PLUS 4 // show plus 显示加 -#define SPACE 8 // space if plus 如是加,则置空格 -#define LEFT 16 // left justified 左调整 -#define SPECIAL 32 // 0x -#define SMALL 64 // use 'abcdef' instead of 'ABCDEF' 使用小写字母 - -// 除操作。n 被除数;base 除数。结果 n 为商,函数返回值为余数。 -#define do_div(n,base)({ \ - int __res; \ - __asm__ ("divl %4" : "=a" (n),"=d" (__res) : "0" (n),"1" (0),"r" (base)); \ - __res;}) - -// 将整数转换为指定进制的字符串。输入:num-整数;base-进制;size-字符串长度;precision-数字长度 -// (精读);type-类型选项。输出:str-字符串指针 -static char * number(char * str,int num,int base,int size,int precision,int type){ - char c,sign,tmp[36]; - const char * digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - int i; -// 若类型 type 指出用小写字母,则定义小写字母集。若类型指出要左调整(靠左边界),则屏蔽填零标志。 -// 若进制基数小于 2 或大于 36,则退出处理,也即本程序只能处理基数在 2-32 之间的数 - if(type & SMALL) digits="0123456789abcdefghijklmnopqrstuvwxyz"; - if(type & LEFT) type &=~ZEROPAD; - if(base<2||base>36) return 0; -// 若类型指出要填零,则置字符变量 c='0' (即 ''),否则 c 等于空格字符。若类型指出是带符号数并且 -// 数值 num 小于 0,则置符号变量 sign=负号,并使 num 取绝对值。否则如果类型指出是加号, -//则置 sign=加号,否则若类型带空格标志则 sign=空格,否则置 0 - c=(type & ZEROPAD) ? '0' : ' '; - if(type & SIGN && num<0) { - sign='-'; - num-=num; - } - else - sign=(type & PLUS) ? '+' : ((type & SPACE) ? ' ' : 0); -// 若带符号,则宽度值减 1.若类型指出是特殊转换,则对于十六进制宽度再减少 2 位(用于 0x),对于 -// 八进制宽度减 1 (用于八进制转换结果) - if(sign) size--; - if(type & SPECIAL) { - if(base==16) - size-=2; - else - if(base==8) - size--; - } -// 如果数值 num 为 0,则临时字符串='0';否则根据给定的基数将数值 num 转换成字符形式 - i=0; - if(num==0) - tmp[i++]='0'; - else while(num!=0) - tmp[i++]=digits[do_div(num,base)]; -// 若数值字符个数大于精读值,则精度值扩展为数字个数值。宽度值减去用于存放数值字符的个数。 - if(i>precision) precision=i; - size-=precision; -// 从这里真正开始形成所需要的转换结果,并暂时放在字符串 str 中。若类型中没有填零(ZEROPAD) -// 和左调整标志,则在 str 中首先填放剩余宽度值指出的空格数。若需带符号位,则存入符号。 - if(!(type & (ZEROPAD+LEFT))) - while(size-->0) - *str++=' '; - if(sign) - *str++=sign; -// 若类型指出是特殊转换,则对于八进制转换结果头一位放置一个 '0';而对于十六进制则存放 '0x'. - if(type & SPECIAL) { - if(base==8) - *str++='0'; - else if(base==16) { - *str++='0'; - *str++=digits[33]; // 'X' 或 'x' - } - } -// 若类型中没有左调整(左靠齐)标志,则在剩余宽度中存放 c 字符('0' 或空格),见 49 行。 - if(!(type & LEFT)) - while(size-->0) - *str++=c; -// 此时 i 存有数值 num 的数字个数。若数字个数小于精读值,则 str 中放入(精度值 - i)个 '0'. - while(i0) // 将转换好的数字字符填入 str 中。共 i 个。 - *str++=tmp[i]; -// 若宽度值仍大于零,则表示类型标志中有左靠齐标志标志。则在剩余宽度中放入空格。 - while(size-->0) - *str++=' '; - return str; // 返回转换好的字符串。 -} - -int vsprintf(char * buf, const char * fmt, va_list args); -// fmt 是格式字符串;args 是个数变化的值;buf 是输出字符缓冲区。 -// 下面函数是送格式化输出到字符串。为了能在内核中使用格式化的输出,Linus 在内核实现了该 C 标准函数。 -// 其中参数 fmt 是格式字符串;args 是个数变化的值;buf 是输出字符缓冲区。请参见本代码列表后面 -// 的有关格式转换字符的介绍。 -int vsprintf(char * buf,const char * fmt,va_list args){ - int len; - int i; - char * str; // 用于存放转换过程中的字符串 - char * s; - int * ip; - - int flags; // flags to number() - // number() 函数使用的标志 - int field_width; // width of output field 输出字符宽度 - int precision; // min. # of digits for integers;max number of chars for from - // fields. min.整数数字个数;max. 字符串中字符个数 - int qualifier; // 'h','l',or 'L' for integer fields 'h','l',或 'L' 用于整数字段 -// 首先将字符指针指向 buf,然后扫描格式字符串,对各个格式转换只是进行相应的处理 - for(str=buf; *fmt; ++fmt) { -// 格式转换指示字符串均以 '%' 开始,这里从 fmt 格式字符串中扫描 '%',寻找格式转换字符串的开始。 -// 不是格式指示的一般字符均被依次存入 str - if(*fmt!='%') { - *str++=*fmt; - continue; - } -// 下面取得格式指示字符串中的标志域,并将标志常量放入 flags 变量中 - // prcess flags. - flags=0; -repeat: - ++fmt; // this also skips first '%' - switch(*fmt) { - case '-': flags|=LEFT; goto repeat; // 左靠齐调整 - case '+': flags|=PLUS; goto repeat; // 放加号 - case ' ': flags|=SPACE; goto repeat; // 放空格 - case '#': flags|=SPECIAL; goto repeat; // 是特殊转换 - case '0': flags|=ZEROPAD; goto repeat; //要填零(即 ‘0’) - } -// 去参数字段宽度阈值放入 field_width 变量中。若宽度域中是数值则直接取其为宽度值。若宽度域是 -// 字符 '*' ,表示下一参数指定宽度,调用 va_arg 取宽度值。若此时宽度值 < 0,则该负数表示其带有 -// 标志域 '-' 标志(左靠齐),因此需在标志变量中添入该标志,并将字段宽度值取为其绝对值。 - // get field field_width - field_width=-1; - if(is_digit(*fmt)) - field_width=skip_atoi(&fmt); - else if(*fmt=='*') { - // it's the next argument 这里应该插入 ++fmt; - field_width=va_arg(args,int); - if(field_width<0) { - field_width=-field_width; - flags|=LEFT; - } - } -// 下面代码取格式转换串精度域,并放入 precision 变量中。精度域的开始标志是 '.'。其处理过程与上面 -// 宽度域类似。若精度域中是数值则直接取其为精度值。若精度域中是字符 '*',表示下一个参数指定精度。 -// 因此调用 va_arg 取精度值。若此时宽度值小于 0,则将字段精度值取为 0. - // get the precision - precision=-1; - if(*fmt=='.') { - ++fmt; - if(is_digit(*fmt)) - precision=skip_atoi(&fmt); - else if(*fmt=='*') { - // it's the next argument - precision=va_arg(args,int); - } - if(precision<0) - precision=0; - } -// 下面这段代码分析长度修饰符,并将其存入 qualifier 变量。(h,l,L 的含义参见列表后的说明) - // get the conversion qualifier - qualifier=-1; - if(*fmt=='h'||*fmt=='l'||*fmt=='L') { - qualifier=*fmt; - ++fmt; - } -// 下面分析转换指示符。如果转换指示符是 'c',则表示对应参数应是字符。此时如果标志域表明不是左 -// 对齐,则该字段前面放入宽度域值 -1 个空格字符,然后再被放入参数字符。如果宽度域还大于 0, -// 则表示为左对齐,则在参数字符后面添加宽度值 -1 个空格字符 - switch(*fmt) { - case 'c': - if(!(flags & LEFT)) - while(--field_width>0) - *str++=' '; - *str++=(unsigned char) va_arg(args,int); - while(--field_width>0) - *str++=' '; - break; -// 如果转换指示符是 's',则表示对应参数是字符串。首先取参数字符串的长度,若其超过了精度域值,则 -// 拓展精度域=字符串长度。此时如果标志域表明不是左靠齐,则该字段前放入(宽度值-字符串长度)个空格 -// 字符。然后再放入参数字符串。如果宽度域还大于 0,则表示为左靠齐,则在参数字符串后面添加(宽度值- -// 字符串长度)个空格字符。 - case 's': - s=va_arg(args,char *); - len=strlen(s); - if(precision<0) - precision=len; - else if(len>precision) - len=precision; - - if(!(flags & LEFT)) - while(len dest, 则返回值大于 0,如果 src = dest, 则返回值等于 0, -// 如果 srd < dest ,则返回值小于 0。 -int8_t strcmp(const char * src, const char * dest){ - while (*src && *dest && (*src == *dest)) { - src++; - dest++; - } - return *src - *dest; -} - -char *strcpy(char *dest, const char *src){ - char *address = dest; - while((*dest++ = *src++) != '\0'); - return address; -} - -void backspace(char *src){ - int32_t len = strlen(src); - src[len-1] = '\0'; -} - -void append(char *src, char dest){ - int len = strlen(src); - src[len] = dest; - src[len+1] = '\0'; -} - -char *strcat(char *dest, const char *src){ - int8_t * add_d= (int8_t *)dest; - if(dest!=NULL && src !=NULL) { - while(*add_d) - add_d++; - while(*src) - *add_d++ = *src++; - } - return dest; -} - - -// /* Convert the integer D to a string and save the string in BUF. If -// BASE is equal to 'd', interpret that D is decimal, and if BASE is -// equal to 'x', interpret that D is hexadecimal. */ -// static void -// itoa (char *buf, int base, int d) -// { -// char *p = buf; -// char *p1, *p2; -// unsigned long ud = d; -// int divisor = 10; -// -// /* If %d is specified and D is minus, put `-' in the head. */ -// if (base == 'd' && d < 0) -// { -// *p++ = '-'; -// buf++; -// ud = -d; -// } -// else if (base == 'x') -// divisor = 16; -// -// /* Divide UD by DIVISOR until UD == 0. */ -// do -// { -// int remainder = ud % divisor; -// -// *p++ = (remainder < 10) ? remainder + '0' : remainder + 'a' - 10; -// } -// while (ud /= divisor); -// -// /* Terminate BUF. */ -// *p = 0; -// -// /* Reverse BUF. */ -// p1 = buf; -// p2 = p - 1; -// while (p1 < p2) -// { -// char tmp = *p1; -// *p1 = *p2; -// *p2 = tmp; -// p1++; -// p2--; -// } -// } diff --git a/src/include/mem/allocator.h b/src/include/mem/allocator.h new file mode 100644 index 000000000..9fa7f2a3e --- /dev/null +++ b/src/include/mem/allocator.h @@ -0,0 +1,88 @@ + +/** + * @file allocator.h + * @brief 分配器抽象类头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ALLOCATOR_H +#define SIMPLEKERNEL_ALLOCATOR_H + +#include "cstddef" +#include "cstdint" + +/** + * @brief 内存分配器抽象类 + */ +class ALLOCATOR { +private: + +protected: + /// 分配器名称 + const char* name; + /// 当前管理的内存区域地址 + uintptr_t allocator_start_addr; + /// 当前管理的内存区域长度 + size_t allocator_length; + /// 当前管理的内存区域空闲长度 + size_t allocator_free_count; + /// 当前管理的内存区域已使用长度 + size_t allocator_used_count; + +public: + /** + * @brief 构造内存分配器 + * @param _name 分配器名 + * @param _addr 要管理的内存开始地址 + * @param _len 要管理的内存长度,单位以具体实现为准 + */ + ALLOCATOR(const char* _name, uintptr_t _addr, size_t _len); + + virtual ~ALLOCATOR(void) = 0; + + /** + * @brief 分配 _len 页 + * @param _len 页数 + * @return uintptr_t 分配到的地址 + */ + virtual uintptr_t alloc(size_t _len) = 0; + + /** + * @brief 在指定地址分配 _len 长度 + * @param _addr 指定的地址 + * @param _len 长度 + * @return true 成功 + * @return false 失败 + */ + virtual bool alloc(uintptr_t _addr, size_t _len) = 0; + + /** + * @brief 释放 _len 长度 + * @param _addr 地址 + * @param _len 长度 + */ + virtual void free(uintptr_t _addr, size_t _len) = 0; + + /** + * @brief 已使用数量 + * @return size_t 数量 + */ + virtual size_t get_used_count(void) const = 0; + + /** + * @brief 空闲数量 + * @return size_t 数量 + */ + virtual size_t get_free_count(void) const = 0; +}; + +#endif /* SIMPLEKERNEL_ALLOCATOR_H */ diff --git a/src/include/mem/firstfit.h b/src/include/mem/firstfit.h new file mode 100644 index 000000000..5df8a17ed --- /dev/null +++ b/src/include/mem/firstfit.h @@ -0,0 +1,127 @@ + +/** + * @file firstfit.h + * @brief firstfit 内存分配器头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_FIRTSTFIT_H +#define SIMPLEKERNEL_FIRTSTFIT_H + +#include "allocator.h" +#include "common.h" +#include "cstddef" +#include "cstdint" + +/** + * @brief 使用 first fit 算法的分配器 + */ +class FIRSTFIT : ALLOCATOR { +private: + /// 字长 + static constexpr const uint64_t BITS_PER_WORD = sizeof(uintptr_t); +#if __WORDSIZE == 64 + /// 字长为 64 时的 掩码 + static constexpr const uint64_t MASK = 0x3F; + /// 2^6==64 + static constexpr const uint64_t SHIFT = 6; +#elif __WORDSIZE == 32 + /// 字长为 32 时的 掩码 + static constexpr const uint64_t MASK = 0x1F; + /// 2^5==32 + static constexpr const uint64_t SHIFT = 5; +#endif + /// 位图数组长度,设置为占用一个页,4kb,32768 个位,每个 bit + /// 代表一页,最大表示 128MB + static constexpr const size_t BITS_ARR_SIZE + = COMMON::PAGE_SIZE / BITS_PER_WORD; + /// 位图,每一位表示一页内存,1 表示已使用,0 表示未使用 + uintptr_t map[BITS_ARR_SIZE]; + + /** + * @brief 置位 _idx + * @param _idx 要置位的索引 + */ + void set(size_t _idx); + + /** + * @brief 清零 _idx + * @param _idx 要清零的索引 + */ + void clr(size_t _idx); + + /** + * @brief 测试 _idx + * @param _idx 要测试的索引 + * @return true 已使用 + * @return false 未使用 + */ + bool test(size_t _idx) const; + + /** + * @brief 寻找连续 _len 个 _val 位,返回开始索引 + * @param _len 连续 + * @param _val 值 + * @return size_t 开始索引 + */ + size_t find_len(size_t _len, bool _val) const; + +protected: + +public: + /** + * @brief 创建分配器 + * @param _name 分配器名称 + * @param _addr 开始地址 + * @param _len 长度,页 + */ + FIRSTFIT(const char* _name, uintptr_t _addr, size_t _len); + + ~FIRSTFIT(void); + + /** + * @brief 分配长度为 _len 页的内存 + * @param _len 页数 + * @return uintptr_t 分配的内存起点地址 + */ + uintptr_t alloc(size_t _len) override; + + /** + * @brief 在 _addr 处分配长度为 _len 页的内存 + * @param _addr 指定的地址 + * @param _len 页数 + * @return true 成功 + * @return false 失败 + */ + bool alloc(uintptr_t _addr, size_t _len) override; + + /** + * @brief 释放 _addr 处 _len 页的内存 + * @param _addr 要释放内存起点地址 + * @param _len 页数 + */ + void free(uintptr_t _addr, size_t _len) override; + + /** + * @brief 获取已使用页数 + * @return size_t 已经使用的页数 + */ + size_t get_used_count(void) const override; + + /** + * @brief 获取未使用页数 + * @return size_t 未使用的页数 + */ + size_t get_free_count(void) const override; +}; + +#endif /* SIMPLEKERNEL_FIRTSTFIT_H */ diff --git a/src/include/mem/heap.h b/src/include/mem/heap.h new file mode 100644 index 000000000..464083e65 --- /dev/null +++ b/src/include/mem/heap.h @@ -0,0 +1,77 @@ + +/** + * @file heap.h + * @brief 堆抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_HEAP_H +#define SIMPLEKERNEL_HEAP_H + +#include "allocator.h" +#include "cstddef" +#include "cstdint" +#include "slab.h" + +/** + * @brief 堆抽象 + */ +class HEAP { +private: + // 堆分配器 + ALLOCATOR* allocator_kernel; + ALLOCATOR* allocator_non_kernel; + +protected: + +public: + /** + * @brief 获取单例 + * @return HEAP& 静态对象 + */ + static HEAP& get_instance(void); + + /** 初始化 + * @brief 堆初始化 + * @return true 成功 + * @return false 失败 + */ + bool init(void); + + /** + * @brief 内核地址内存申请 + * @param _byte 要申请的 bytes + * @return void* 申请到的地址 + */ + void* kmalloc(size_t _byte); + + /** + * @brief 内核地址内存释放 + * @param _p 要释放的内存地址 + */ + void kfree(void* _p); + + /** + * @brief 内存申请 + * @param _byte 要申请的 bytes + * @return void* 申请到的地址 + */ + void* malloc(size_t _byte); + + /** + * @brief 内存释放 + * @param _p 要释放的内存地址 + */ + void free(void* _p); +}; + +#endif /* SIMPLEKERNEL_HEAP_H */ diff --git a/src/include/mem/pmm.h b/src/include/mem/pmm.h new file mode 100644 index 000000000..17e4a8c96 --- /dev/null +++ b/src/include/mem/pmm.h @@ -0,0 +1,180 @@ + +/** + * @file pmm.h + * @brief 物理内存管理头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_PMM_H +#define SIMPLEKERNEL_PMM_H + +#include "allocator.h" +#include "cstddef" +#include "cstdint" +#include "firstfit.h" + +/** + * @brief 物理内存管理接口 + * 对物理内存的管理来说 + * 1. 管理所有的物理内存,不论是否被机器保留/无法访问 + * 2. 内存开始地址与长度由 bootloader 给出: x86 下为 grub, riscv 下为 opensbi + * 3. + * 不关心内存是否被使用,但是默认的物理内存分配空间从内核结束后开始 + * 如果由体系结构需要分配内核开始前内存空间的,则尽量避免 + * 4. 最管理单位为页 + */ +class PMM { +private: + /// 物理内存开始地址 + uintptr_t start; + /// 物理内存长度,单位为 bytes + size_t length; + /// 物理内存页数 + size_t total_pages; + /// 内核空间起始地址 + uintptr_t kernel_space_start; + /// 内核空间大小,单位为 bytes + size_t kernel_space_length; + /// 非内核空间起始地址 + uintptr_t non_kernel_space_start; + /// 非内核空间大小,单位为 bytes + size_t non_kernel_space_length; + + /// 内核空间不会位于内存中间,导致出现非内核空间被切割为两部分的情况 + /// 物理内存分配器,分配内核空间 + ALLOCATOR* kernel_space_allocator; + /// 物理内存分配器,分配非内核空间 + ALLOCATOR* allocator; + + /** + * @brief 将 multiboot2/dtb 信息移动到内核空间 + */ + void move_boot_info(void); + +protected: + +public: + /** + * @brief 获取单例 + * @return PMM& 静态对象 + */ + static PMM& get_instance(void); + + /** + * @brief 初始化 + * @return true 成功 + * @return false 失败 + * @todo 移动到构造函数去 + */ + bool init(void); + + /** + * @brief 获取物理内存长度 + * @return size_t 物理内存长度 + */ + size_t get_pmm_length(void) const; + + /** + * @brief 获取内核空间起始地址 + * @return uintptr_t 内核空间起始地址 + */ + uintptr_t get_kernel_space_start(void) const; + + /** + * @brief 获取内核空间大小,单位为 byte + * @return size_t 内核空间大小 + */ + size_t get_kernel_space_length(void) const; + + /** + * @brief 获取非内核空间起始地址 + * @return uintptr_t 非内核空间起始地址 + */ + uintptr_t get_non_kernel_space_start(void) const; + + /** + * @brief 获取非内核空间大小,单位为 byte + * @return size_t 非内核空间大小 + */ + size_t get_non_kernel_space_length(void) const; + + /** + * @brief 获取当前已使用页数 + * @return size_t 已使用页数 + */ + size_t get_used_pages_count(void) const; + + /** + * @brief 获取当前空闲页 + * @return size_t 空闲页数 + */ + size_t get_free_pages_count(void) const; + + /** + * @brief 分配一页 + * @return uintptr_t 分配的内存起始地址 + */ + uintptr_t alloc_page(void); + + /** + * @brief 分配多页 + * @param _len 页数 + * @return uintptr_t 分配的内存起始地址 + */ + uintptr_t alloc_pages(size_t _len); + + /** + * @brief 分配以指定地址开始的 _len 页 + * @param _addr 指定的地址 + * @param _len 页数 + * @return true 成功 + * @return false 失败 + */ + bool alloc_pages(uintptr_t _addr, size_t _len); + + /** + * @brief 在内核空间申请一页 + * @return uintptr_t 分配的内存起始地址 + */ + uintptr_t alloc_page_kernel(void); + + /** + * @brief 在内核空间分配 _len 页 + * @param _len 页数 + * @return uintptr_t 分配到的内存起始地址 + */ + uintptr_t alloc_pages_kernel(size_t _len); + + /** + * @brief 在内核空间分配以指定地址开始的 _len 页 + * @param _addr 指定的地址 + * @param _len 页数 + * @return true 成功 + * @return false 失败 + */ + bool alloc_pages_kernel(uintptr_t _addr, size_t _len); + + /** + * @brief 回收一页 + * @param _addr 要回收的地址 + */ + void free_page(uintptr_t _addr); + + /** + * @brief 回收多页 + * @param _addr 要回收的地址 + * @param _len 页数 + */ + void free_pages(uintptr_t _addr, size_t _len); +}; + +#endif /* SIMPLEKERNEL_PMM_H */ diff --git a/src/include/mem/slab.h b/src/include/mem/slab.h new file mode 100644 index 000000000..a1b88c621 --- /dev/null +++ b/src/include/mem/slab.h @@ -0,0 +1,254 @@ + +/** + * @file slab.h + * @brief slab 分配器头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_SLAB_H +#define SIMPLEKERNEL_SLAB_H + +#include "allocator.h" +#include "cstddef" +#include "cstdint" +#include "cstdio" +#include "iostream" + +/** + * @brief SLAB 分配器 + * 只使用了 ALLOCATOR 的部分变量/函数 + * @note 针对常用的 size 分别建立含有三个链表对象(full, part, free)的数组 + * 需要分配时在对应 size 数组中寻找一个合适的 chunk + * 查找方法 首先查 part,再查 free,再没有就申请新的空间,再在 free 中查 + */ +class SLAB : ALLOCATOR { +private: + /** + * @brief 块抽象 + * 两级结构 + * 第二级保存相同大小的内存块的使用情况 + */ + struct chunk_t { + /// 头节点标识 + static constexpr const uintptr_t HEAD = 0xCDCD; + // chunk_t 结构的物理地址 + uintptr_t addr; + // 长度,不包括自身大小 单位为 byte + // 记录的是实际使用的长度 + // 按照 8byte 对齐 + size_t len; + /// 双向循环链表指针 + chunk_t* prev; + chunk_t* next; + + /** + * @brief 构造函数只会在 SLAB 初始化时调用,且只用于构造头节点 + */ + chunk_t(void); + + ~chunk_t(void); + + /** + * @brief 插入新节点 + * @param _new_node 要插入的节点 + */ + void push_back(chunk_t* _new_node); + + /** + * @brief 获取链表长度 + * @return size_t desc + */ + size_t size(void) const; + + bool operator==(const chunk_t& _node) const; + bool operator!=(const chunk_t& _node) const; + + /** + * @brief 返回相对头节点的第 _idx 项 + * @param _idx 第几项 + * @return chunk_t& chunk 对象 + */ + chunk_t& operator[](size_t _idx) const; + }; + + /** + * @brief slab chche 抽象 + * 第一级保存不同长度的内存块 + */ + class slab_cache_t { + private: + /** + * @brief 移动节点 + * @param _list 目标链表 + * @param _node 要移动的节点 + */ + void move(chunk_t& _list, chunk_t* _node); + + /** + * @brief 申请物理内存,返回申请到的地址起点,已经初始化过,且加入 free + * 链表 + * @param _len 要申请的长度 + * @return chunk_t* 申请到的 chunk + */ + chunk_t* alloc_pmm(size_t _len); + + /** + * @brief 释放内存 + */ + void free_pmm(void); + + /** + * @brief 分割一个节点 + * @param _node 要分割的节点 + * @param _len 要保留的长度 + * @note 如果剩余部分符合要求,新建节点并加入 part 链表 + * 同时将 _node->len 设置为 _len + */ + void split(chunk_t* _node, size_t _len); + + /** + * @brief 合并 part 中地址连续的链表项,如果有可回收的回调用 free_pmm + * 进行回收 + */ + void merge(void); + + /** + * @brief 在 _which 链表中查找长度符合的 + * @param _which 要查找的链表 + * @param _len 需要的长度 + * @param _alloc 如果未找到是否分配 + * @return chunk_t* 未找到返回 nullptr + */ + chunk_t* find(chunk_t& _which, size_t _len, bool _alloc); + + protected: + + public: + // 当前 cache 的长度,单位为 byte + size_t len; + // 这三个作为头节点使用,不会实际使用 + // full/part/free 是相对于 pmm + // 分配的一个或多个连续的页而言的 + // 已经分配的 len 长度的内存,当然 len 不一定全部使用,真实使用的长度由 + // chunk 记录 + chunk_t full; + // 申请的内存使用了一部分 + chunk_t part; + // 一整段申请的内存都没有使用 + chunk_t free; + /// 管理的是否为内核地址 + bool is_kernel_space; + + // 查找长度符合的 + chunk_t* find(size_t _len); + + /** + * @brief 释放一个 full 的链表项 + * @param _node 要释放的节点 + */ + void remove(chunk_t* _node); + + friend std::ostream& + operator<<(std::ostream& _out, SLAB::slab_cache_t& _cache) { + printf("_cache.full.size(): 0x%X\n", _cache.full.size()); + for (size_t i = 0; i < _cache.full.size(); i++) { + printf("full 0x%X addr: 0x%X, len: 0x%X\n", i, + _cache.full[i].addr, _cache.full[i].len); + } + printf("_cache.part.size(): 0x%X\n", _cache.part.size()); + for (size_t i = 0; i < _cache.part.size(); i++) { + printf("part 0x%X addr: 0x%X, len: 0x%X\n", i, + _cache.part[i].addr, _cache.part[i].len); + } + printf("_cache.free.size(): 0x%X\n", _cache.free.size()); + for (size_t i = 0; i < _cache.free.size(); i++) { + printf("free 0x%X addr: 0x%X, len: 0x%X\n", i, + _cache.free[i].addr, _cache.free[i].len); + } + return _out; + } + }; + + /// chunk 大小 + /// @note 32bit: 0x10,64bit: 0x20 + static constexpr const size_t CHUNK_SIZE = sizeof(chunk_t); + + /** + * @brief 管理不同长度的内存,根据下标计算 + */ + enum LEN { + LEN256 = 0, + LEN512, + LEN1024, + LEN2048, + LEN4096, + LEN8192, + LEN16384, + LEN32768, + LEN65536 = 8, + }; + + /// 最小为 256 bytes + static constexpr const size_t MIN = 256; + static constexpr const size_t SHIFT = 8; + /// 支持 256(256<<(CACHAE_LEN-1)) bytes + /// slab_cache[0] 即为内存为 256 字节的 chunk_t 结构链表 + static constexpr const size_t CACHAE_LEN = 9; + slab_cache_t slab_cache[CACHAE_LEN]; + + /// 管理的是否为内核地址 + bool is_kernel_space; + + /** + * @brief 根据 _len 获取对应的 slab_cache 下标 + * @param _len 长度 + * @return size_t 对应的下标 + */ + size_t get_idx(size_t _len) const; + +protected: + +public: + /** + * @brief 构造函数 + * @param _name 分配器名称 + * @param _addr 管理地址起始 + * @param _len 要管理的长度 + * @param _is_kernel 管理的是否为内核地址 + */ + SLAB(const char* _name, uintptr_t _addr, size_t _len, bool _is_kernel); + + ~SLAB(void); + + /** + * @brief 分配内存 + * @param _len 长度,以 byte 为单位 + * @return uintptr_t 分配到的内存地址 + */ + uintptr_t alloc(size_t _len) override; + + // slab 不支持这个函数 + bool alloc(uintptr_t _addr, size_t _len) override; + + /** + * @brief 释放内存 + * @param _addr 要释放的地址 + * @note slab 不使用第二个参数 + */ + void free(uintptr_t _addr, size_t) override; + + // 暂时不支持 + size_t get_used_count(void) const override; + size_t get_free_count(void) const override; +}; + +#endif /* SIMPLEKERNEL_SLAB_H */ diff --git a/src/include/mem/vmm.h b/src/include/mem/vmm.h new file mode 100644 index 000000000..27fbdb446 --- /dev/null +++ b/src/include/mem/vmm.h @@ -0,0 +1,245 @@ + +/** + * @file vmm.h + * @brief 虚拟内存头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_VMM_H +#define SIMPLEKERNEL_VMM_H + +#include "climits" +#include "common.h" +#include "cpu.hpp" + +// TODO: 可以优化 + +/// 页表项,最底层 +typedef uintptr_t pte_t; +/// 页表,也可以是页目录,它们的结构是一样的 +typedef uintptr_t* pt_t; + +/// 每个页表能映射多少页 = 页大小/页表项大小: 2^9 +static constexpr const size_t VMM_PAGES_PRE_PAGE_TABLE + = COMMON::PAGE_SIZE / sizeof(pte_t); + +/// 映射内核空间的大小 +static constexpr const size_t VMM_KERNEL_SPACE_SIZE = COMMON::KERNEL_SPACE_SIZE; + +/// 内核映射的页数 +static constexpr const size_t VMM_KERNEL_SPACE_PAGES + = VMM_KERNEL_SPACE_SIZE / COMMON::PAGE_SIZE; + +#if defined(__i386__) +/// P = 1 表示有效; P = 0 表示无效。 +static constexpr const uint8_t VMM_PAGE_VALID = 1 << 0; +/// 如果为 0 表示页面只读或可执行。 +static constexpr const uint8_t VMM_PAGE_READABLE = 0; +static constexpr const uint8_t VMM_PAGE_WRITABLE = 1 << 1; +static constexpr const uint8_t VMM_PAGE_EXECUTABLE = 0; +/// U/S-- 位 2 是用户 / 超级用户 (User/Supervisor) 标志。 +/// 如果为 1 那么运行在任何特权级上的程序都可以访问该页面。 +static constexpr const uint8_t VMM_PAGE_USER = 1 << 2; +/// 内核虚拟地址相对物理地址的偏移 +static constexpr const size_t KERNEL_OFFSET = 0x0; +/// PTE 属性位数 +static constexpr const size_t VMM_PTE_PROP_BITS = 12; +/// PTE 页内偏移位数 +static constexpr const size_t VMM_PAGE_OFF_BITS = 12; +/// VPN 位数 +static constexpr const size_t VMM_VPN_BITS = 10; +/// VPN 位数掩码,10 位 VPN +static constexpr const size_t VMM_VPN_BITS_MASK = 0x3FF; +/// i386 使用了两级页表 +static constexpr const size_t VMM_PT_LEVEL = 2; + +#elif defined(__x86_64__) +/// P = 1 表示有效; P = 0 表示无效。 +static constexpr const uint8_t VMM_PAGE_VALID = 1 << 0; +/// 如果为 0 表示页面只读或可执行。 +static constexpr const uint8_t VMM_PAGE_READABLE = 0; +static constexpr const uint8_t VMM_PAGE_WRITABLE = 1 << 1; +static constexpr const uint8_t VMM_PAGE_EXECUTABLE = 0; +/// U/S-- 位 2 是用户 / 超级用户 (User/Supervisor) 标志。 +/// 如果为 1 那么运行在任何特权级上的程序都可以访问该页面。 +static constexpr const uint8_t VMM_PAGE_USER = 1 << 2; +/// 内核虚拟地址相对物理地址的偏移 +static constexpr const size_t KERNEL_OFFSET = 0x0; +/// PTE 属性位数 +static constexpr const size_t VMM_PTE_PROP_BITS = 12; +/// PTE 页内偏移位数 +static constexpr const size_t VMM_PAGE_OFF_BITS = 12; +/// VPN 位数 +static constexpr const size_t VMM_VPN_BITS = 9; +/// VPN 位数掩码,9 位 VPN +static constexpr const size_t VMM_VPN_BITS_MASK = 0x1FF; +/// x86_64 使用了四级页表 +static constexpr const size_t VMM_PT_LEVEL = 4; + +#elif defined(__riscv) +/// 有效位 +static constexpr const uint8_t VMM_PAGE_VALID = CPU::pte_t::VALID; +/// 可读位 +static constexpr const uint8_t VMM_PAGE_READABLE = CPU::pte_t::READ; +/// 可写位s +static constexpr const uint8_t VMM_PAGE_WRITABLE = CPU::pte_t::WRITE; +/// 可执行位 +static constexpr const uint8_t VMM_PAGE_EXECUTABLE = CPU::pte_t::EXEC; +/// 用户位 +static constexpr const uint8_t VMM_PAGE_USER = CPU::pte_t::USER; +/// 全局位,我们不会使用 +static constexpr const uint8_t VMM_PAGE_GLOBAL = CPU::pte_t::GLOBAL; +/// 已使用位,用于替换算法 +static constexpr const uint8_t VMM_PAGE_ACCESSED = CPU::pte_t::ACCESSED; +/// 已修改位,用于替换算法 +static constexpr const uint8_t VMM_PAGE_DIRTY = CPU::pte_t::DIRTY; +/// 内核虚拟地址相对物理地址的偏移 +static constexpr const size_t KERNEL_OFFSET = 0x0; +/// PTE 属性位数 +static constexpr const size_t VMM_PTE_PROP_BITS = 10; +/// PTE 页内偏移位数 +static constexpr const size_t VMM_PAGE_OFF_BITS = 12; +/// VPN 位数 +static constexpr const size_t VMM_VPN_BITS = 9; +/// VPN 位数掩码,9 位 VPN +static constexpr const size_t VMM_VPN_BITS_MASK = 0x1FF; +/// riscv64 使用了三级页表 +static constexpr const size_t VMM_PT_LEVEL = 3; +#endif + +/** + * @brief 虚拟地址到物理地址转换 + * @param _va 要转换的虚拟地址 + * @return constexpr uintptr_t 转换好的地址 + */ +static constexpr uintptr_t VMM_VA2PA(uintptr_t _va) { + return _va - KERNEL_OFFSET; +} + +/** + * @brief 物理地址到虚拟地址转换 + * @param _pa 要转换的物理地址 + * @return constexpr uintptr_t 转换好的地址 + */ +static constexpr uintptr_t VMM_PA2VA(uintptr_t _pa) { + return _pa + KERNEL_OFFSET; +} + +/** + * @brief 虚拟内存抽象 + */ +class VMM { +private: + /** + * @brief 物理地址转换到页表项 + * @param _pa 物理地址 + * @return constexpr uintptr_t 对应的虚拟地址 + * @note 0~11: pte 属性 + * 12~31: 页表的物理页地址 + */ + static constexpr uintptr_t PA2PTE(uintptr_t _pa) { + return (_pa >> VMM_PAGE_OFF_BITS) << VMM_PTE_PROP_BITS; + } + + /** + * @brief 页表项转换到物理地址 + * @param _pte 页表 + * @return constexpr uintptr_t 对应的物理地址 + */ + static constexpr uintptr_t PTE2PA(const pte_t _pte) { + return (((uintptr_t)_pte) >> VMM_PTE_PROP_BITS) << VMM_PAGE_OFF_BITS; + } + + /** + * @brief 计算 X 级页表的位置 + * @param _level 级别 + * @return constexpr uintptr_t 偏移 + */ + static constexpr uintptr_t PXSHIFT(const size_t _level) { + return VMM_PAGE_OFF_BITS + (VMM_VPN_BITS * _level); + } + + /** + * @brief 获取 _va 的第 _level 级 VPN + * @note 例如虚拟地址右移 12+(10 * _level) 位, + * 得到的就是第 _level 级页表的 VPN + */ + static constexpr uintptr_t PX(size_t _level, uintptr_t _va) { + return (_va >> PXSHIFT(_level)) & VMM_VPN_BITS_MASK; + } + + /** + * @brief 在 _pgd 中查找 _va 对应的页表项 + * 如果未找到,_alloc 为真时会进行分配 + * @param _pgd 要查找的页目录 + * @param _va 虚拟地址 + * @param _alloc 是否分配 + * @return pte_t* 未找到返回 nullptr + */ + pte_t* find(const pt_t _pgd, uintptr_t _va, bool _alloc); + +protected: + +public: + /** + * @brief 获取单例 + * @return VMM& 静态对象 + */ + static VMM& get_instance(void); + + /** + * @brief 初始化 + * @return true 成功 + * @return false 失败 + */ + bool init(void); + + /** + * @brief 获取当前页目录 + * @return pt_t 当前页目录 + */ + pt_t get_pgd(void); + + /** + * @brief 设置当前页目录 + * @param _pgd 要设置的页目录 + */ + void set_pgd(const pt_t _pgd); + + /** + * @brief 映射物理地址到虚拟地址 + * @param _pgd 要使用的页目录 + * @param _va 要映射的虚拟地址 + * @param _pa 物理地址 + * @param _flag 属性 + */ + void mmap(const pt_t _pgd, uintptr_t _va, uintptr_t _pa, uint32_t _flag); + + /** + * @brief 取消映射 + * @param _pgd 要操作的页目录 + * @param _va 要取消映射的虚拟地址 + */ + void unmmap(const pt_t _pgd, uintptr_t _va); + + /** + * @brief 获取映射的物理地址 + * @param _pgd 页目录 + * @param _va 虚拟地址 + * @param _pa 如果已经映射,保存映射的物理地址,否则为 nullptr + * @return true 已映射 + * @return false 未映射 + */ + bool get_mmap(const pt_t _pgd, uintptr_t _va, const void* _pa); +}; + +#endif /* SIMPLEKERNEL_VMM_H */ diff --git a/src/include/mm/README.md b/src/include/mm/README.md deleted file mode 100644 index 22e275a34..000000000 --- a/src/include/mm/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# src/include/mm/ - -## 文件说明 -- mm.h - - 内存初始化 - -## 参考资料 - - - diff --git a/src/include/mm/mm.h b/src/include/mm/mm.h deleted file mode 100644 index e28092235..000000000 --- a/src/include/mm/mm.h +++ /dev/null @@ -1,14 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// mm.h for MRNIU/SimpleKernel. - -#ifndef _MM_H_ -#define _MM_H_ - - -#include "mm/pmm.h" - -void mm_init(void); - -#endif diff --git a/src/include/mm/pmm.c b/src/include/mm/pmm.c deleted file mode 100644 index 5a23539cc..000000000 --- a/src/include/mm/pmm.c +++ /dev/null @@ -1,17 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// pmm.c for MRNIU/SimpleKernel. - -#include "mm/pmm.h" - - - - - - - -// void show_memory_map(){ -// -// return; -// } diff --git a/src/include/mm/pmm.h b/src/include/mm/pmm.h deleted file mode 100644 index 17773da62..000000000 --- a/src/include/mm/pmm.h +++ /dev/null @@ -1,23 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// pmm.h for MRNIU/SimpleKernel. - - -#ifndef _PMM_H_ -#define _PMM_H_ - -#include "stdint.h" -#include "stdio.h" -#include "multiboot.h" - -extern uint8_t kernel_start[]; -extern uint8_t kernel_end[]; - - - - - -void show_memory_map(); - -#endif diff --git a/src/include/multiboot.h b/src/include/multiboot.h deleted file mode 100644 index 862a4af95..000000000 --- a/src/include/multiboot.h +++ /dev/null @@ -1,404 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#multiboot_002eh -// multiboot.h for MRNIU/SimpleKernel. - - -/** - * 启动后,在32位内核进入点,机器状态如下: - * 1. CS 指向基地址为 0x00000000,限长为4G – 1的代码段描述符。 - * 2. DS,SS,ES,FS 和 GS 指向基地址为0x00000000,限长为4G – 1的数据段描述符。 - * 3. A20 地址线已经打开。 - * 4. 页机制被禁止。 - * 5. 中断被禁止。 - * 6. EAX = 0x2BADB002 - * 7. 系统信息和启动信息块的线性地址保存在 EBX中(相当于一个指针)。 - * 以下即为这个信息块的结构 - */ - - -/* multiboot2.h - Multiboot 2 header file. */ -/* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY - * DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR - * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef _MULTIBOOT_H_ -#define _MULTIBOOT_H_ - -#ifndef MULTIBOOT_HEADER -#define MULTIBOOT_HEADER 1 - -/* How many bytes from the start of the file we search for the header. */ -#define MULTIBOOT_SEARCH 32768 -#define MULTIBOOT_HEADER_ALIGN 8 - -/* The magic field should contain this. */ -#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6 - -/* This should be in %eax. */ -#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289 - -/* Alignment of multiboot modules. */ -#define MULTIBOOT_MOD_ALIGN 0x00001000 - -/* Alignment of the multiboot info structure. */ -#define MULTIBOOT_INFO_ALIGN 0x00000008 - -/* Flags set in the 'flags' member of the multiboot header. */ - -#define MULTIBOOT_TAG_ALIGN 8 -#define MULTIBOOT_TAG_TYPE_END 0 -#define MULTIBOOT_TAG_TYPE_CMDLINE 1 -#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2 -#define MULTIBOOT_TAG_TYPE_MODULE 3 -#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4 -#define MULTIBOOT_TAG_TYPE_BOOTDEV 5 -#define MULTIBOOT_TAG_TYPE_MMAP 6 -#define MULTIBOOT_TAG_TYPE_VBE 7 -#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8 -#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9 -#define MULTIBOOT_TAG_TYPE_APM 10 -#define MULTIBOOT_TAG_TYPE_EFI32 11 -#define MULTIBOOT_TAG_TYPE_EFI64 12 -#define MULTIBOOT_TAG_TYPE_SMBIOS 13 -#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14 -#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15 -#define MULTIBOOT_TAG_TYPE_NETWORK 16 -#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17 -#define MULTIBOOT_TAG_TYPE_EFI_BS 18 -#define MULTIBOOT_TAG_TYPE_EFI32_IH 19 -#define MULTIBOOT_TAG_TYPE_EFI64_IH 20 -#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21 - -#define MULTIBOOT_HEADER_TAG_END 0 -#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1 -#define MULTIBOOT_HEADER_TAG_ADDRESS 2 -#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3 -#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4 -#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5 -#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6 -#define MULTIBOOT_HEADER_TAG_EFI_BS 7 -#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8 -#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9 -#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10 - -#define MULTIBOOT_ARCHITECTURE_I386 0 -#define MULTIBOOT_ARCHITECTURE_MIPS32 4 -#define MULTIBOOT_HEADER_TAG_OPTIONAL 1 - -#define MULTIBOOT_LOAD_PREFERENCE_NONE 0 -#define MULTIBOOT_LOAD_PREFERENCE_LOW 1 -#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2 - -#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1 -#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2 - - #ifndef ASM_FILE - -typedef unsigned char multiboot_uint8_t; -typedef unsigned short multiboot_uint16_t; -typedef unsigned int multiboot_uint32_t; -typedef unsigned long long multiboot_uint64_t; - -struct multiboot_header { - /* Must be MULTIBOOT_MAGIC - see above. */ - multiboot_uint32_t magic; - - /* ISA */ - multiboot_uint32_t architecture; - - /* Total header length. */ - multiboot_uint32_t header_length; - - /* The above fields plus this one must equal 0 mod 2^32. */ - multiboot_uint32_t checksum; -}; - -struct multiboot_header_tag { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; -}; - -struct multiboot_header_tag_information_request { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; - multiboot_uint32_t requests[0]; -}; - -struct multiboot_header_tag_address { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; - multiboot_uint32_t header_addr; - multiboot_uint32_t load_addr; - multiboot_uint32_t load_end_addr; - multiboot_uint32_t bss_end_addr; -}; - -struct multiboot_header_tag_entry_address { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; - multiboot_uint32_t entry_addr; -}; - -struct multiboot_header_tag_console_flags { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; - multiboot_uint32_t console_flags; -}; - -struct multiboot_header_tag_framebuffer { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; - multiboot_uint32_t width; - multiboot_uint32_t height; - multiboot_uint32_t depth; -}; - -struct multiboot_header_tag_module_align { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; -}; - -struct multiboot_header_tag_relocatable { - multiboot_uint16_t type; - multiboot_uint16_t flags; - multiboot_uint32_t size; - multiboot_uint32_t min_addr; - multiboot_uint32_t max_addr; - multiboot_uint32_t align; - multiboot_uint32_t preference; -}; - -struct multiboot_color { - multiboot_uint8_t red; - multiboot_uint8_t green; - multiboot_uint8_t blue; -}; - -struct multiboot_mmap_entry { - multiboot_uint64_t addr; - multiboot_uint64_t len; -#define MULTIBOOT_MEMORY_AVAILABLE 1 -#define MULTIBOOT_MEMORY_RESERVED 2 -#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3 -#define MULTIBOOT_MEMORY_NVS 4 -#define MULTIBOOT_MEMORY_BADRAM 5 - multiboot_uint32_t type; - multiboot_uint32_t zero; -}; -typedef struct multiboot_mmap_entry multiboot_memory_map_t; - -struct multiboot_tag { - multiboot_uint32_t type; - multiboot_uint32_t size; -}; - -struct multiboot_tag_string { - multiboot_uint32_t type; - multiboot_uint32_t size; - char string[0]; -}; - -struct multiboot_tag_module { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t mod_start; - multiboot_uint32_t mod_end; - char cmdline[0]; -}; - -struct multiboot_tag_basic_meminfo { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t mem_lower; - multiboot_uint32_t mem_upper; -}; - -struct multiboot_tag_bootdev { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t biosdev; - multiboot_uint32_t slice; - multiboot_uint32_t part; -}; - -struct multiboot_tag_mmap { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t entry_size; - multiboot_uint32_t entry_version; - struct multiboot_mmap_entry entries[0]; -}; - -struct multiboot_vbe_info_block { - multiboot_uint8_t external_specification[512]; -}; - -struct multiboot_vbe_mode_info_block { - multiboot_uint8_t external_specification[256]; -}; - -struct multiboot_tag_vbe { - multiboot_uint32_t type; - multiboot_uint32_t size; - - multiboot_uint16_t vbe_mode; - multiboot_uint16_t vbe_interface_seg; - multiboot_uint16_t vbe_interface_off; - multiboot_uint16_t vbe_interface_len; - - struct multiboot_vbe_info_block vbe_control_info; - struct multiboot_vbe_mode_info_block vbe_mode_info; -}; - -struct multiboot_tag_framebuffer_common { - multiboot_uint32_t type; - multiboot_uint32_t size; - - multiboot_uint64_t framebuffer_addr; - multiboot_uint32_t framebuffer_pitch; - multiboot_uint32_t framebuffer_width; - multiboot_uint32_t framebuffer_height; - multiboot_uint8_t framebuffer_bpp; -#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0 -#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1 -#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2 - multiboot_uint8_t framebuffer_type; - multiboot_uint16_t reserved; -}; - -struct multiboot_tag_framebuffer { - struct multiboot_tag_framebuffer_common common; - - union { - struct { - multiboot_uint16_t framebuffer_palette_num_colors; - struct multiboot_color framebuffer_palette[0]; - }; - struct { - multiboot_uint8_t framebuffer_red_field_position; - multiboot_uint8_t framebuffer_red_mask_size; - multiboot_uint8_t framebuffer_green_field_position; - multiboot_uint8_t framebuffer_green_mask_size; - multiboot_uint8_t framebuffer_blue_field_position; - multiboot_uint8_t framebuffer_blue_mask_size; - }; - }; -}; - -struct multiboot_tag_elf_sections { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t num; - multiboot_uint32_t entsize; - multiboot_uint32_t shndx; - char sections[0]; -}; - -struct multiboot_tag_apm { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint16_t version; - multiboot_uint16_t cseg; - multiboot_uint32_t offset; - multiboot_uint16_t cseg_16; - multiboot_uint16_t dseg; - multiboot_uint16_t flags; - multiboot_uint16_t cseg_len; - multiboot_uint16_t cseg_16_len; - multiboot_uint16_t dseg_len; -}; - -struct multiboot_tag_efi32 { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t pointer; -}; - -struct multiboot_tag_efi64 { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint64_t pointer; -}; - -struct multiboot_tag_smbios { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint8_t major; - multiboot_uint8_t minor; - multiboot_uint8_t reserved[6]; - multiboot_uint8_t tables[0]; -}; - -struct multiboot_tag_old_acpi { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint8_t rsdp[0]; -}; - -struct multiboot_tag_new_acpi { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint8_t rsdp[0]; -}; - -struct multiboot_tag_network { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint8_t dhcpack[0]; -}; - -struct multiboot_tag_efi_mmap { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t descr_size; - multiboot_uint32_t descr_vers; - multiboot_uint8_t efi_mmap[0]; -}; - -struct multiboot_tag_efi32_ih { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t pointer; -}; - -struct multiboot_tag_efi64_ih { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint64_t pointer; -}; - -struct multiboot_tag_load_base_addr { - multiboot_uint32_t type; - multiboot_uint32_t size; - multiboot_uint32_t load_base_addr; -}; - -#endif /* ! ASM_FILE */ - -#endif /* ! MULTIBOOT_HEADER */ - -#endif diff --git a/src/include/pic.hpp b/src/include/pic.hpp deleted file mode 100644 index 2e90522a7..000000000 --- a/src/include/pic.hpp +++ /dev/null @@ -1,88 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// pic.hpp for MRNIU/SimpleKernel. - -// TODO - -#ifndef _PIC_HPP_ -#define _PIC_HPP_ - -#include "stdint.h" -#include "port.hpp" -#include "cpu.hpp" -#include "intr/intr.h" -// #include "stdio.h" - -#define IO_PIC1 (0x20) // Master (IRQs 0-7) -#define IO_PIC2 (0xA0) // Slave (IRQs 8-15) -#define IO_PIC1C (IO_PIC1+1) -#define IO_PIC2C (IO_PIC2+1) -#define PIC_EOI 0x20 /* End-of-interrupt command code */ - -// 设置 8259A 芯片 -void init_interrupt_chip(void); -void init_interrupt_chip(void){ - // 重新映射 IRQ 表 - // 两片级联的 Intel 8259A 芯片 - // 主片端口 0x20 0x21 - // 从片端口 0xA0 0xA1 - - // 初始化主片、从片 - // 0001 0001 - outb(IO_PIC1, 0x11); - outb(IO_PIC1C, IRQ0); // 设置主片 IRQ 从 0x20(32) 号中断开始 - outb(IO_PIC1C, 0x04); // 设置主片 IR2 引脚连接从片 - outb(IO_PIC1C, 0x01); // // 设置主片按照 8086 的方式工作 - - outb(IO_PIC2, 0x11); - outb(IO_PIC2C, IRQ8); // 设置从片 IRQ 从 0x28(40) 号中断开始 - outb(IO_PIC2C, 0x02); // 告诉从片输出引脚和主片 IR2 号相连 - outb(IO_PIC2C, 0x01); // 设置从片按照 8086 的方式工作 - - // 默认关闭所有中断 - outb(IO_PIC1C, 0xFF); - outb(IO_PIC2C, 0xFF); - cpu_sti(); -} - -// 重设 8259A 芯片 -void clear_interrupt_chip(uint32_t intr_no){ - // 发送中断结束信号给 PICs - // 按照我们的设置,从 32 号中断起为用户自定义中断 - // 因为单片的 Intel 8259A 芯片只能处理 8 级中断 - // 故大于等于 40 的中断号是由从片处理的 - if (intr_no >= IRQ8) { - // 发送重设信号给从片 - outb(IO_PIC2, PIC_EOI); - } - // 发送重设信号给主片 - outb(IO_PIC1, PIC_EOI); -} - -void enable_irq(uint32_t irq_no){ - uint8_t mask =0; - // printk_color(green, "enable_irq mask: %X", mask); - if(irq_no >= IRQ8) { - mask = ((inb(IO_PIC2C))&(~(1<<(irq_no%8)))); - outb(IO_PIC2C, mask); - } else { - mask = ((inb(IO_PIC1C))&(~(1<<(irq_no%8)))); - outb(IO_PIC1C, mask); - } -} - -void disable_irq(uint32_t irq_no){ - uint8_t mask=0; - // printk_color(green, "disable_irq mask: %X", mask); - if(irq_no >= IRQ8) { - mask = ((inb(IO_PIC2C))|(1<<(irq_no%8))); - outb(IO_PIC2C, mask); - } else { - mask = ((inb(IO_PIC1C))|(1<<(irq_no%8))); - outb(IO_PIC1C, mask); - } -} - - -#endif diff --git a/src/include/port.hpp b/src/include/port.hpp deleted file mode 100644 index bd3bf18d1..000000000 --- a/src/include/port.hpp +++ /dev/null @@ -1,43 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// port.h for MRNIU/SimpleKernel. - -#ifndef _PORT_HPP_ -#define _PORT_HPP_ - -#include "stdint.h" - -// 端口写一个字节 -static inline void outb(uint16_t port, uint8_t value){ - asm volatile( - "outb %1, %0" - ::"dN"(port), - "a"(value) - ); -} - -// 端口读一个字节 -static inline uint8_t inb(uint16_t port){ - uint8_t ret; - asm volatile( - "inb %1, %0" - :"=a"(ret) - :"dN"(port) - ); - return ret; -} - -// 端口读一个字 -static inline uint16_t inw(uint16_t port){ - uint16_t ret; - asm volatile( - "inw %1, %0" - :"=a"(ret) - :"dN" (port) - ); - return ret; -} - - -#endif diff --git a/src/include/resource.h b/src/include/resource.h new file mode 100644 index 000000000..1db61684b --- /dev/null +++ b/src/include/resource.h @@ -0,0 +1,74 @@ + +/** + * @file resource.h + * @brief 资源信息抽象 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_RESOURCE_H +#define SIMPLEKERNEL_RESOURCE_H + +#include "cassert" +#include "cstdint" +#include "iostream" + +/** + * @brief 用于表示一种资源 + */ +struct resource_t { + /// 资源类型 + enum : uint8_t { + /// 内存 + MEM = 1 << 0, + /// 中断号 + INTR_NO = 1 << 1, + }; + + uint8_t type; + /// 资源名称 + char* name; + + /// 内存信息 + struct { + uintptr_t addr; + size_t len; + } mem; + + /// 中断号 + uint8_t intr_no; + + resource_t(void) : type(0), name(nullptr) { + mem.addr = 0; + mem.len = 0; + intr_no = 0; + return; + } + + /** + * @brief resource_t 输出 + * @param _os 输出流 + * @param _res 要输出的 resource_t + * @return std::ostream& 输出流 + */ + friend std::ostream& operator<<(std::ostream& _os, const resource_t& _res) { + printf("%s: ", _res.name); + if (_res.type & MEM) { + printf("MEM(0x%p, 0x%p)", _res.mem.addr, _res.mem.len); + } + if (_res.type & INTR_NO) { + printf(", INTR_NO(0x%p)", _res.intr_no); + } + return _os; + } +}; + +#endif /* SIMPLEKERNEL_RESOURCE_H */ diff --git a/src/include/time.h b/src/include/time.h new file mode 100644 index 000000000..c6943b837 --- /dev/null +++ b/src/include/time.h @@ -0,0 +1,46 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +// +// time.h for Simple-XX/SimpleKernel. + +#ifndef _TIME_H_ +#define _TIME_H_ + +#include "stdint.h" + +class time_t { +public: + // seconds after the minute [0-60] + uint32_t tm_sec; + // minutes after the hour [0-59] + uint32_t tm_min; + // hours since midnight [0-23] + uint32_t tm_hour; + // day of the month [1-31] + uint32_t tm_mday; + // months since January [0-11] + uint32_t tm_mon; + // years since 1900 + uint32_t tm_year; + // days since Sunday [0-6] + uint32_t tm_wday; + // days since January 1 [0-365] + uint32_t tm_yday; + // Daylight Saving Time flag + int tm_isdst; + // offset from UTC in seconds + long tm_gmtoff; + // timezone abbreviation + char* tm_zone; + + time_t(void) { + return; + } + + ~time_t(void) { + return; + } +}; + +#endif /* _TIME_H_ */ diff --git a/src/include/tty.hpp b/src/include/tty.hpp deleted file mode 100644 index 9826bfd78..000000000 --- a/src/include/tty.hpp +++ /dev/null @@ -1,180 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// tty.hpp for MRNIU/SimpleKernel. - -#ifndef _TTY_HPP_ -#define _TTY_HPP_ - -#include "stdint.h" -#include "stddef.h" -#include "vga.hpp" -#include "string.h" - - -size_t terminal_row; // 命令行行数 -size_t terminal_column; // 当前命令行列数 -uint8_t terminal_color; // 当前命令行颜色 - -volatile uint16_t * terminal_buffer; - -void terminal_scroll(void); -uint16_t terminal_getcursorpos(void); -void terminal_setcursorpos(size_t, size_t); -void terminal_writestring(const char*); -void terminal_write(const char*, size_t); -void terminal_putchar(char); -void terminal_escapeconv(char); -void terminal_putentryat(char, uint8_t, size_t, size_t); -void terminal_setcolor(uint8_t); -uint8_t terminal_getcolor(void); - - -// 命令行初始化 -void terminal_init(void); -void terminal_init(void){ - // 从左上角开始 - terminal_row = 0; - terminal_column = 0; - // 字体为灰色,背景为黑色 - terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); - terminal_buffer = (uint16_t*) 0xB8000; - // 用 ' ' 填满屏幕 - for (size_t y = 0; y < VGA_HEIGHT; y++) { - for (size_t x = 0; x < VGA_WIDTH; x++) { - const size_t index = y * VGA_WIDTH + x; - terminal_buffer[index] = vga_entry(' ', terminal_color); - } - } - terminal_setcursorpos(0, 0); -} - -// /* Clear the screen and initialize VIDEO, XPOS and YPOS. */ -// static void -// cls (void) -// { -// int i; -// -// video = (unsigned char *) VIDEO; -// -// for (i = 0; i < COLUMNS * LINES * 2; i++) -// *(video + i) = 0; -// -// xpos = 0; -// ypos = 0; -// } - -// 设置命令行颜色 -void terminal_setcolor(uint8_t color){ - terminal_color = color; -} - -// 获取当前颜色 -uint8_t terminal_getcolor(void){ - return terminal_color; -} - -// 在指定位置输出字符 -void terminal_putentryat(char c, uint8_t color, size_t x, size_t y){ - const size_t index = y * VGA_WIDTH + x; - terminal_buffer[index] = vga_entry(c, color); -} - -// 转义字符处理 -void terminal_escapeconv(char c){ - switch(c) { - case '\n': - terminal_row+=1; - terminal_column=0; - break; - case '\t': - terminal_column+=4; - break; - case '\b': - terminal_column-=1; - break; - } -} - -// 在当前位置输出字符 -void terminal_putchar(char c){ - terminal_putentryat(c, terminal_color, terminal_column, terminal_row); - - // 如果到达最后一列则换行 - if (++terminal_column == VGA_WIDTH) - terminal_row += 1; - terminal_escapeconv(c); // 转义字符处理 - terminal_scroll(); // 屏幕滚动 - terminal_setcursorpos(terminal_column, terminal_row); -} - - -// /* Put the character C on the screen. */ -// static void -// putchar (int c) -// { -// if (c == '\n' || c == '\r') -// { -// newline: -// xpos = 0; -// ypos++; -// if (ypos >= LINES) -// ypos = 0; -// return; -// } -// -// *(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF; -// *(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE; -// -// xpos++; -// if (xpos >= COLUMNS) -// goto newline; -// } - -// 命令行写 -void terminal_write(const char* data, size_t size){ - for (size_t i = 0; i < size; i++) - terminal_putchar(data[i]); -} - -// 命令行写字符串 -void terminal_writestring(const char* data){ - terminal_write(data, strlen(data)); -} - -// 设置光标位置 -void terminal_setcursorpos(size_t x, size_t y){ - const uint16_t index = y * VGA_WIDTH + x; - // 光标的设置,见参考资料 - outb(VGA_ADDR, VGA_CURSOR_H); // 告诉 VGA 我们要设置光标的高字节 - outb(VGA_DATA, index >> 8); // 发送高 8 位 - outb(VGA_ADDR, VGA_CURSOR_L); // 告诉 VGA 我们要设置光标的低字节 - outb(VGA_DATA, index); // 发送低 8 位 -} - -// 获取光标位置 -uint16_t terminal_getcursorpos(){ - outb(VGA_ADDR, VGA_CURSOR_H); - size_t cursor_pos_h = inb(VGA_DATA); - outb(VGA_ADDR, VGA_CURSOR_L); - size_t cursor_pos_l = inb(VGA_DATA); - //返回光标位置 - return (cursor_pos_h << 8) | cursor_pos_l; -} - -// 滚动显示 -void terminal_scroll(){ - if (terminal_row >= VGA_HEIGHT) { - // 将所有行的显示数据复制到上一行 - for (size_t i= 0; i < (VGA_HEIGHT-1)* VGA_WIDTH; i++) - terminal_buffer[i] = terminal_buffer[i+80]; - // 最后的一行数据现在填充空格,不显示任何字符 - for (size_t i= (VGA_HEIGHT-1)* VGA_WIDTH; i< VGA_HEIGHT* VGA_WIDTH; i++) - terminal_buffer[i] = vga_entry(' ', terminal_color); - // 向上移动了一行,所以 cursor_y 现在是 24 - terminal_row = 24; - } -} - - -#endif diff --git a/src/include/vfs.h b/src/include/vfs.h new file mode 100644 index 000000000..5238299f4 --- /dev/null +++ b/src/include/vfs.h @@ -0,0 +1,304 @@ + +/** + * @file vfs.h + * @brief 虚拟文件系统头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_VFS_H +#define SIMPLEKERNEL_VFS_H + +#include "cstdint" +#include "list" +#include "string" +#include "time.h" + +typedef uint32_t device_id_t; +typedef uint32_t user_id_t; +typedef uint32_t group_id_t; +typedef uint32_t mode_t; +typedef uint32_t flag_t; +typedef uint32_t fd_t; + +// open for reading only +static constexpr const uint32_t O_RDONLY = 0x0000; +// open for writing only +static constexpr const uint32_t O_WRONLY = 0x0001; +// open for reading and writing +static constexpr const uint32_t O_RDWR = 0x0002; +// mask for above modes +static constexpr const uint32_t O_ACCMODE = 0x0003; +// no delay +static constexpr const uint32_t O_NONBLOCK = 0x0004; +// set append mode +static constexpr const uint32_t O_APPEND = 0x0008; +// create if nonexistant +static constexpr const uint32_t O_CREAT = 0x0200; +// truncate to zero length +static constexpr const uint32_t O_TRUNC = 0x0400; +// error if already exists +static constexpr const uint32_t O_EXCL = 0x0800; + +/** + * @brief inode 索引节点 index node + * 保存在磁盘上 + */ +class inode_t { +private: + +protected: + +public: + // 文件大小 以字节为单位表示的 + size_t size; + // 设备 ID,标识容纳该文件的设备。 + device_id_t device_id; + // 文件所有者的 User ID。 + user_id_t user_id; + // 文件的 Group ID + group_id_t group_id; + // 文件的模式(mode),确定了文件的类型,以及它的所有者、它的group、其它用户访问此文件的权限。 + mode_t mode; + // 额外的系统与用户标志(flag),用来保护该文件。 + flag_t flag; + // inode 被修改的时间。 + time_t ctime; + // 文件内容被修改的时间。 + time_t mtime; + // 最后一次访问的时间。 + time_t atime; + // 1个链接数,表示有多少个硬链接指向此inode。 + uint32_t hard_links; + // 到文件系统存储位置的指针。通常是1K字节或者2K字节的存储容量为基本单位。 + void* pointer; + inode_t(void); + ~inode_t(void); + void read(size_t _idx); + void write(size_t _idx); +}; + +/** + * @brief 目录项 directory entry + * 保存在内存中,由内核维护 + */ +class dentry_t { +private: + +protected: + +public: + uint32_t flag; + // 对应的 inode + inode_t* inode; + // 父目录 + dentry_t* parent; + // 子目录 + mystl::list child; + // 文件完整路径 + mystl::string path; + // 文件名 + mystl::string name; + dentry_t(void); + virtual ~dentry_t(void); +}; + +// 实际的文件系统 +class fs_t { +private: + +protected: + +public: + // 文件系统名 + mystl::string name; + // 挂载点目录项 + dentry_t root; + fs_t(void); + virtual ~fs_t(void) = 0; + // 分配 inode + virtual inode_t* alloc_inode(void) = 0; + virtual void dealloc_inode(inode_t* _inode) = 0; +}; + +/** + * @brief 文件抽象 + */ +class file_t { + /// 文件路径 + mystl::string path; + /// 是否为目录 + bool directory; + /// 大小 + uint64_t size; + /// 锁 + // spinlock_t spinlock_tlock; + /// 引用计数 + int ref; // reference count + /// 是否可读 + bool readable; + /// 是否可写 + bool writable; + + /// 文件类型 + enum { + FD_NONE, + FD_PIPE, + FD_ENTRY, + FD_DEVICE, + FD_INODE + } type; + + size_t offset; + uint8_t mode; + + file_t(void) = default; + ~file_t(void) = default; + + /** + * @brief 递增 ref + */ + int dup(void); + + /** + * @brief 递减 ref,当为0时删除它 + */ + int free(void); +}; + +/** + * @brief 虚拟文件系统 + * 所有文件系统由 vfs 统一管理 + * 操作文件时由 vfs 使用实际文件系统进行操作 + */ +class VFS { +private: + /// 管理的文件系统 + mystl::list fs; + /// dentry_t 缓存 + mystl::list dentries; + /// inode_t 缓存 + mystl::list inodes; + /// 当前所在目录 + mystl::string pwd; + /// 查找目录项 + dentry_t* find_dentry(const mystl::string& _path); + /// 新建目录项 + dentry_t* alloc_dentry(const mystl::string& _path, int _flags); + /// 删除目录项 + int dealloc_dentry(const mystl::string& _path); + /// 根据路径判断文件系统 + fs_t* get_fs(const mystl::string& _path); + /// 分配文件描述符 + fd_t alloc_fd(void); + fd_t dealloc_fd(void); + +protected: + +public: + VFS(void); + ~VFS(void); + /** + * @brief 获取单例 + * @return VFS& 静态对象 + */ + static VFS& get_instance(void); + + /** + * @brief 初始化 + * @return true 成功 + * @return false 失败 + * @todo 移动到构造函数去 + */ + bool init(void); + + // 添加一个文件系统 + int32_t register_filesystem(fs_t* _fs); + // 删除一个文件系统 + int32_t unregister_filesystem(fs_t* _fs); + // 文件系统相关 + // 挂载 设备名,挂载路径,文件系统名 + int32_t + mount(const mystl::string& _dev_name, const mystl::string& _path, + const mystl::string& _fs_name, unsigned long flags, void* data); + int32_t umount(void); + int32_t umount2(void); + int32_t sysfs(void); + int32_t statfs(void); + int32_t fstatfs(void); + int32_t fstatfs64(void); + int32_t ustat(void); + // 目录相关 + int32_t chroot(void); + int32_t pivot_root(void); + int32_t chdir(void); + int32_t fchdir(void); + int32_t getcwd(void); + // 创建目录 + int32_t mkdir(const mystl::string& _path, const mode_t& _mode); + // 删除目录及其内容 + int32_t rmdir(const mystl::string& _path); + int32_t getdents(void); + int32_t getdents64(void); + int32_t readdir(void); + int32_t link(void); + int32_t unlink(void); + int32_t rename(void); + int32_t lookup_dcookie(void); + // 链接相关 + int32_t readlink(void); + int32_t symlink(void); + // 文件相关 + int32_t chown(void); + int32_t fchown(void); + int32_t lchown(void); + int32_t chown16(void); + int32_t fchown16(void); + int32_t lchown16(void); + int32_t hmod(void); + int32_t fchmod(void); + int32_t utime(void); + int32_t stat(void); + int32_t fstat(void); + int32_t lstat(void); + int32_t acess(void); + int32_t oldstat(void); + int32_t oldfstat(void); + int32_t oldlstat(void); + int32_t stat64(void); + int32_t lstat64(void); + // 打开文件 + int32_t open(const mystl::string& _path, int _flags); + int32_t close(fd_t _fd); + int32_t creat(void); + int32_t umask(void); + int32_t dup(void); + int32_t dup2(void); + int32_t fcntl(void); + int32_t fcntl64(void); + int32_t select(void); + int32_t poll(void); + int32_t truncate(void); + int32_t ftruncate(void); + int32_t truncate64(void); + int32_t ftruncate64(void); + int32_t lseek(void); + int32_t llseek(void); + int32_t read(fd_t _fd, void* _buf, size_t _count); + int32_t write(fd_t _fd, void* _buf, size_t _count); + int32_t readv(void); + int32_t writev(void); + int32_t sendfile(void); + int32_t sendfile64(void); + int32_t readahead(void); +}; + +#endif /* SIMPLEKERNEL_VFS_H */ diff --git a/src/include/vga.hpp b/src/include/vga.hpp deleted file mode 100644 index 68b806bdf..000000000 --- a/src/include/vga.hpp +++ /dev/null @@ -1,56 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// vga.hpp for MRNIU/SimpleKernel. - -#ifndef _VGA_HPP_ -#define _VGA_HPP_ - -#include "stdint.h" -#include "stddef.h" -#include "port.hpp" - -enum vga_color { - VGA_COLOR_BLACK = 0, - VGA_COLOR_BLUE = 1, - VGA_COLOR_GREEN = 2, - VGA_COLOR_CYAN = 3, - VGA_COLOR_RED = 4, - VGA_COLOR_MAGENTA = 5, - VGA_COLOR_BROWN = 6, - VGA_COLOR_LIGHT_GREY = 7, - VGA_COLOR_DARK_GREY = 8, - VGA_COLOR_LIGHT_BLUE = 9, - VGA_COLOR_LIGHT_GREEN = 10, - VGA_COLOR_LIGHT_CYAN = 11, - VGA_COLOR_LIGHT_RED = 12, - VGA_COLOR_LIGHT_MAGENTA = 13, - VGA_COLOR_LIGHT_BROWN = 14, - VGA_COLOR_WHITE = 15, -}; - -#define VGA_ADDR 0x3D4 // CRT 控制寄存器-地址 -#define VGA_DATA 0x3D5 // CRT 控制寄存器-数据 -#define VGA_CURSOR_H 0xE // 光标高位 -#define VGA_CURSOR_L 0xF // 光标低位 -#define VGA_MEM_BASE 0xB8000 // VGA 缓存基址 -#define VGA_MEM_SIZE 0x8000 // VGA 缓存大小 - -// 规定显示行数、列数 -static const size_t VGA_WIDTH = 80; -static const size_t VGA_HEIGHT = 25; - -// 设置颜色,详解见 '颜色设置与位运算.md' -// fg-font -// bg-back -static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg){ - return fg | (bg << 4); -} - -// uc-字符 -// color-颜色 -static inline uint16_t vga_entry(unsigned char uc, uint8_t color){ - return (uint16_t) uc | (uint16_t) color << 8; -} - -#endif diff --git a/src/kernel.kernel b/src/kernel.kernel deleted file mode 100755 index ee3e501ac..000000000 Binary files a/src/kernel.kernel and /dev/null differ diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt new file mode 100644 index 000000000..8c804efd2 --- /dev/null +++ b/src/kernel/CMakeLists.txt @@ -0,0 +1,25 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. +# 内核子模块的编译规则 + +# 设置子模块名与使用的语言 +PROJECT(kernel CXX) + +# 寻找 CXX 文件 +aux_source_directory(${kernel_SOURCE_DIR}/. kernel_src) + +# 添加子模块 +add_library(${PROJECT_NAME} OBJECT ${kernel_src}) + +# 添加头文件搜索路径 +target_include_arch_header_files(${PROJECT_NAME}) +target_include_kernel_header_files(${PROJECT_NAME}) +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) +target_include_drv_header_files(${PROJECT_NAME}) +target_include_dev_header_files(${PROJECT_NAME}) +target_include_fs_header_files(${PROJECT_NAME}) diff --git a/src/kernel/README.md b/src/kernel/README.md deleted file mode 100644 index 68ed3fab7..000000000 --- a/src/kernel/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# src/kernel/ -## 文件说明 - -- kernel.c - - 内核入口,最高层的封装。 - -- printk.c - - 内核中的格式化输出函数。 diff --git a/src/kernel/allocator.cpp b/src/kernel/allocator.cpp new file mode 100644 index 000000000..40b447b3b --- /dev/null +++ b/src/kernel/allocator.cpp @@ -0,0 +1,34 @@ + +/** + * @file allocator.cpp + * @brief 分配器抽象类实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "allocator.h" +#include "cstddef" +#include "cstdint" + +ALLOCATOR::ALLOCATOR(const char* _name, uintptr_t _addr, size_t _len) { + // 默认名字 + name = _name; + allocator_start_addr = _addr; + allocator_length = _len; + // 初始状态下所有页都未使用 + allocator_free_count = allocator_length; + allocator_used_count = 0; + return; +} + +ALLOCATOR::~ALLOCATOR(void) { + return; +} diff --git a/src/kernel/dev_drv_manager.cpp b/src/kernel/dev_drv_manager.cpp new file mode 100644 index 000000000..fb00c32e1 --- /dev/null +++ b/src/kernel/dev_drv_manager.cpp @@ -0,0 +1,94 @@ + +/** + * @file dev_drv_manager.cpp + * @brief 设备&驱动管理实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#include "dev_drv_manager.h" +#include "boot_info.h" +#include "bus_device.h" +#include "cstdio" +#include "virtio_dev.h" +#include "virtio_mmio_drv.h" + +void DEV_DRV_MANAGER::show(void) const { + info("bus count: 0x%X\n", buss.size()); + for (auto i : buss) { + std::cout << *i << std::endl; + } + return; +} + +DEV_DRV_MANAGER::DEV_DRV_MANAGER(void) { + return; +} + +DEV_DRV_MANAGER::~DEV_DRV_MANAGER(void) { + for (auto i : buss) { + delete i; + } + return; +} + +DEV_DRV_MANAGER& DEV_DRV_MANAGER::get_instance(void) { + /// 定义全局 DEV_DRV_MANAGER 对象 + static DEV_DRV_MANAGER dev_drv_manager; + return dev_drv_manager; +} + +/// @todo 设备管理应该更加抽象,这里只是个勉强能用的 +bool DEV_DRV_MANAGER::init(void) { + // #if defined(__riscv) + // 获取 virtio 设备信息 + resource_t virtio_mmio_dev_resources[8]; + // 获取信息 + auto virtio_mmio_dev_resources_count + = BOOT_INFO::find_via_prefix("virtio_mmio@", virtio_mmio_dev_resources); + // 转换为向量 + auto virtio_mmio_dev_resources_vector + = new mystl::vector(virtio_mmio_dev_resources, + virtio_mmio_dev_resources + + virtio_mmio_dev_resources_count); + // 添加 virtio 总线 + auto bus = new bus_device_t("virtio_mmio_bus"); + add_bus(*bus); + // 每个 resource 对应一个设备 + for (auto i : *virtio_mmio_dev_resources_vector) { + // 设置每个设备的名称与驱动名 + auto virtio_dev = new virtio_device_t(i); + // 添加到总线的设备向量 + bus->add_device(virtio_dev); + } + // 将驱动注册到 bus + register_call_back(bus, virtio_mmio_drv_t::NAME, virtio_mmio_drv_t); + show(); + // #endif + info("device and driver manager init.\n"); + return true; +} + +bool DEV_DRV_MANAGER::add_bus(bus_device_t& _bus) { + buss.push_back(&_bus); + return true; +} + +device_base_t* DEV_DRV_MANAGER::get_dev_via_intr_no(uint8_t _no) { + device_base_t* res = nullptr; + for (auto i : buss) { + res = i->get_dev_via_intr_no(_no); + if (res != nullptr) { + break; + } + } + return res; +} diff --git a/src/kernel/drv/kb.c b/src/kernel/drv/kb.c deleted file mode 100644 index b9a40f706..000000000 --- a/src/kernel/drv/kb.c +++ /dev/null @@ -1,225 +0,0 @@ -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). -// Based on Orange's 一个操作系统的实现 -// kb.c for MRNIU/SimpleKernel. - -#include "drv/keyboard.h" -#include "port.hpp" - -static uint8_t keymap[NR_SCAN_CODES * MAP_COLS] = { -/* scan-code !Shift Shift E0 XX */ -/* ==================================================================== */ -/* 0x00 - none */ 0, 0, 0, -/* 0x01 - ESC */ ESC, ESC, 0, -/* 0x02 - '1' */ '1', '!', 0, -/* 0x03 - '2' */ '2', '@', 0, -/* 0x04 - '3' */ '3', '#', 0, -/* 0x05 - '4' */ '4', '$', 0, -/* 0x06 - '5' */ '5', '%', 0, -/* 0x07 - '6' */ '6', '^', 0, -/* 0x08 - '7' */ '7', '&', 0, -/* 0x09 - '8' */ '8', '*', 0, -/* 0x0A - '9' */ '9', '(', 0, -/* 0x0B - '0' */ '0', ')', 0, -/* 0x0C - '-' */ '-', '_', 0, -/* 0x0D - '=' */ '=', '+', 0, -/* 0x0E - BS */ BACKSPACE, BACKSPACE, 0, -/* 0x0F - TAB */ TAB, TAB, 0, -/* 0x10 - 'q' */ 'q', 'Q', 0, -/* 0x11 - 'w' */ 'w', 'W', 0, -/* 0x12 - 'e' */ 'e', 'E', 0, -/* 0x13 - 'r' */ 'r', 'R', 0, -/* 0x14 - 't' */ 't', 'T', 0, -/* 0x15 - 'y' */ 'y', 'Y', 0, -/* 0x16 - 'u' */ 'u', 'U', 0, -/* 0x17 - 'i' */ 'i', 'I', 0, -/* 0x18 - 'o' */ 'o', 'O', 0, -/* 0x19 - 'p' */ 'p', 'P', 0, -/* 0x1A - '[' */ '[', '{', 0, -/* 0x1B - ']' */ ']', '}', 0, -/* 0x1C - CR/LF */ ENTER, ENTER, PAD_ENTER, -/* 0x1D - l. Ctrl */ CTRL_L, CTRL_L, CTRL_R, -/* 0x1E - 'a' */ 'a', 'A', 0, -/* 0x1F - 's' */ 's', 'S', 0, -/* 0x20 - 'd' */ 'd', 'D', 0, -/* 0x21 - 'f' */ 'f', 'F', 0, -/* 0x22 - 'g' */ 'g', 'G', 0, -/* 0x23 - 'h' */ 'h', 'H', 0, -/* 0x24 - 'j' */ 'j', 'J', 0, -/* 0x25 - 'k' */ 'k', 'K', 0, -/* 0x26 - 'l' */ 'l', 'L', 0, -/* 0x27 - ';' */ ';', ':', 0, -/* 0x28 - '\'' */ '\'', '"', 0, -/* 0x29 - '`' */ '`', '~', 0, -/* 0x2A - l. SHIFT */ SHIFT_L, SHIFT_L, 0, -/* 0x2B - '\' */ '\\', '|', 0, -/* 0x2C - 'z' */ 'z', 'Z', 0, -/* 0x2D - 'x' */ 'x', 'X', 0, -/* 0x2E - 'c' */ 'c', 'C', 0, -/* 0x2F - 'v' */ 'v', 'V', 0, -/* 0x30 - 'b' */ 'b', 'B', 0, -/* 0x31 - 'n' */ 'n', 'N', 0, -/* 0x32 - 'm' */ 'm', 'M', 0, -/* 0x33 - ',' */ ',', '<', 0, -/* 0x34 - '.' */ '.', '>', 0, -/* 0x35 - '/' */ '/', '?', PAD_SLASH, -/* 0x36 - r. SHIFT */ SHIFT_R, SHIFT_R, 0, -/* 0x37 - '*' */ '*', '*', 0, -/* 0x38 - ALT */ ALT_L, ALT_L, ALT_R, -/* 0x39 - ' ' */ ' ', ' ', 0, -/* 0x3A - CapsLock */ CAPS_LOCK, CAPS_LOCK, 0, -/* 0x3B - F1 */ F1, F1, 0, -/* 0x3C - F2 */ F2, F2, 0, -/* 0x3D - F3 */ F3, F3, 0, -/* 0x3E - F4 */ F4, F4, 0, -/* 0x3F - F5 */ F5, F5, 0, -/* 0x40 - F6 */ F6, F6, 0, -/* 0x41 - F7 */ F7, F7, 0, -/* 0x42 - F8 */ F8, F8, 0, -/* 0x43 - F9 */ F9, F9, 0, -/* 0x44 - F10 */ F10, F10, 0, -/* 0x45 - NumLock */ NUM_LOCK, NUM_LOCK, 0, -/* 0x46 - ScrLock */ SCROLL_LOCK, SCROLL_LOCK, 0, -/* 0x47 - Home */ PAD_HOME, '7', HOME, -/* 0x48 - CurUp */ PAD_UP, '8', UP, -/* 0x49 - PgUp */ PAD_PAGEUP, '9', PAGEUP, -/* 0x4A - '-' */ PAD_MINUS, '-', 0, -/* 0x4B - Left */ PAD_LEFT, '4', LEFT, -/* 0x4C - MID */ PAD_MID, '5', 0, -/* 0x4D - Right */ PAD_RIGHT, '6', RIGHT, -/* 0x4E - '+' */ PAD_PLUS, '+', 0, -/* 0x4F - End */ PAD_END, '1', END, -/* 0x50 - Down */ PAD_DOWN, '2', DOWN, -/* 0x51 - PgDown */ PAD_PAGEDOWN, '3', PAGEDOWN, -/* 0x52 - Insert */ PAD_INS, '0', INSERT, -/* 0x53 - Delete */ PAD_DOT, '.', DELETE, -/* 0x54 - Enter */ 0, 0, 0, -/* 0x55 - ??? */ 0, 0, 0, -/* 0x56 - ??? */ 0, 0, 0, -/* 0x57 - F11 */ F11, F11, 0, -/* 0x58 - F12 */ F12, F12, 0, -/* 0x59 - ??? */ 0, 0, 0, -/* 0x5A - ??? */ 0, 0, 0, -/* 0x5B - ??? */ 0, 0, GUI_L, -/* 0x5C - ??? */ 0, 0, GUI_R, -/* 0x5D - ??? */ 0, 0, APPS, -/* 0x5E - ??? */ 0, 0, 0, -/* 0x5F - ??? */ 0, 0, 0, -/* 0x60 - ??? */ 0, 0, 0, -/* 0x61 - ??? */ 0, 0, 0, -/* 0x62 - ??? */ 0, 0, 0, -/* 0x63 - ??? */ 0, 0, 0, -/* 0x64 - ??? */ 0, 0, 0, -/* 0x65 - ??? */ 0, 0, 0, -/* 0x66 - ??? */ 0, 0, 0, -/* 0x67 - ??? */ 0, 0, 0, -/* 0x68 - ??? */ 0, 0, 0, -/* 0x69 - ??? */ 0, 0, 0, -/* 0x6A - ??? */ 0, 0, 0, -/* 0x6B - ??? */ 0, 0, 0, -/* 0x6C - ??? */ 0, 0, 0, -/* 0x6D - ??? */ 0, 0, 0, -/* 0x6E - ??? */ 0, 0, 0, -/* 0x6F - ??? */ 0, 0, 0, -/* 0x70 - ??? */ 0, 0, 0, -/* 0x71 - ??? */ 0, 0, 0, -/* 0x72 - ??? */ 0, 0, 0, -/* 0x73 - ??? */ 0, 0, 0, -/* 0x74 - ??? */ 0, 0, 0, -/* 0x75 - ??? */ 0, 0, 0, -/* 0x76 - ??? */ 0, 0, 0, -/* 0x77 - ??? */ 0, 0, 0, -/* 0x78 - ??? */ 0, 0, 0, -/* 0x78 - ??? */ 0, 0, 0, -/* 0x7A - ??? */ 0, 0, 0, -/* 0x7B - ??? */ 0, 0, 0, -/* 0x7C - ??? */ 0, 0, 0, -/* 0x7D - ??? */ 0, 0, 0, -/* 0x7E - ??? */ 0, 0, 0, -/* 0x7F - ??? */ 0, 0, 0 -}; - -#define SC_MAX NR_SCAN_CODES * MAP_COLS - -static bool shift=false; -static bool caps=false; -static bool ctrl=false; -static bool num=true; -static bool alt=false; - -// 改进方向: -// 将输入输出与 tty 结合起来 -// 维护一个保存 tty 信息的结构体,包括 缓冲区信息,sh 设置,颜色等 - - -void keyboard_handler(pt_regs_t * regs){ - uint8_t scancode = inb(KB_DATA); // 获取一个扫描码 - // 判断是否出错 - if(scancode>SC_MAX||scancode<0) { - printk_color(red, "scancode error.\n"); - return; - } - uint8_t letter=NULL; - uint8_t str[2]={NULL}; // 在 default 中用到 - // 开始处理 - switch (scancode) { - // 如果是特殊字符,则单独处理 - case KB_SHIFT_L: - shift = true; - break; - case KB_SHIFT_L|RELEASED_MASK: // 扫描码 + 0x80 即为松开的编码 - shift = false; - break; - case KB_SHIFT_R: - shift = true; - break; - case KB_SHIFT_R|RELEASED_MASK: - shift = false; - break; - case KB_CTRL_L: - ctrl = true; - break; - case KB_CTRL_L|RELEASED_MASK: - ctrl = false; - break; - case KB_ALT_L: - alt = true; - break; - case KB_ALT_L|RELEASED_MASK: - alt = false; - break; - case KB_CAPS_LOCK: - caps = ((~caps)&0x01); // 与上次按下的状态相反 - break; - case KB_NUM_LOCK: - num = ((~num)&0x01); - break; - case KB_BACKSPACE: - printk("\b"); - break; - case KB_ENTER: - printk("\n"); - break; - case KB_TAB: - printk("\t"); - break; - default: // 一般字符输出 - // 首先排除释放按键 - if(!(scancode&RELEASED_MASK)) { - letter = keymap[(uint8_t)(scancode*3)+(uint8_t)shift]; // 计算在 keymap 中的位置 - // printk_color(green, "%s\t", letter); - str[0]=letter; - str[1]='\0'; - printk("%s", str); - break; - } else { - break; - } - } - UNUSED(regs); -} - -void keyboard_init(void){ - printk("kb init\n"); - register_interrupt_handler(IRQ1, &keyboard_handler); - enable_irq(IRQ1); -} diff --git a/src/kernel/drv/mouse.c b/src/kernel/drv/mouse.c deleted file mode 100644 index 533bdad37..000000000 --- a/src/kernel/drv/mouse.c +++ /dev/null @@ -1,6 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// mouse.c for MRNIU/SimpleKernel. -#include "drv/mouse.h" -#include "port.hpp" diff --git a/src/kernel/firstfit.cpp b/src/kernel/firstfit.cpp new file mode 100644 index 000000000..9b97f06b5 --- /dev/null +++ b/src/kernel/firstfit.cpp @@ -0,0 +1,145 @@ + +/** + * @file firstfit.cpp + * @brief firstfit 内存分配器实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "firstfit.h" +#include "common.h" +#include "cstdint" +#include "cstdio" +#include "cstring" + +void FIRSTFIT::set(size_t _idx) { + map[_idx >> SHIFT] |= (uintptr_t)1 << (_idx & MASK); + return; +} + +void FIRSTFIT::clr(size_t _idx) { + map[_idx >> SHIFT] &= ~((uintptr_t)1 << (_idx & MASK)); + return; +} + +bool FIRSTFIT::test(size_t _idx) const { + return map[_idx >> SHIFT] & ((uintptr_t)1 << (_idx & MASK)); +} + +size_t FIRSTFIT::find_len(size_t _len, bool _val) const { + size_t count = 0; + size_t idx = 0; + // 遍历位图 + for (uintptr_t i = 0; i < allocator_length; i++) { + if (test(i) != _val) { + count = 0; + idx = i + 1; + } + else { + count++; + } + if (count == _len) { + return idx; + } + } + return ~(size_t)0; +} + +FIRSTFIT::FIRSTFIT(const char* _name, uintptr_t _addr, size_t _len) + : ALLOCATOR(_name, _addr, _len) { + // 所有清零 + bzero(map, sizeof(map)); + info("%s: 0x%p(0x%X pages) init.\n", name, allocator_start_addr, + allocator_length); + return; +} + +FIRSTFIT::~FIRSTFIT(void) { + info("%s finit.\n", name); + return; +} + +uintptr_t FIRSTFIT::alloc(size_t _len) { + uintptr_t res_addr = 0; + // 在位图中寻找连续 _len 的位置 + size_t idx = find_len(_len, false); + // 如果为 ~0 说明未找到 + if (idx == ~(size_t)0) { + // err("NO ENOUGH MEM.\n"); + return res_addr; + } + // 遍历区域 + for (auto i = idx; i < idx + _len; i++) { + // 置位,说明已使用 + set(i); + } + // 计算实际地址 + // 分配器起始地址+页长度*第几页 + res_addr = allocator_start_addr + (COMMON::PAGE_SIZE * idx); + // 更新统计信息 + allocator_free_count -= _len; + allocator_used_count += _len; + return res_addr; +} + +bool FIRSTFIT::alloc(uintptr_t _addr, size_t _len) { + // _addr 不在管理范围内 + if ((_addr < allocator_start_addr) + || (_addr + >= allocator_start_addr + allocator_length * COMMON::PAGE_SIZE)) { + return false; + } + // 计算 _addr 在 map 中的索引 + size_t idx = (_addr - allocator_start_addr) / COMMON::PAGE_SIZE; + // 遍历 + for (auto i = idx; i < idx + _len; i++) { + // 如果在范围内有已经分配的内存,返回 false + if (test(i) == true) { + return false; + } + } + // 到这里说明范围内没有已使用内存 + // 再次遍历 + for (auto i = idx; i < idx + _len; i++) { + // 置位 + set(i); + } + // 更新统计信息 + allocator_free_count -= _len; + allocator_used_count += _len; + return true; +} + +void FIRSTFIT::free(uintptr_t _addr, size_t _len) { + // _addr 不在管理范围内 + if ((_addr < allocator_start_addr) + || (_addr + >= allocator_start_addr + allocator_length * COMMON::PAGE_SIZE)) { + return; + } + // 计算 _addr 在 map 中的索引 + size_t idx = (_addr - allocator_start_addr) / COMMON::PAGE_SIZE; + for (auto i = idx; i < idx + _len; i++) { + clr(i); + } + // 更新统计信息 + allocator_free_count += _len; + allocator_used_count -= _len; + return; +} + +size_t FIRSTFIT::get_used_count(void) const { + return allocator_used_count; +} + +size_t FIRSTFIT::get_free_count(void) const { + return allocator_free_count; +} diff --git a/src/kernel/heap.cpp b/src/kernel/heap.cpp new file mode 100644 index 000000000..dfbb6a156 --- /dev/null +++ b/src/kernel/heap.cpp @@ -0,0 +1,102 @@ + +/** + * @file heap.cpp + * @brief 堆抽象头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "heap.h" +#include "common.h" +#include "cstdio" +#include "pmm.h" + +HEAP& HEAP::get_instance(void) { + /// 定义全局 HEAP 对象 + static HEAP heap; + return heap; +} + +bool HEAP::init(void) { + // 内核空间 + static SLAB slab_allocator_kernel( + "SLAB Allocator Kernel", PMM::get_instance().get_kernel_space_start(), + PMM::get_instance().get_kernel_space_length() * COMMON::PAGE_SIZE, true); + allocator_kernel = (ALLOCATOR*)&slab_allocator_kernel; + // 非内核空间 + static SLAB slab_allocator_non_kernel( + "SLAB Allocator", PMM::get_instance().get_non_kernel_space_start(), + PMM::get_instance().get_non_kernel_space_length() * COMMON::PAGE_SIZE, + false); + allocator_non_kernel = (ALLOCATOR*)&slab_allocator_non_kernel; + info("heap init.\n"); + return 0; +} + +void* HEAP::kmalloc(size_t _byte) { + void* ret = nullptr; + ret = (void*)allocator_kernel->alloc(_byte); + return ret; +} + +void HEAP::kfree(void* _addr) { + // 堆不需要 _len 参数 + allocator_kernel->free((uintptr_t)_addr, 0); + return; +} + +void* HEAP::malloc(size_t _byte) { + void* ret = nullptr; + ret = (void*)allocator_non_kernel->alloc(_byte); + return ret; +} + +void HEAP::free(void* _addr) { + // 堆不需要 _len 参数 + allocator_non_kernel->free((uintptr_t)_addr, 0); + return; +} + +/** + * @brief 分配内核空间内存 + * @param _size 要申请的 bytes + * @return void* 申请到的地址 + */ +extern "C" void* kmalloc(size_t _size) { + return (void*)HEAP::get_instance().kmalloc(_size); +} + +/** + * @brief 释放内核空间内存 + * @param _p 要释放的内存地址 + */ +extern "C" void kfree(void* _p) { + HEAP::get_instance().kfree(_p); + return; +} + +/** + * @brief malloc 定义 + * @param _size 要申请的 bytes + * @return void* 申请到的地址 + */ +extern "C" void* malloc(size_t _size) { + return (void*)HEAP::get_instance().malloc(_size); +} + +/** + * @brief free 定义 + * @param _p 要释放的内存地址 + */ +extern "C" void free(void* _p) { + HEAP::get_instance().free(_p); + return; +} diff --git a/src/kernel/include/dev_drv_manager.h b/src/kernel/include/dev_drv_manager.h new file mode 100644 index 000000000..ce4c1635a --- /dev/null +++ b/src/kernel/include/dev_drv_manager.h @@ -0,0 +1,84 @@ + +/** + * @file dev_drv_manager.h + * @brief 设备&驱动管理头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-12-01MRNIU迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_DEV_DRV_MANAGER_H +#define SIMPLEKERNEL_DEV_DRV_MANAGER_H + +#include "bus_device.h" +#include "cstdint" +#include "device_base.h" +#include "driver_base.h" +#include "string" +#include "vector" + +/** + * @brief 设备&驱动管理 + */ +class DEV_DRV_MANAGER { +private: + /** + * @brief 总线向量 + */ + mystl::vector buss; + + /** + * @brief 输出总线列表 + */ + void show(void) const; + +protected: + +public: + /** + * @brief 构造函数 + */ + DEV_DRV_MANAGER(void); + + /** + * @brief 析构函数 + */ + ~DEV_DRV_MANAGER(void); + + /** + * @brief 获取单例 + * @return DEV_DRV_MANAGER& 静态对象 + */ + static DEV_DRV_MANAGER& get_instance(void); + + /** + * @brief 初始化 + * @return true 成功 + * @return false 失败 + */ + bool init(void); + + /** + * @brief 添加总线 + * @param _bus 要添加的总线 + * @return true 成功 + * @return false 失败 + */ + bool add_bus(bus_device_t& _bus); + + /** + * @brief 通过外部中断号寻找设备 + * @param _no 外部中断号 + * @return device_base_t* 使用该中断号的设备 + */ + device_base_t* get_dev_via_intr_no(uint8_t _no); +}; + +#endif /* SIMPLEKERNEL_DEV_DRV_MANAGER_H */ diff --git a/src/kernel/include/kernel.h b/src/kernel/include/kernel.h new file mode 100644 index 000000000..60e8c4782 --- /dev/null +++ b/src/kernel/include/kernel.h @@ -0,0 +1,73 @@ + +/** + * @file kernel.h + * @brief 内核头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_KERNEL_H +#define SIMPLEKERNEL_KERNEL_H + +/** + * @brief 声明 kernel_main 用 C 方法编译 + * @note 这个函数不会返回 + */ +extern "C" void kernel_main(void); + +/** + * @brief 物理内存测试函数 + * @return int 0 成功 + */ +int test_pmm(void); + +/** + * @brief 虚拟内存测试函数 + * @return int 0 成功 + */ +int test_vmm(void); + +/** + * @brief 堆测试函数 + * @return int 0 成功 + */ +int test_heap(void); + +/** + * @brief 中断测试函数 + * @return int 0 成功 + */ +int test_intr(void); + +/** + * @brief 设备测试函数 + * @return int 0 成功 + */ +int test_device(void); + +/** + * @brief fatfs 测试函数 + * @return int 0 成功 + */ +int test_fatfs(void); + +/** + * @brief 虚拟文件系统测试函数 + * @return int 0 成功 + */ +int test_vfs(void); + +/** + * @brief 输出系统信息 + */ +void show_info(void); + +#endif /* SIMPLEKERNEL_KERNEL_H */ diff --git a/src/kernel/io.cpp b/src/kernel/io.cpp new file mode 100644 index 000000000..66ad0d6e6 --- /dev/null +++ b/src/kernel/io.cpp @@ -0,0 +1,191 @@ + +/** + * @file io.cpp + * @brief IO 接口实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "cstdarg" +#include "cstring" +#ifndef __riscv +# include "port.h" +#endif +#include "cstdio" +#include "io.h" + +IO& IO::get_instance(void) { + /// 定义全局 IO 对象 + static IO io; + return io; +} + +// riscv 没有端口 IO +#ifndef __riscv +uint8_t IO::inb(const uint32_t port) { + return PORT::inb(port); +} + +uint16_t IO::inw(const uint32_t port) { + return PORT::inw(port); +} + +uint32_t IO::ind(const uint32_t port) { + return PORT::ind(port); +} + +void IO::outb(const uint32_t port, const uint8_t data) { + PORT::outb(port, data); + return; +} + +void IO::outw(const uint32_t port, const uint16_t data) { + PORT::outw(port, data); + return; +} + +void IO::outd(const uint32_t port, const uint32_t data) { + PORT::outd(port, data); + return; +} +#endif + +// MMIO 实现 +uint8_t IO::read8(void* _addr) { + return *(uint8_t*)_addr; +} + +void IO::write8(void* _addr, uint8_t _val) { + *(uint8_t*)_addr = _val; + return; +} + +uint16_t IO::read16(void* _addr) { + return *(uint16_t*)_addr; +} + +void IO::write16(void* _addr, uint16_t _val) { + *(uint16_t*)_addr = _val; + return; +} + +uint32_t IO::read32(void* _addr) { + return *(uint32_t*)_addr; +} + +void IO::write32(void* _addr, uint32_t _val) { + *(uint32_t*)_addr = _val; + return; +} + +uint64_t IO::read64(void* _addr) { + return *(uint64_t*)_addr; +} + +void IO::write64(void* _addr, uint64_t _val) { + *(uint64_t*)_addr = _val; + return; +} + +COLOR::color_t IO::get_color(void) { + // 通过对应的 io 方式获取颜色 + return io.get_color(); +} + +void IO::set_color(const COLOR::color_t color) { + // 通过对应的 io 方式设置颜色 + io.set_color(color); + return; +} + +void IO::put_char(char c) { + // 通过对应的 io 方式输出字符 + io.put_char(c); + return; +} + +int32_t IO::write_string(const char* s) { + io.write_string(s); + return 0; +} + +/// 输出缓冲区 +char buf[IO::BUF_SIZE]; + +/** + * @brief printf 定义 + * @param _fmt 格式化字符串 + * @return int32_t 输出的长度 + */ +extern "C" int32_t printf(const char* _fmt, ...) { + va_list va; + va_start(va, _fmt); + // 交给 src/libc/src/stdio/vsprintf.c 中的 _vsnprintf + // 处理格式,并将处理好的字符串保存到 buf 中 + const int ret = _vsnprintf(buf, IO::BUF_SIZE, _fmt, va); + va_end(va); + // 输出 buf + IO::get_instance().write_string(buf); + // 清空数据 + bzero(buf, IO::BUF_SIZE); + return ret; +} + +/** + * @brief 与 printf 类似,只是颜色不同 + */ +extern "C" int32_t info(const char* _fmt, ...) { + COLOR::color_t curr_color = IO::get_instance().get_color(); + IO::get_instance().set_color(COLOR::CYAN); + va_list va; + int32_t i; + va_start(va, _fmt); + i = vsnprintf_(buf, IO::BUF_SIZE, _fmt, va); + va_end(va); + IO::get_instance().write_string(buf); + bzero(buf, IO::BUF_SIZE); + IO::get_instance().set_color(curr_color); + return i; +} + +/** + * @brief 与 printf 类似,只是颜色不同 + */ +extern "C" int32_t warn(const char* _fmt, ...) { + COLOR::color_t curr_color = IO::get_instance().get_color(); + IO::get_instance().set_color(COLOR::YELLOW); + va_list va; + int32_t i; + va_start(va, _fmt); + i = vsnprintf_(buf, IO::BUF_SIZE, _fmt, va); + va_end(va); + IO::get_instance().write_string(buf); + bzero(buf, IO::BUF_SIZE); + IO::get_instance().set_color(curr_color); + return i; +} + +/** + * @brief 与 printf 类似,只是颜色不同 + */ +extern "C" int32_t err(const char* _fmt, ...) { + COLOR::color_t curr_color = IO::get_instance().get_color(); + IO::get_instance().set_color(COLOR::LIGHT_RED); + va_list va; + int32_t i; + va_start(va, _fmt); + i = vsnprintf_(buf, IO::BUF_SIZE, _fmt, va); + va_end(va); + IO::get_instance().write_string(buf); + bzero(buf, IO::BUF_SIZE); + IO::get_instance().set_color(curr_color); + return i; +} diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c deleted file mode 100644 index b0c92d84c..000000000 --- a/src/kernel/kernel.c +++ /dev/null @@ -1,33 +0,0 @@ - -// This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -// kernel.c for MRNIU/SimpleKernel. - -#include "kernel.h" -#include "assert.h" - - -// 内核入口 -// magic 魔数 addr multiboot 结构体的地址 -void kernel_main(uint32_t magic, uint32_t addr); -void kernel_main(uint32_t magic, uint32_t addr) { - // multiboot_info_t * mboot_ptr = (multiboot_info_t *)addr; - // 系统初始化 - // debug_init(magic, mboot_ptr); - terminal_init(); // 控制台初始化 - gdt_init(); // GDT 初始化 - idt_init(); // IDT 初始化 - clock_init(); // 时钟初始化 - keyboard_init(); // 键盘初始化 - showinfo(); - // debug_init(magic, mboot_ptr); - - - - while(1); - - printk_color(red, "\nEnd.\n"); - return; - - -} diff --git a/src/kernel/kernel_main.cpp b/src/kernel/kernel_main.cpp new file mode 100644 index 000000000..291551aa0 --- /dev/null +++ b/src/kernel/kernel_main.cpp @@ -0,0 +1,104 @@ + +/** + * @file kernel_main.cpp + * @brief 内核主要逻辑 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "boot_info.h" +#include "cassert" +#include "common.h" +#include "cpu.hpp" +#include "cstdio" +#include "cstdlib" +#include "dev_drv_manager.h" +#include "heap.h" +#include "intr.h" +#include "iostream" +#include "kernel.h" +#include "pmm.h" +#include "vfs.h" +#include "vmm.h" + +#include "ff.h" + +/** + * @brief 内核主要逻辑 + * @note 这个函数不会返回 + */ +void kernel_main(void) { + // 初始化 + BOOT_INFO::init(); + // 物理内存初始化 + PMM::get_instance().init(); + // 测试物理内存 + test_pmm(); + // 虚拟内存初始化 + /// @todo 将vmm的初始化放在构造函数里,这里只做开启分页 + VMM::get_instance().init(); + // 测试虚拟内存 + test_vmm(); + // 堆初始化 + HEAP::get_instance().init(); + // 测试堆 + test_heap(); + // 中断初始化 + INTR::get_instance().init(); + // 测试中断 + test_intr(); + // 时钟中断初始化 + TIMER::get_instance().init(); + // 初始化设备 + DEV_DRV_MANAGER::get_instance().init(); + // 初始化文件系统 + VFS::get_instance().init(); + + // 允许中断 + CPU::ENABLE_INTR(); + + // 测试设备 + test_device(); + // 测试文件系统 + test_fatfs(); + // test_vfs(); + + // 显示基本信息 + show_info(); + // 进入死循环 + while (1) { + ; + } + // 不应该执行到这里 + assert(0); + return; +} + +/** + * @brief 输出系统信息 + */ +void show_info(void) { + // 内核实际大小 + auto kernel_size = COMMON::KERNEL_END_ADDR - COMMON::KERNEL_START_ADDR; + // 内核实际占用页数 + auto kernel_pages + = (COMMON::ALIGN(COMMON::KERNEL_END_ADDR, COMMON::PAGE_SIZE) + - COMMON::ALIGN(COMMON::KERNEL_START_ADDR, COMMON::PAGE_SIZE)) + / COMMON::PAGE_SIZE; + info("Kernel start: 0x%p, end 0x%p, size: 0x%X bytes, 0x%X pages.\n", + COMMON::KERNEL_START_ADDR, COMMON::KERNEL_END_ADDR, kernel_size, + kernel_pages); + info("Kernel start4k: 0x%p, end4k: 0x%p.\n", + COMMON::ALIGN(COMMON::KERNEL_START_ADDR, 4 * COMMON::KB), + COMMON::ALIGN(COMMON::KERNEL_END_ADDR, 4 * COMMON::KB)); + std::cout << "Simple Kernel." << std::endl; + return; +} diff --git a/src/kernel/pmm.cpp b/src/kernel/pmm.cpp new file mode 100644 index 000000000..8225724ad --- /dev/null +++ b/src/kernel/pmm.cpp @@ -0,0 +1,193 @@ + +/** + * @file pmm.cpp + * @brief 物理内存管理实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "pmm.h" +#include "boot_info.h" +#include "cassert" +#include "common.h" +#include "cstdio" +#include "cstring" +#include "resource.h" + +// 将启动信息移动到内核空间 +void PMM::move_boot_info(void) { + // 计算 multiboot2 信息需要多少页 + size_t pages = BOOT_INFO::boot_info_size / COMMON::PAGE_SIZE; + if (BOOT_INFO::boot_info_size % COMMON::PAGE_SIZE != 0) { + pages++; + } + // 申请空间 + uintptr_t new_addr = get_instance().alloc_pages_kernel(pages); + // 复制过来,完成后以前的内存就可以使用了 + memcpy((void*)new_addr, (void*)BOOT_INFO::boot_info_addr, + pages * COMMON::PAGE_SIZE); + // 设置地址 + BOOT_INFO::boot_info_addr = (uintptr_t)new_addr; + // 重新初始化 + BOOT_INFO::init(); + return; +} + +PMM& PMM::get_instance(void) { + /// 定义全局 PMM 对象 + static PMM pmm; + return pmm; +} + +bool PMM::init(void) { + // 获取物理内存信息 + resource_t mem_info = BOOT_INFO::get_memory(); + // 设置物理地址的起点与长度 + start = mem_info.mem.addr; + length = mem_info.mem.len; + // 计算页数 + total_pages = length / COMMON::PAGE_SIZE; + // 内核空间地址开始 + kernel_space_start = COMMON::KERNEL_START_ADDR; + // 长度手动指定 + kernel_space_length = COMMON::KERNEL_SPACE_SIZE; + // 非内核空间在内核空间结束后 + non_kernel_space_start + = COMMON::KERNEL_START_ADDR + COMMON::KERNEL_SPACE_SIZE; + // 长度为总长度减去内核长度 + non_kernel_space_length = length - kernel_space_length; + + // 创建分配器 + // 内核空间 + static FIRSTFIT first_fit_allocator_kernel( + "First Fit Allocator(kernel space)", kernel_space_start, + kernel_space_length / COMMON::PAGE_SIZE); + kernel_space_allocator = (ALLOCATOR*)&first_fit_allocator_kernel; + // 非内核空间 + static FIRSTFIT first_fit_allocator("First Fit Allocator", + non_kernel_space_start, + non_kernel_space_length + / COMMON::PAGE_SIZE); + allocator = (ALLOCATOR*)&first_fit_allocator; + + // 内核实际占用页数 这里也算了 0~1M 的 reserved 内存 + size_t kernel_pages + = (COMMON::ALIGN(COMMON::KERNEL_END_ADDR, COMMON::PAGE_SIZE) + - COMMON::ALIGN(COMMON::KERNEL_START_ADDR, COMMON::PAGE_SIZE)) + / COMMON::PAGE_SIZE; + // 将内核已使用部分划分出来 + if (alloc_pages_kernel(COMMON::KERNEL_START_ADDR, kernel_pages) == true) { + // 将 multiboot2/dtb 信息移动到内核空间 + move_boot_info(); + info("pmm init.\n"); + return true; + } + else { + assert(0); + return false; + } +} + +size_t PMM::get_pmm_length(void) const { + return length; +} + +uintptr_t PMM::get_kernel_space_start(void) const { + return kernel_space_start; +} + +size_t PMM::get_kernel_space_length(void) const { + return kernel_space_length; +} + +uintptr_t PMM::get_non_kernel_space_start(void) const { + return non_kernel_space_start; +} + +size_t PMM::get_non_kernel_space_length(void) const { + return non_kernel_space_length; +} + +size_t PMM::get_used_pages_count(void) const { + size_t ret + = kernel_space_allocator->get_used_count() + allocator->get_used_count(); + return ret; +} + +size_t PMM::get_free_pages_count(void) const { + size_t ret + = kernel_space_allocator->get_free_count() + allocator->get_free_count(); + return ret; +} + +uintptr_t PMM::alloc_page(void) { + uintptr_t ret = allocator->alloc(1); + return ret; +} + +uintptr_t PMM::alloc_pages(size_t _len) { + uintptr_t ret = allocator->alloc(_len); + return ret; +} + +bool PMM::alloc_pages(uintptr_t _addr, size_t _len) { + bool ret = allocator->alloc(_addr, _len); + return ret; +} + +uintptr_t PMM::alloc_page_kernel(void) { + uintptr_t ret = kernel_space_allocator->alloc(1); + return ret; +} + +uintptr_t PMM::alloc_pages_kernel(size_t _len) { + uintptr_t ret = kernel_space_allocator->alloc(_len); + return ret; +} + +bool PMM::alloc_pages_kernel(uintptr_t _addr, size_t _len) { + bool ret = kernel_space_allocator->alloc(_addr, _len); + return ret; +} + +void PMM::free_page(uintptr_t _addr) { + // 判断应该使用哪个分配器 + if (_addr >= kernel_space_start + && _addr < kernel_space_start + kernel_space_length) { + kernel_space_allocator->free(_addr, 1); + } + else if (_addr >= non_kernel_space_start + && _addr < non_kernel_space_start + non_kernel_space_length) { + allocator->free(_addr, 1); + } + else { + // 如果都不是说明有问题 + assert(0); + } + return; +} + +void PMM::free_pages(uintptr_t _addr, size_t _len) { + // 判断应该使用哪个分配器 + if (_addr >= kernel_space_start + && _addr < kernel_space_start + kernel_space_length) { + kernel_space_allocator->free(_addr, _len); + } + else if (_addr >= non_kernel_space_start + && _addr < non_kernel_space_start + non_kernel_space_length) { + allocator->free(_addr, _len); + } + // 如果都不是说明有问题 + else { + assert(0); + } + return; +} diff --git a/src/kernel/slab.cpp b/src/kernel/slab.cpp new file mode 100644 index 000000000..dfa5e877f --- /dev/null +++ b/src/kernel/slab.cpp @@ -0,0 +1,423 @@ + +/** + * @file slab.cpp + * @brief slab 分配器 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "slab.h" +#include "cassert" +#include "cstdio" +#include "pmm.h" +#include "string.h" +#include "vmm.h" + +SLAB::chunk_t::chunk_t(void) { + addr = HEAD; + len = HEAD; + prev = this; + next = this; + return; +} + +SLAB::chunk_t::~chunk_t(void) { + return; +} + +size_t SLAB::chunk_t::size(void) const { + size_t res = 0; + chunk_t* tmp = this->next; + while (tmp != this) { + res++; + tmp = tmp->next; + } + return res; +} + +bool SLAB::chunk_t::operator==(const chunk_t& _node) const { + return addr == _node.addr && len == _node.len && prev == _node.prev + && next == _node.next; +} + +bool SLAB::chunk_t::operator!=(const chunk_t& _node) const { + return addr != _node.addr || len != _node.len || prev != _node.prev + || next != _node.next; +} + +SLAB::chunk_t& SLAB::chunk_t::operator[](size_t _idx) const { + // 判断越界 + assert(_idx < size()); + const chunk_t* res = nullptr; + // 找到头节点 + const chunk_t* tmp = this; + while (tmp->next != this) { + if (tmp->addr == HEAD && tmp->len == HEAD) { + res = tmp; + break; + } + tmp = tmp->next; + } + // 返回第 _idx 个节点 + for (size_t i = 0; i < _idx; i++) { + res = res->next; + } + // res 必不为空 + assert(res != nullptr); + return *(const_cast(res)); +} + +// 由于是循环队列,相当于在头节点前面插入 +void SLAB::chunk_t::push_back(chunk_t* _new_node) { + _new_node->next = this; + _new_node->prev = prev; + prev->next = _new_node; + prev = _new_node; + return; +} + +void SLAB::slab_cache_t::move(chunk_t& _list, chunk_t* _node) { + // 从当前链表中删除 + _node->prev->next = _node->next; + _node->next->prev = _node->prev; + // 重置指针 + _node->prev = _node; + _node->next = _node; + // 插入新链表 + _list.push_back(_node); + return; +} + +SLAB::chunk_t* SLAB::slab_cache_t::alloc_pmm(size_t _len) { + // 计算页数 + size_t pages = _len / COMMON::PAGE_SIZE; + if (_len % COMMON::PAGE_SIZE != 0) { + pages += 1; + } + // 申请 + chunk_t* new_node = nullptr; + if (is_kernel_space == true) { + new_node = (chunk_t*)PMM::get_instance().alloc_pages_kernel(pages); + } + else { + new_node = (chunk_t*)PMM::get_instance().alloc_pages(pages); + } + // 如果没有映射则进行映射 + uintptr_t tmp = 0; + for (size_t i = 0; i < pages; i++) { + // 地址=初始地址+页数偏移 + tmp = (uintptr_t)((uint8_t*)new_node + i * COMMON::PAGE_SIZE); + if ((VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), tmp, 0) + == false) + || (is_kernel_space)) { + if (is_kernel_space == true) { + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), + (uintptr_t)new_node, + (uintptr_t)new_node, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + } + else { + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), + (uintptr_t)new_node, + (uintptr_t)new_node, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE + | VMM_PAGE_USER); + } + } + // 已经映射的情况是不应该出现的 + else { + assert(0); + } + } + // 不为空的话进行初始化 + if (new_node != nullptr) { + // 初始化 + // 自身的地址 + new_node->addr = (uintptr_t)new_node; + // 长度需要减去 chunk_t 的长度 + new_node->len = (pages * COMMON::PAGE_SIZE) - CHUNK_SIZE; + // 链表指针 + new_node->prev = new_node; + new_node->next = new_node; + // 加入 free 链表 + free.push_back(new_node); + } + return new_node; +} + +void SLAB::slab_cache_t::free_pmm(void) { + size_t pages = 0; + // 遍历 free 链表 + chunk_t* tmp = free.next; + while (tmp != &free) { + pages = (tmp->len + CHUNK_SIZE) / COMMON::PAGE_SIZE; + // 必须是整数个页 + assert(((tmp->len + CHUNK_SIZE) % COMMON::PAGE_SIZE) == 0); + PMM::get_instance().free_pages(tmp->addr, pages); + // 删除节点 + tmp->prev->next = tmp->next; + tmp->next->prev = tmp->prev; + // 取消映射后无法访问 tmp,所以提前保存 + auto tmp_next = tmp->next; + // 取消映射 + // 因为每次只能取消映射 1 页,所以需要循环 + uintptr_t tmp_addr = 0; + for (size_t i = 0; i < pages; i++) { + tmp_addr = tmp->addr + i * COMMON::PAGE_SIZE; + VMM::get_instance().unmmap(VMM::get_instance().get_pgd(), tmp_addr); + } + // 迭代 + tmp = tmp_next; + } + // 释放完后 free 链表项应该为 0 + assert(free.size() == 0); + return; +} + +void SLAB::slab_cache_t::split(chunk_t* _node, size_t _len) { + // 记录原大小 + size_t old_len = _node->len; + // 更新旧节点 + _node->len = _len; + // 旧节点移动到 full + move(full, _node); + // 原长度大于要分配的长度+新 chunk 长度 + // 不能等于,等于的话相当于新节点的 len 为 0 + if (old_len > _len + CHUNK_SIZE) { + // 处理新节点 + // 新节点地址为原本地址+chunk大小+要分配出去的长度 + chunk_t* new_node = (chunk_t*)(_node->addr + CHUNK_SIZE + _len); + new_node->addr = (uintptr_t)new_node; + // 剩余长度为原本的长度减去要分配给 _node 的长度,减去新节点的 chunk + // 大小 + new_node->len = old_len - _len - CHUNK_SIZE; + // 手动初始化节点 + new_node->prev = new_node; + new_node->next = new_node; + // 判断剩余空间是否可以容纳至少一个节点,即大于等于 len+CHUNK_SIZE + // 如果大于等于则建立新的节点,小于的话不用新建 + // 这里只有 len 是因为 chunk 的大小并不包括在 chunk->len + // 中, 前面几行代码已经计算过了 + if (new_node->len > len) { + // 新的节点必然属于 part 链表 + part.push_back(new_node); + } + } + return; +} + +// TODO: 优化算法 +void SLAB::slab_cache_t::merge(void) { + // 如果节点少于两个,不需要合并 + if (part.size() < 2) { + return; + } + // 合并的条件 + // node1->addr+CHUNK_SIZE+node1->len==node2->addr + // 暴力遍历 + chunk_t* chunk = part.next; + chunk_t* tmp = chunk->next; + // 外层循环 + while (chunk != &part) { + // 内层循环 + while (chunk != tmp) { + // 如果符合条件 + if (chunk->addr + CHUNK_SIZE + chunk->len == tmp->addr) { + // 进行合并 + // 加上 tmp 的 chunk 长度 + chunk->len += CHUNK_SIZE; + // 加上 tmp 的 len 长度 + chunk->len += tmp->len; + // 删除 tmp + tmp->prev->next = tmp->next; + tmp->next->prev = tmp->prev; + break; + } + tmp = tmp->next; + } + chunk = chunk->next; + } + + // 遍历查找可以移动到 free 链表的 + // 如果 part 长度等于 len-chunnk 大小 + tmp = part.next; + while (tmp != &part) { + // 节点 len + chunk 长度对页大小取余,如果为零说明有整数页没有被使用 + if (((tmp->len + CHUNK_SIZE) % COMMON::PAGE_SIZE) == 0) { + // 移动到 free + move(free, tmp); + // 因为 tmp 已经被修改了,所以重新赋值 + tmp = part.next; + } + else { + // 没有被修改,直接指向 next + tmp = tmp->next; + } + } + // 寻找可以释放的节点进行释放 + free_pmm(); + return; +} + +SLAB::chunk_t* +SLAB::slab_cache_t::find(chunk_t& _which, size_t _len, bool _alloc) { + chunk_t* res = nullptr; + // 在 _which 中查找,直接遍历即可 + chunk_t* tmp = _which.next; + while (tmp != &_which) { + // 如果 tmp 节点的长度大于等于 _len + if (tmp->len >= _len) { + // 更新 res + res = tmp; + // 跳出循环 + break; + } + tmp = tmp->next; + } + // 如果 res 为空,说明在 _which 链表中没有找到合适的节点 + // 如果同时 _alloc 成立 + if (res == nullptr && _alloc == true) { + // 申请新的空间 + res = alloc_pmm(_len); + } + // 如果 res 不为空 + if (res != nullptr) { + // 对 res 进行切割,res 加入 full,剩余部分进入 part + split(res, _len); + } + return res; +} + +SLAB::chunk_t* SLAB::slab_cache_t::find(size_t _len) { + chunk_t* chunk = nullptr; + // 在 part 里找,如果没有找到允许申请新的空间 + chunk = find(part, _len, true); + // 如果到这里 chunk 还为 nullptr 说明空间不够了 + assert(chunk != nullptr); + return chunk; +} + +void SLAB::slab_cache_t::remove(chunk_t* _node) { + // 将 _node 移动到 part 即可 + move(part, _node); + // merge 会处理节点合并的情况 + merge(); + return; +} + +size_t SLAB::get_idx(size_t _len) const { + size_t res = 0; + // _len 向上取整 + _len += _len - 1; + while (1) { + // 每次右移一位 + _len = _len >> 1; + if (_len == 0) { + // res 需要减去 SHIFT + if (res < SHIFT) { + res = 0; + } + else { + res -= SHIFT; + } + break; + } + res++; + } + return res; +} + +SLAB::SLAB(const char* _name, uintptr_t _addr, size_t _len, bool _is_kernel) + : ALLOCATOR(_name, _addr, _len), is_kernel_space(_is_kernel) { + // 初始化 slab_cache + for (size_t i = LEN256; i < LEN65536; i++) { + slab_cache[i].len = MIN << i; + slab_cache[i].is_kernel_space = _is_kernel; + } + info("%s: 0x%p(0x%p bytes) init.\n", name, allocator_start_addr, + allocator_length); + return; +} + +SLAB::~SLAB(void) { + info("%s finit.\n", name); + return; +} + +uintptr_t SLAB::alloc(size_t _len) { + uintptr_t res = 0; + // 分配时,首先确定需要分配的大小 + // _len 为零直接返回 + // 大小不能超过 65536B + if (_len > 0 && _len <= MIN << LEN65536) { + // _len 按照 8bytes 对齐 + _len = COMMON::ALIGN(_len, 8); + // 根据大小确定 slab_cache 索引 + auto idx = get_idx(_len); + // 寻找合适的 slab 节点 + chunk_t* chunk = slab_cache[idx].find(_len); + // 不为空的话计算地址 + if (chunk != nullptr) { + assert((uintptr_t)chunk == chunk->addr); + // 计算地址 + res = chunk->addr + CHUNK_SIZE; + } +// #define DEBUG +#ifdef DEBUG + info("slab alloc\n"); + std::cout << slab_cache[idx]; +# undef DEBUG +#endif + } + // 更新统计数据 + if (res != 0) { + allocator_used_count += _len; + } + // 返回 + return res; +} + +bool SLAB::alloc(uintptr_t, size_t) { + return true; +} + +void SLAB::free(uintptr_t _addr, size_t) { + if (_addr == 0) { + return; + } + // 要释放一个 chunk + // 1. 计算 chunk 地址 + chunk_t* chunk = (chunk_t*)(_addr - CHUNK_SIZE); + assert((uintptr_t)chunk == chunk->addr); + // 2. 计算所属 slab_cache 索引 + auto a = chunk->len; + assert(chunk->len != 0); + auto idx = get_idx(chunk->len); + // 3. 调用对应的 remove 函数 + slab_cache[idx].remove(chunk); +// #define DEBUG +#ifdef DEBUG + info("slab free\n"); + std::cout << slab_cache[idx]; +# undef DEBUG +#endif + // 更新统计数据 + allocator_used_count -= a; + return; +} + +size_t SLAB::get_used_count(void) const { + return allocator_used_count; +} + +size_t SLAB::get_free_count(void) const { + return 0; +} diff --git a/src/kernel/test.cpp b/src/kernel/test.cpp new file mode 100644 index 000000000..2101210fa --- /dev/null +++ b/src/kernel/test.cpp @@ -0,0 +1,333 @@ + +/** + * @file test.cpp + * @brief 测试 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "cassert" +#include "common.h" +#include "cstdio" +#include "cstdlib" +#include "dev_drv_manager.h" +#include "device_base.h" +#include "ff.h" +#include "heap.h" +#include "kernel.h" +#include "pmm.h" +#include "stdlib.h" +#include "vfs.h" +#include "vmm.h" + +int32_t test_pmm(void) { + // 保存现有 pmm 空闲页数量 + size_t free_pages = PMM::get_instance().get_free_pages_count(); + // 计算内核实际占用页数 + auto kernel_pages + = (COMMON::ALIGN(COMMON::KERNEL_END_ADDR, COMMON::PAGE_SIZE) + - COMMON::ALIGN(COMMON::KERNEL_START_ADDR, COMMON::PAGE_SIZE)) + / COMMON::PAGE_SIZE; + // 再加上启动信息使用的页,一般为一页 + kernel_pages++; + // TODO: 替换宏 + // riscv 的 dtb 占用空间比较大,两页 +#ifdef __riscv + kernel_pages++; +#endif + // 空闲页数应该等于物理内存大小-内核使用 + assert(free_pages + == (PMM::get_instance().get_pmm_length() / COMMON::PAGE_SIZE) + - kernel_pages); + // 获取已使用页数 + size_t used_pages = PMM::get_instance().get_used_pages_count(); + // 已使用页数应该等于内核使用页数 + assert(used_pages == kernel_pages); + // 分配 + auto addr1 = PMM::get_instance().alloc_pages(2); + // 已使用应该会更新 + assert(PMM::get_instance().get_used_pages_count() == 2 + kernel_pages); + // 同上 + auto addr2 = PMM::get_instance().alloc_pages(3); + assert(PMM::get_instance().get_used_pages_count() == 5 + kernel_pages); + // 同上 + auto addr3 = PMM::get_instance().alloc_pages(100); + assert(PMM::get_instance().get_used_pages_count() == 105 + kernel_pages); + // 同上 + auto addr4 = PMM::get_instance().alloc_pages(100); + assert(PMM::get_instance().get_used_pages_count() == 205 + kernel_pages); + // 分配超过限度的内存,应该返回 nullptr + auto addr5 = PMM::get_instance().alloc_pages(0xFFFFFFFF); + assert(addr5 == 0); + // 全部释放 + PMM::get_instance().free_pages(addr1, 2); + PMM::get_instance().free_pages(addr2, 3); + PMM::get_instance().free_pages(addr3, 100); + PMM::get_instance().free_pages(addr4, 100); + // 现在内存使用情况应该与此函数开始时相同 + assert(PMM::get_instance().get_free_pages_count() == free_pages); + // 下面测试内核空间物理内存分配 + // 已使用页数应该等于内核使用页数 + assert(used_pages == kernel_pages); + // 分配 + addr1 = PMM::get_instance().alloc_pages_kernel(2); + // 已使用应该会更新 + assert(PMM::get_instance().get_used_pages_count() == 2 + kernel_pages); + // 同上 + addr2 = PMM::get_instance().alloc_pages_kernel(3); + assert(PMM::get_instance().get_used_pages_count() == 5 + kernel_pages); + // 同上 + addr3 = PMM::get_instance().alloc_pages_kernel(100); + assert(PMM::get_instance().get_used_pages_count() == 105 + kernel_pages); + // 同上 + addr4 = PMM::get_instance().alloc_pages_kernel(100); + assert(PMM::get_instance().get_used_pages_count() == 205 + kernel_pages); + // 分配超过限度的内存,应该返回 nullptr + addr5 = PMM::get_instance().alloc_pages_kernel(0xFFFFFFFF); + assert(addr5 == 0); + // 全部释放 + PMM::get_instance().free_pages(addr1, 2); + PMM::get_instance().free_pages(addr2, 3); + PMM::get_instance().free_pages(addr3, 100); + PMM::get_instance().free_pages(addr4, 100); + // 现在内存使用情况应该与此函数开始时相同 + assert(PMM::get_instance().get_free_pages_count() == free_pages); + info("pmm test done.\n"); + return 0; +} + +/// @note riscv 内核模式下无法测试 VMM_PAGE_USER,默认状态下 S/U +/// 模式的页无法互相访问 +/// @see +/// https://five-embeddev.com/riscv-isa-manual/latest/supervisor.html#sec:translation +int32_t test_vmm(void) { + uintptr_t addr = 0; + // 首先确认内核空间被映射了 + assert(VMM::get_instance().get_pgd() != nullptr); + assert(VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), + (COMMON::KERNEL_START_ADDR + 0x1000), + &addr) + == 1); + assert(addr == COMMON::KERNEL_START_ADDR + 0x1000); + addr = 0; + assert(VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), + COMMON::KERNEL_START_ADDR + + VMM_KERNEL_SPACE_SIZE - 1, + &addr) + == 1); + assert(addr + == ((COMMON::KERNEL_START_ADDR + VMM_KERNEL_SPACE_SIZE - 1) + & COMMON::PAGE_MASK)); + addr = 0; + assert(VMM::get_instance().get_mmap( + VMM::get_instance().get_pgd(), + (COMMON::ALIGN(COMMON::KERNEL_START_ADDR, 4 * COMMON::KB) + + VMM_KERNEL_SPACE_SIZE), + &addr) + == 0); + assert(addr == 0); + addr = 0; + assert(VMM::get_instance().get_mmap( + VMM::get_instance().get_pgd(), + (COMMON::ALIGN(COMMON::KERNEL_START_ADDR, 4 * COMMON::KB) + + VMM_KERNEL_SPACE_SIZE + 0x1024), + 0) + == 0); + // 测试映射与取消映射 + addr = 0; + // 准备映射的虚拟地址 3GB 处 + uintptr_t va = 0xC0000000; + // 分配要映射的物理地址 + uintptr_t pa = PMM::get_instance().alloc_page_kernel(); + // 确定一块未映射的内存 + assert(VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), va, + nullptr) + == 0); + // 映射 + VMM::get_instance().mmap(VMM::get_instance().get_pgd(), va, pa, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE); + assert(VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), va, + &addr) + == 1); + assert(addr == pa); + // 写测试 + *(uintptr_t*)va = 0xCD; + // 取消映射 + VMM::get_instance().unmmap(VMM::get_instance().get_pgd(), va); + assert(VMM::get_instance().get_mmap(VMM::get_instance().get_pgd(), va, + &addr) + == 0); + assert(addr == 0); + // 回收物理地址 + PMM::get_instance().free_page(pa); + info("vmm test done.\n"); + return 0; +} + +// TODO: 更多测试 +int test_heap(void) { + // 根据字长不同 CHUNK_SIZE 是不一样的 + size_t chunk_size = 0; + if (sizeof(void*) == 4) { + chunk_size = 0x10; + } + else if (sizeof(void*) == 8) { + chunk_size = 0x20; + } + void* addr1 = nullptr; + void* addr2 = nullptr; + void* addr3 = nullptr; + void* addr4 = nullptr; + // 申请超过最大允许的内存 65536B + addr1 = kmalloc(0x10001); + // 应该返回 nullptr + assert(addr1 == nullptr); + // 申请小块内存 + addr2 = kmalloc(0x1); + assert(addr2 != nullptr); + // 第一块被申请的内存,减去 chunk 大小后应该是 4k 对齐的 + assert(((uintptr_t)((uint8_t*)addr2 - chunk_size) & 0xFFF) == 0x0); + // 在 LEN512 申请新的内存 + addr3 = kmalloc(0x200); + assert(addr3 != nullptr); + // 第一块被申请的内存,减去 chunk 大小后应该是 4k 对齐的 + assert(((uintptr_t)((uint8_t*)addr3 - chunk_size) & 0xFFF) == 0x0); + // 加上 chunk 大小长度刚好是 LEN256 + addr4 = kmalloc(0x80); + assert(addr4 != nullptr); + // LEN256 区域第二块被申请的内存,地址可以计算出来 + // 前一个块的地址+chunk 长度+数据长度+对齐长度 + assert(addr4 == (uint8_t*)addr2 + chunk_size + 0x1 + 0x7); + /// @bug 这里释放会同时 unmmap,导致后面的分支出现 pg + // 全部释放 + // kfree(addr1); + // kfree(addr2); + // kfree(addr3); + // kfree(addr4); + info("heap test done.\n"); + return 0; +} + +// TODO: 更多测试 +int test_intr(void) { + // 触发 pg 中断 + uintptr_t* addr = (uintptr_t*)0xC0000000; + int tmp = 0x666; + tmp = *addr; + assert(tmp == 0); + *addr = 0x233; + tmp = *addr; + assert(tmp == 0x233); + *addr = 0x0; + info("intr test done.\n"); + return 0; +} + +int test_device(void) { + // 获取设备 + /// @todo 获取设备的方式需要改进,比如通过 resource + device_base_t* dev + = (device_base_t*)DEV_DRV_MANAGER::get_instance().get_dev_via_intr_no(1); + + buf_t buf; + buf.sector = 0; + + dev->read(buf); + + // fat 第一个扇区的最后两字节 + assert(buf.data[COMMON::BUFFFER_SIZE - 1] == 0xAA); + assert(buf.data[COMMON::BUFFFER_SIZE - 2] == 0x55); + + info("device test done.\n"); + return 0; +} + +int test_fatfs(void) { + FATFS fatfs; + FRESULT status; + DIR dir; + FILINFO flinfo; + FIL fil; + uint8_t buf[COMMON::BUFFFER_SIZE]; + uint32_t size; + + status = f_mount(&fatfs, "", 0); + assert(status == FR_OK); + + status = f_findfirst(&dir, &flinfo, "", "*"); + assert(status == FR_OK); + + while (status == FR_OK && flinfo.fname[0]) { + if (flinfo.fattrib & AM_DIR) { + printf("dir: %s\n", flinfo.fname); + } + else { + printf("file: %s\n", flinfo.fname); + } + status = f_findnext(&dir, &flinfo); + } + f_closedir(&dir); + + status = f_open(&fil, "file1", FA_READ | FA_OPEN_EXISTING); + assert(status == FR_OK); + + bzero(buf, COMMON::BUFFFER_SIZE); + + status = f_read(&fil, buf, 15, &size); + assert(status == FR_OK); + f_close(&fil); + + printf("buf: [%s]\n", buf); + + status = f_open(&fil, "file1", FA_WRITE | FA_OPEN_APPEND); + assert(status == FR_OK); + + auto str = "Hello, World!\n"; + status = f_write(&fil, str, sizeof(str), &size); + assert(status == FR_OK); + f_close(&fil); + + assert(size == sizeof(str)); + printf("f_write: %d\n", size); + + status = f_open(&fil, "file1", FA_READ | FA_OPEN_EXISTING); + assert(status == FR_OK); + + bzero(buf, COMMON::BUFFFER_SIZE); + + status = f_read(&fil, buf, 15, &size); + assert(status == FR_OK); + f_close(&fil); + + printf("buf: %d [0x%X]\n", size, buf); + for (int i = 0; i < 15; i++) { + printf("[%c]", buf[i]); + } + printf("\n"); + + info("fatfs test done.\n"); + return 0; +} + +int test_vfs(void) { + VFS::get_instance().mkdir("/233", 0); + VFS::get_instance().mkdir("/233/555", 0); + VFS::get_instance().rmdir("/233/555"); + VFS::get_instance().mkdir("/233/555", 0); + fd_t fd = VFS::get_instance().open("/233/555/test.c", O_CREAT); + char a[] = "test233.c"; + VFS::get_instance().write(fd, a, 10); + char b[10]; + VFS::get_instance().read(fd, b, 10); + assert(strcmp(a, b) == 0); + printf("vfs test done.\n"); + return 0; +} diff --git a/src/kernel/vfs.cpp b/src/kernel/vfs.cpp new file mode 100644 index 000000000..362f0e69b --- /dev/null +++ b/src/kernel/vfs.cpp @@ -0,0 +1,278 @@ + +/** + * @file vfs.cpp + * @brief 虚拟文件系统实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N迁移到 doxygen + *
+ */ + +#include "vfs.h" +#include "fatfs.h" +#include "iostream" +#include "string" + +inode_t::inode_t(void) { + return; +} + +inode_t::~inode_t(void) { + return; +} + +void inode_t::read(size_t _idx) { + (void)_idx; + return; +} + +void inode_t::write(size_t _idx) { + (void)_idx; + return; +} + +dentry_t::dentry_t(void) { + return; +} + +dentry_t::~dentry_t(void) { + return; +} + +fs_t::fs_t(void) { + return; +} + +fs_t::~fs_t(void) { + return; +} + +VFS::VFS(void) { + return; +} + +VFS::~VFS(void) { + return; +} + +VFS& VFS::get_instance(void) { + /// 定义全局 PMM 对象 + static VFS vfs; + return vfs; +} + +dentry_t* VFS::find_dentry(const mystl::string& _path) { + // 遍历所有目录项 + for (auto i : dentries) { + // 如果完整路径相同 + if (i->path == _path) { + return i; + } + } + return nullptr; +} + +dentry_t* VFS::alloc_dentry(const mystl::string& _path, int _flags) { + // 新建目录项 + dentry_t* dentry = new dentry_t(); + dentry->flag = _flags; + // 找到父目录 + for (auto i : dentries) { + // 如果 i 的 ptah 与 _path 的路径部分相同 + if (_path.find(i->path) == 0) { + // 设置父目录 + dentry->parent = i; + // 为父目录添加 child + i->child.push_back(dentry); + } + } + dentry->path = _path; + // 设置文件名为 _path 的最后一部分 + mystl::string tmp = _path; + dentry->name = tmp.substr(_path.find_last_of('/') + 1); + // 由路径对应的 fs 分配 inode + inode_t* inode = get_fs(_path)->alloc_inode(); + // 将 dentry 与 inode 建立关联 + dentry->inode = inode; + dentries.push_back(dentry); + return dentry; +} + +int VFS::dealloc_dentry(const mystl::string& _path) { + (void)_path; + // dentry_t* dentry = find_dentry(_path); + // // 首先判断是否存在,不存在则返回 + // if (dentry == nullptr) { + // std::cout << "\"" << _path << "\" not exist." << std::endl; + // return -1; + // } + // fs_t* fs = get_fs(_path); + // // 从父目录的子目录中删除 + // dentry->parent->child.remove(dentry); + // // 删除子目录 + // for (auto i : dentry->child) { + // fs->dealloc_inode(i->inode); + // dentries.remove(i); + // } + // // 删除 inode + // fs->dealloc_inode(dentry->inode); + // // 删除 dentry + // dentries.remove(dentry); + return 0; +} + +fs_t* VFS::get_fs(const mystl::string& _path) { + for (auto i : fs) { + // 返回 0 说明路径匹配 + if (_path.find(i->root.name) == 0) { + return i; + } + } + return nullptr; +} + +fd_t VFS::alloc_fd(void) { + return 1; +} + +fd_t VFS::dealloc_fd(void) { + return 0; +} + +bool VFS::init(void) { + // 注册 fatfs 作为 rootfs + info("vfs init.\n"); + return true; +} + +int32_t VFS::register_filesystem(fs_t* _fs) { + // 遍历文件系统 + for (auto i : fs) { + // 有的话返回 + if (i->name == _fs->name) { + std::cout << _fs->name << " file system already exist." + << std::endl; + return -1; + } + // 没有的话注册 + else { + fs.push_back(_fs); + std::cout << "register " << _fs->name << " file system." + << std::endl; + break; + } + } + return 0; +} + +int32_t VFS::unregister_filesystem(fs_t* _fs) { + (void)_fs; + // // 删除下属的 dentry + // // 如果 i 的 name 与 _fs 的安装路径匹配 + // for (auto i : dentries) { + // if (i->name.find(_fs->root.path) == 0) { + // dentries.remove(i); + // } + // } + // // 遍历文件系统 + // for (auto i : fs) { + // // 有的话删除 + // if (i->name == _fs->name) { + // fs.remove(i); + // std::cout << "unregister " << _fs->name << " file system." + // << std::endl; + // return -1; + // } + // } + return 0; +} + +int32_t VFS::mkdir(const mystl::string& _path, const mode_t& _mode) { + // TODO: 对 "/", ".", ".." 等特殊字符的处理 + // 首先判断是否存在,存在则返回 + if (find_dentry(_path) != nullptr) { + std::cout << "\"" << _path << "\" already exist." << std::endl; + return -1; + } + // 没有找到则创建 + dentry_t* dentry = alloc_dentry(_path, _mode); + if (dentry == nullptr) { + return -1; + } + return 0; +} + +int32_t VFS::rmdir(const mystl::string& _path) { + return dealloc_dentry(_path); +} + +int32_t VFS::open(const mystl::string& _path, int _flags) { + (void)_path; + (void)_flags; + // // 首先看是否存在 + // dentry_t* dentry = find_dentry(_path); + // // 如果不存在 + // if (dentry == nullptr) { + // // 根据 flag 判断是否创建 + // // 创建 + // if ((_flags & O_CREAT) != 0) { + // dentry = alloc_dentry(_path, _flags); + // } + // // 不创建则返回 + // else { + // return -1; + // } + // } + // // 打开 + // // 创建 file 对象 + // file_t* file = new file_t(dentry, _flags, alloc_fd()); + // // 添加到链表中 + // files.push_back(file); + // return file->fd; + return 0; +} + +int32_t VFS::close(fd_t _fd) { + (void)_fd; + // for (auto i : files) { + // if (i->fd == _fd) { + // files.remove(i); + // } + // } + // return 0; + return 0; +} + +int32_t VFS::read(fd_t _fd, void* _buf, size_t _count) { + (void)_fd; + (void)_buf; + (void)_count; + // // 寻找对应 file + // for (auto i : files) { + // if (i->fd == _fd) { + // memcpy(_buf, i->dentry->inode->pointer, _count); + // } + // } + // return 0; + return 0; +} + +int32_t VFS::write(fd_t _fd, void* _buf, size_t _count) { + (void)_fd; + (void)_buf; + (void)_count; + // for (auto i : files) { + // if (i->fd == _fd) { + // i->dentry->inode->pointer = malloc(_count); + // memcpy(i->dentry->inode->pointer, _buf, _count); + // } + // } + // return 0; + return 0; +} diff --git a/src/kernel/vmm.cpp b/src/kernel/vmm.cpp new file mode 100644 index 000000000..00dfe6156 --- /dev/null +++ b/src/kernel/vmm.cpp @@ -0,0 +1,178 @@ + +/** + * @file vmm.cpp + * @brief 虚拟内存头文件 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "cassert" +#include "cpu.hpp" +#include "cstdint" +#include "cstdio" +#include "cstring" +#if defined(__i386__) || defined(__x86_64__) +# include "gdt.h" +#endif +#include "pmm.h" +#include "vmm.h" + +// 在 _pgd 中查找 _va 对应的页表项 +// 如果未找到,_alloc 为真时会进行分配 +pte_t* VMM::find(const pt_t _pgd, uintptr_t _va, bool _alloc) { + pt_t pgd = _pgd; + // sv39 共有三级页表,一级一级查找 + // -1 是因为最后一级是具体的某一页,在函数最后直接返回 + for (size_t level = VMM_PT_LEVEL - 1; level > 0; level--) { + // 每次循环会找到 _va 的第 level 级页表 pgd + // 相当于 pgd_level[VPN_level],这样相当于得到了第 level 级页表的地址 + pte_t* pte = (pte_t*)&pgd[PX(level, _va)]; + // 解引用 pte,如果有效,获取 level+1 级页表, + if ((*pte & VMM_PAGE_VALID) == 1) { + // pgd 指向下一级页表 + // *pte 保存的是页表项,需要转换为对应的物理地址 + pgd = (pt_t)PTE2PA(*pte); + } + // 如果无效 + else { + // 判断是否需要分配 + // 如果需要 + if (_alloc == true) { + // 申请新的物理页 + pgd = (pt_t)PMM::get_instance().alloc_page_kernel(); + bzero(pgd, COMMON::PAGE_SIZE); + // 申请失败则返回 + if (pgd == nullptr) { + // 如果出现这种情况,说明物理内存不够,一般不会出现 + assert(0); + return nullptr; + } + // 清零 + bzero(pgd, COMMON::PAGE_SIZE); + // 填充页表项 + *pte = PA2PTE((uintptr_t)pgd) | VMM_PAGE_VALID; + } + // 不分配的话直接返回 + else { + return nullptr; + } + } + } + // 0 最低级 pt + return &pgd[PX(0, _va)]; +} + +VMM& VMM::get_instance(void) { + /// 定义全局 VMM 对象 + static VMM vmm; + return vmm; +} + +bool VMM::init(void) { +#if defined(__i386__) || defined(__x86_64__) + GDT::init(); +#endif + // 分配一页用于保存页目录 + pt_t pgd_kernel = (pt_t)PMM::get_instance().alloc_page_kernel(); + bzero(pgd_kernel, COMMON::PAGE_SIZE); + // 映射内核空间 + for (uintptr_t addr = (uintptr_t)COMMON::KERNEL_START_ADDR; + addr < (uintptr_t)COMMON::KERNEL_START_ADDR + VMM_KERNEL_SPACE_SIZE; + addr += COMMON::PAGE_SIZE) { + // TODO: 区分代码/数据等段分别映射 + mmap(pgd_kernel, addr, addr, + VMM_PAGE_READABLE | VMM_PAGE_WRITABLE | VMM_PAGE_EXECUTABLE); + } + // 设置页目录 + set_pgd(pgd_kernel); + // 开启分页 + CPU::ENABLE_PG(); + info("vmm init.\n"); + return 0; +} + +pt_t VMM::get_pgd(void) { + return (pt_t)CPU::GET_PGD(); +} + +void VMM::set_pgd(const pt_t _pgd) { + // 设置页目录 + CPU::SET_PGD((uintptr_t)_pgd); + // 刷新缓存 + CPU::VMM_FLUSH(0); + return; +} + +void VMM::mmap(const pt_t _pgd, uintptr_t _va, uintptr_t _pa, uint32_t _flag) { + pte_t* pte = find(_pgd, _va, true); + // 一般情况下不应该为空 + assert(pte != nullptr); + // 已经映射过了 且 flag 没有变化 + if (((*pte & VMM_PAGE_VALID) == VMM_PAGE_VALID) + && ((*pte & ((1 << VMM_PTE_PROP_BITS) - 1)) == _flag)) { + warn("remap.\n"); + } + // 没有映射,或更改了 flag + else { + // 那么设置 *pte + // pte 解引用后的值是页表项 + *pte = PA2PTE(_pa) | _flag | (*pte & ((1 << VMM_PTE_PROP_BITS) - 1)) + | VMM_PAGE_VALID; + // 刷新缓存 + CPU::VMM_FLUSH(0); + } + return; +} + +void VMM::unmmap(const pt_t _pgd, uintptr_t _va) { + pte_t* pte = find(_pgd, _va, false); + // 找到页表项 + // 未找到 + if (pte == nullptr) { + warn("VMM::unmmap: find.\n"); + return; + } + // 找到了,但是并没有被映射 + if ((*pte & VMM_PAGE_VALID) == 0) { + warn("VMM::unmmap: not mapped.\n"); + } + // 置零 + *pte = 0x00; + // 刷新缓存 + CPU::VMM_FLUSH(0); + // TODO: 如果一页表都被 unmap,释放占用的物理内存 + return; +} + +bool VMM::get_mmap(const pt_t _pgd, uintptr_t _va, const void* _pa) { + pte_t* pte = find(_pgd, _va, false); + bool res = false; + // pte 不为空且有效,说明映射了 + if ((pte != nullptr) && ((*pte & VMM_PAGE_VALID) == 1)) { + // 如果 _pa 不为空 + if (_pa != nullptr) { + // 设置 _pa + // 将页表项转换为物理地址 + *(uintptr_t*)_pa = PTE2PA(*pte); + } + // 返回 true + res = true; + } + // 否则说明没有映射 + else { + // 如果 _pa 不为空 + if (_pa != nullptr) { + // 设置 _pa + *(uintptr_t*)_pa = (uintptr_t) nullptr; + } + } + return res; +} diff --git a/src/libc/CMakeLists.txt b/src/libc/CMakeLists.txt new file mode 100644 index 000000000..4e9453e64 --- /dev/null +++ b/src/libc/CMakeLists.txt @@ -0,0 +1,18 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +PROJECT(libc C) + +aux_source_directory(${libc_SOURCE_DIR}/src/stdio stdio_src) +aux_source_directory(${libc_SOURCE_DIR}/src/stdlib stdlib_src) +aux_source_directory(${libc_SOURCE_DIR}/src/string string_src) +aux_source_directory(${libc_SOURCE_DIR}/src/math math_src) + +set(libc_src ${stdio_src} ${stdio_src} ${stdlib_src} ${string_src} ${math_src}) +add_library(${PROJECT_NAME} OBJECT ${libc_src}) + +target_include_libc_header_files(${PROJECT_NAME}) +target_include_common_header_files(${PROJECT_NAME}) diff --git a/src/libc/include/assert.h b/src/libc/include/assert.h new file mode 100644 index 000000000..f72e7435e --- /dev/null +++ b/src/libc/include/assert.h @@ -0,0 +1,36 @@ + +/** + * @file assert.h + * @brief assert 实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://wiki.osdev.org/Raspberry_Pi_Bare_Bones + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ASSERT_H +#define SIMPLEKERNEL_ASSERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdio.h" + +#define assert(_e) \ + ((void)((_e) ? ((void)0) : __assert(#_e, __FILE__, __LINE__))) +#define __assert(_e, _file, _line) \ + ((void)err("%s:%d: failed assertion `%s'\n", _file, _line, _e)) + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_ASSERT_H */ diff --git a/src/libc/include/ctype.h b/src/libc/include/ctype.h new file mode 100644 index 000000000..269611839 --- /dev/null +++ b/src/libc/include/ctype.h @@ -0,0 +1,33 @@ + +/** + * @file ctype.h + * @brief ctype 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_CTYPE_H +#define SIMPLEKERNEL_CTYPE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define isupper(_c) (_c >= 'A' && _c <= 'Z') +#define isalpha(_c) ((_c >= 'A' && _c <= 'Z') || (_c >= 'a' && _c <= 'z')) +#define isspace(_c) (_c == ' ' || _c == '\t' || _c == '\n' || _c == '\12') +#define isdigit(_c) (_c >= '0' && _c <= '9') + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CTYPE_H */ diff --git a/src/libc/include/endian.h b/src/libc/include/endian.h new file mode 100644 index 000000000..27b5b7c7c --- /dev/null +++ b/src/libc/include/endian.h @@ -0,0 +1,115 @@ + +/** + * @file endian.h + * @brief endian 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ENDIAN_H +#define SIMPLEKERNEL_ENDIAN_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdint.h" +#include "string.h" + +static union { + char c[4]; + unsigned long mylong; +} endian_test __attribute__((unused)) = { + {'l', '?', '?', 'b'} +}; + +// 'l' 为小端,'b' 为大端 +#define ENDIANNESS ((char)endian_test.mylong) + +#define __LITTLE_ENDIAN 1234 +#define __BIG_ENDIAN 4321 +#define __PDP_ENDIAN 3412 + +#if defined(__riscv) || defined(__i386__) || defined(__x86_64__) +# define __BYTE_ORDER __LITTLE_ENDIAN +#else +# define __BYTE_ORDER __BIG_ENDIAN +#endif + +#define BIG_ENDIAN __BIG_ENDIAN +#define LITTLE_ENDIAN __LITTLE_ENDIAN +#define PDP_ENDIAN __PDP_ENDIAN +#define BYTE_ORDER __BYTE_ORDER + +inline static uint16_t __bswap16(uint16_t __x) { + return (__x << 8) | (__x >> 8); +} + +inline static uint32_t __bswap32(uint32_t __x) { + return (__x >> 24) | (__x >> 8 & 0xff00) | (__x << 8 & 0xff0000) + | (__x << 24); +} + +inline static uint64_t __bswap64(uint64_t __x) { + return (__bswap32(__x) + (0ULL << 32)) | __bswap32(__x >> 32); +} + +#if __BYTE_ORDER == __LITTLE_ENDIAN +# define htobe16(x) __bswap16(x) +# define be16toh(x) __bswap16(x) +# define htobe32(x) __bswap32(x) +# define be32toh(x) __bswap32(x) +# define htobe64(x) __bswap64(x) +# define be64toh(x) __bswap64(x) +# define htole16(x) (uint16_t)(x) +# define le16toh(x) (uint16_t)(x) +# define htole32(x) (uint32_t)(x) +# define le32toh(x) (uint32_t)(x) +# define htole64(x) (uint64_t)(x) +# define le64toh(x) (uint64_t)(x) +#else +# define htobe16(x) (uint16_t)(x) +# define be16toh(x) (uint16_t)(x) +# define htobe32(x) (uint32_t)(x) +# define be32toh(x) (uint32_t)(x) +# define htobe64(x) (uint64_t)(x) +# define be64toh(x) (uint64_t)(x) +# define htole16(x) __bswap16(x) +# define le16toh(x) __bswap16(x) +# define htole32(x) __bswap32(x) +# define le32toh(x) __bswap32(x) +# define htole64(x) __bswap64(x) +# define le64toh(x) __bswap64(x) +#endif + +#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE) +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define betoh16(x) __bswap16(x) +# define betoh32(x) __bswap32(x) +# define betoh64(x) __bswap64(x) +# define letoh16(x) (uint16_t)(x) +# define letoh32(x) (uint32_t)(x) +# define letoh64(x) (uint64_t)(x) +# else +# define betoh16(x) (uint16_t)(x) +# define betoh32(x) (uint32_t)(x) +# define betoh64(x) (uint64_t)(x) +# define letoh16(x) __bswap16(x) +# define letoh32(x) __bswap32(x) +# define letoh64(x) __bswap64(x) +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_ENDIAN_H */ diff --git a/src/libc/include/float.h b/src/libc/include/float.h new file mode 100644 index 000000000..3b02c7816 --- /dev/null +++ b/src/libc/include/float.h @@ -0,0 +1,30 @@ + +/** + * @file float.h + * @brief float 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_FLOAT_H +#define SIMPLEKERNEL_FLOAT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define DBL_MAX (1e37) + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_FLOAT_H */ diff --git a/src/libc/include/limits.h b/src/libc/include/limits.h new file mode 100644 index 000000000..a4c30cd38 --- /dev/null +++ b/src/libc/include/limits.h @@ -0,0 +1,63 @@ + +/** + * @file limits.h + * @brief limits 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_LIMITS_H +#define SIMPLEKERNEL_LIMITS_H + +#ifdef __cplusplus +extern "C" { +#endif + +// int8_t +#define SCHAR_MIN (-128) +#define SCHAR_MAX (127) +// uint8_t +#define UCHAR_MAX (0xFF) + +// int16_t +#define SHRT_MIN (-32768) +#define SHRT_MAX (32767) +// uint16_t +#define USHRT_MAX (0xFFFF) + +// 4字节 int和unsigned int类型 +// int32_t +#define INT_MIN (-2147483647 - 1) +#define INT_MAX (2147483647) +// uint32_t +#define UINT_MAX (0xFFFFFFFF) + +// 32bit 与 64bit 不同 +// 0x7FFFFFFF +#define LONG_MAX ((long)(ULONG_MAX >> 1)) +// 0x80000000 +#define LONG_MIN ((long)(~LONG_MAX)) +// 0xFFFFFFFF +#define ULONG_MAX ((unsigned long)(~0L)) + +// 8字节 long long int和 unsigned long long int类型 +// 0xFFFFFFFFFFFFFFFF +#define ULLONG_MAX (~(unsigned long long)0) +// 0x7FFFFFFFFFFFFFFF +#define LLONG_MAX ((long long)(ULLONG_MAX >> 1)) +// 0x8000000000000000 +#define LLONG_MIN (~LLONG_MAX) + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_LIMITS_H */ diff --git a/src/libc/include/math.h b/src/libc/include/math.h new file mode 100644 index 000000000..33d540b48 --- /dev/null +++ b/src/libc/include/math.h @@ -0,0 +1,38 @@ + +/** + * @file math.h + * @brief math 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on libgcc + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_MATH_H +#define SIMPLEKERNEL_MATH_H + +#ifdef __cplusplus +extern "C" { +#endif + +// TODO: 更多支持 +// TODO: 浮点数 + +long long divmoddi4(long long _num, long long _den, long long* _rem_p); +unsigned long long udivmoddi4(unsigned long long _num, unsigned long long _den, + unsigned long long* _rem_p); +unsigned long long udivdi3(unsigned long long _num, unsigned long long _den); +unsigned long long umoddi3(unsigned long long _num, unsigned long long _den); + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_MATH_H */ diff --git a/src/libc/include/stdarg.h b/src/libc/include/stdarg.h new file mode 100644 index 000000000..53376d274 --- /dev/null +++ b/src/libc/include/stdarg.h @@ -0,0 +1,34 @@ + +/** + * @file stdarg.h + * @brief stdarg 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STDARG_H +#define SIMPLEKERNEL_STDARG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define va_list __builtin_va_list +#define va_start(_v, _l) __builtin_va_start(_v, _l) +#define va_arg(_v, _l) __builtin_va_arg(_v, _l) +#define va_end(_v) __builtin_va_end(_v) +#define va_copy(_d, _s) __builtin_va_copy(_d, _s) + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_STDARG_H */ diff --git a/src/libc/include/stdbool.h b/src/libc/include/stdbool.h new file mode 100644 index 000000000..51639a9ee --- /dev/null +++ b/src/libc/include/stdbool.h @@ -0,0 +1,44 @@ + +/** + * @file stdbool.h + * @brief stdbool 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * Baseed on GCC stdbool.h + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STDBOOL_H +#define SIMPLEKERNEL_STDBOOL_H + +#ifndef __cplusplus + +# define bool _Bool +# define true 1 +# define false 0 + +#else /* __cplusplus */ + +/* Supporting _Bool in C++ is a GCC extension. */ +# define _Bool bool + +# if __cplusplus < 201103L +/* Defining these macros in C++98 is a GCC extension. */ +# define bool bool +# define false false +# define true true +# endif + +#endif /* __cplusplus */ + +/* Signal that all the definitions are present. */ +#define __bool_true_false_are_defined 1 + +#endif /* SIMPLEKERNEL_STDBOOL_H */ diff --git a/src/libc/include/stddef.h b/src/libc/include/stddef.h new file mode 100644 index 000000000..1693e100b --- /dev/null +++ b/src/libc/include/stddef.h @@ -0,0 +1,63 @@ + +/** + * @file stddef.h + * @brief stddef 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STDDEF_H +#define SIMPLEKERNEL_STDDEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _PTRDIFF_T +# define _PTRDIFF_T +typedef long ptrdiff_t; +#endif + +#ifndef _SIZE_T +# define _SIZE_T +# undef size_t +# if defined(__i386__) +typedef unsigned int size_t; +# elif defined(__riscv) || defined(__x86_64__) +typedef long unsigned int size_t; +# endif +#endif + +#ifndef _SSIZE_T +# define _SSIZE_T +# undef ssize_t +# if defined(__i386__) +typedef int ssize_t; +# elif defined(__riscv) || defined(__x86_64__) +typedef long int ssize_t; +# endif +#endif + +#ifndef _SSIZE_T +# define _SSIZE_T +# undef ssize_t +typedef int ssize_t; +#endif + +#ifndef NULL +# define NULL ((void*)0) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_STDDEF_H */ diff --git a/src/libc/include/stdint.h b/src/libc/include/stdint.h new file mode 100644 index 000000000..c9133a36e --- /dev/null +++ b/src/libc/include/stdint.h @@ -0,0 +1,305 @@ + +/** + * @file stdint.h + * @brief stdint 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on GNU C Lib + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STDINT_H +#define SIMPLEKERNEL_STDINT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(__x86_64__) || defined(__riscv) +# define __WORDSIZE 64 +#else +# define __WORDSIZE 32 +#endif + +#ifdef __x86_64__ +# define __WORDSIZE_TIME64_COMPAT32 1 +/* Both x86-64 and x32 use the 64-bit system call interface. */ +# define __SYSCALL_WORDSIZE 64 +#endif + +/* Exact integral types. */ + +/* Signed. */ + +/* There is some amount of overlap with as known by inet code */ +#ifndef __int8_t_defined +# define __int8_t_defined +typedef signed char int8_t; +typedef short int int16_t; +typedef int int32_t; +# if __WORDSIZE == 64 +typedef long int int64_t; +# else +__extension__ typedef long long int int64_t; +# endif +#endif + +/* Unsigned. */ +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +#ifndef __uint32_t_defined +typedef unsigned int uint32_t; +# define __uint32_t_defined +#endif +#if __WORDSIZE == 64 +typedef unsigned long int uint64_t; +#else +__extension__ typedef unsigned long long int uint64_t; +#endif + +/* Small types. */ + +/* Signed. */ +typedef signed char int_least8_t; +typedef short int int_least16_t; +typedef int int_least32_t; +#if __WORDSIZE == 64 +typedef long int int_least64_t; +#else +__extension__ typedef long long int int_least64_t; +#endif + +/* Unsigned. */ +typedef unsigned char uint_least8_t; +typedef unsigned short int uint_least16_t; +typedef unsigned int uint_least32_t; +#if __WORDSIZE == 64 +typedef unsigned long int uint_least64_t; +#else +__extension__ typedef unsigned long long int uint_least64_t; +#endif + +/* Fast types. */ + +/* Signed. */ +typedef signed char int_fast8_t; +#if __WORDSIZE == 64 +typedef long int int_fast16_t; +typedef long int int_fast32_t; +typedef long int int_fast64_t; +#else +typedef int int_fast16_t; +typedef int int_fast32_t; +__extension__ typedef long long int int_fast64_t; +#endif + +/* Unsigned. */ +typedef unsigned char uint_fast8_t; +#if __WORDSIZE == 64 +typedef unsigned long int uint_fast16_t; +typedef unsigned long int uint_fast32_t; +typedef unsigned long int uint_fast64_t; +#else +typedef unsigned int uint_fast16_t; +typedef unsigned int uint_fast32_t; +__extension__ typedef unsigned long long int uint_fast64_t; +#endif + +/* Types for `void *' pointers. */ +#if __WORDSIZE == 64 +# ifndef __intptr_t_defined +typedef long int intptr_t; +# define __intptr_t_defined +# endif +typedef unsigned long int uintptr_t; +#else +# ifndef __intptr_t_defined +typedef int intptr_t; +# define __intptr_t_defined +# endif +typedef unsigned int uintptr_t; +#endif + +/* Largest integral types. */ +#if __WORDSIZE == 64 +typedef long int intmax_t; +typedef unsigned long int uintmax_t; +#else +__extension__ typedef long long int intmax_t; +__extension__ typedef unsigned long long int uintmax_t; +#endif + +#ifndef __INT64_C +# if __WORDSIZE == 64 +# define __INT64_C(c) c##L +# define __UINT64_C(c) c##UL +# else +# define __INT64_C(c) c##LL +# define __UINT64_C(c) c##ULL +# endif +#endif + +/* Limits of integral types. */ + +/* Minimum of signed integral types. */ +#define INT8_MIN (-128) +#define INT16_MIN (-32767 - 1) +#define INT32_MIN (-2147483647 - 1) +#define INT64_MIN (-__INT64_C(9223372036854775807) - 1) +/* Maximum of signed integral types. */ +#define INT8_MAX (127) +#define INT16_MAX (32767) +#define INT32_MAX (2147483647) +#define INT64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types. */ +#define UINT8_MAX (255) +#define UINT16_MAX (65535) +#define UINT32_MAX (4294967295U) +#define UINT64_MAX (__UINT64_C(18446744073709551615)) + +/* Minimum of signed integral types having a minimum size. */ +#define INT_LEAST8_MIN (-128) +#define INT_LEAST16_MIN (-32767 - 1) +#define INT_LEAST32_MIN (-2147483647 - 1) +#define INT_LEAST64_MIN (-__INT64_C(9223372036854775807) - 1) +/* Maximum of signed integral types having a minimum size. */ +#define INT_LEAST8_MAX (127) +#define INT_LEAST16_MAX (32767) +#define INT_LEAST32_MAX (2147483647) +#define INT_LEAST64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of unsigned integral types having a minimum size. */ +#define UINT_LEAST8_MAX (255) +#define UINT_LEAST16_MAX (65535) +#define UINT_LEAST32_MAX (4294967295U) +#define UINT_LEAST64_MAX (__UINT64_C(18446744073709551615)) + +/* Minimum of fast signed integral types having a minimum size. */ +#define INT_FAST8_MIN (-128) +#if __WORDSIZE == 64 +# define INT_FAST16_MIN (-9223372036854775807L - 1) +# define INT_FAST32_MIN (-9223372036854775807L - 1) +#else +# define INT_FAST16_MIN (-2147483647 - 1) +# define INT_FAST32_MIN (-2147483647 - 1) +#endif +#define INT_FAST64_MIN (-__INT64_C(9223372036854775807) - 1) +/* Maximum of fast signed integral types having a minimum size. */ +#define INT_FAST8_MAX (127) +#if __WORDSIZE == 64 +# define INT_FAST16_MAX (9223372036854775807L) +# define INT_FAST32_MAX (9223372036854775807L) +#else +# define INT_FAST16_MAX (2147483647) +# define INT_FAST32_MAX (2147483647) +#endif +#define INT_FAST64_MAX (__INT64_C(9223372036854775807)) + +/* Maximum of fast unsigned integral types having a minimum size. */ +#define UINT_FAST8_MAX (255) +#if __WORDSIZE == 64 +# define UINT_FAST16_MAX (18446744073709551615UL) +# define UINT_FAST32_MAX (18446744073709551615UL) +#else +# define UINT_FAST16_MAX (4294967295U) +# define UINT_FAST32_MAX (4294967295U) +#endif +#define UINT_FAST64_MAX (__UINT64_C(18446744073709551615)) +/* Values to test for integral types holding `void *' pointer. */ +#if __WORDSIZE == 64 +# define INTPTR_MIN (-9223372036854775807L - 1) +# define INTPTR_MAX (9223372036854775807L) +# define UINTPTR_MAX (18446744073709551615UL) +#else +# define INTPTR_MIN (-2147483647 - 1) +# define INTPTR_MAX (2147483647) +# define UINTPTR_MAX (4294967295U) +#endif + +/* Minimum for largest signed integral type. */ +#define INTMAX_MIN (-__INT64_C(9223372036854775807) - 1) +/* Maximum for largest signed integral type. */ +#define INTMAX_MAX (__INT64_C(9223372036854775807)) + +/* Maximum for largest unsigned integral type. */ +#define UINTMAX_MAX (__UINT64_C(18446744073709551615)) + +/* Limits of other integer types. */ + +/* Limits of `ptrdiff_t' type. */ +#if __WORDSIZE == 64 +# define PTRDIFF_MIN (-9223372036854775807L - 1) +# define PTRDIFF_MAX (9223372036854775807L) +#else +# define PTRDIFF_MIN (-2147483647 - 1) +# define PTRDIFF_MAX (2147483647) +#endif + +/* Limits of `sig_atomic_t'. */ +#define SIG_ATOMIC_MIN (-2147483647 - 1) +#define SIG_ATOMIC_MAX (2147483647) + +/* Limit of `size_t' type. */ +#if __WORDSIZE == 64 +# define SIZE_MAX (18446744073709551615UL) +#else +# ifdef __WORDSIZE32_SIZE_ULONG +# define SIZE_MAX (4294967295UL) +# else +# define SIZE_MAX (4294967295U) +# endif +#endif + +/* Limits of `wchar_t'. */ +#ifndef WCHAR_MIN +/* These constants might also be defined in . */ +# define WCHAR_MIN __WCHAR_MIN +# define WCHAR_MAX __WCHAR_MAX +#endif + +/* Limits of `wint_t'. */ +#define WINT_MIN (0u) +#define WINT_MAX (4294967295u) + +/* Signed. */ +#define INT8_C(_c) _c +#define INT16_C(_c) _c +#define INT32_C(_c) _c +#if __WORDSIZE == 64 +# define INT64_C(_c) _c##L +#else +# define INT64_C(_c) _c##LL +#endif + +/* Unsigned. */ +#define UINT8_C(_c) _c +#define UINT16_C(_c) _c +#define UINT32_C(_c) _c##U +#if __WORDSIZE == 64 +# define UINT64_C(_c) _c##UL +#else +# define UINT64_C(_c) _c##ULL +#endif + +/* Maximal type. */ +#if __WORDSIZE == 64 +# define INTMAX_C(_c) _c##L +# define UINTMAX_C(_c) _c##UL +#else +# define INTMAX_C(_c) _c##LL +# define UINTMAX_C(_c) _c##ULL +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_STDINT_H */ diff --git a/src/libc/include/stdio.h b/src/libc/include/stdio.h new file mode 100644 index 000000000..1b51ae3a2 --- /dev/null +++ b/src/libc/include/stdio.h @@ -0,0 +1,71 @@ + +/** + * @file stdio.h + * @brief stdio 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/mpaland/printf + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STDIO_H +#define SIMPLEKERNEL_STDIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdarg.h" +#include "stddef.h" +#include "stdint.h" + +/** + * Tiny sprintf implementation + * Due to security reasons (buffer overflow) YOU SHOULD CONSIDER USING + * (V)SNPRINTF INSTEAD! \param buffer A pointer to the buffer where to store the + * formatted string. MUST be big enough to store the output! \param format A + * string that specifies the format of the output \return The number of + * characters that are WRITTEN into the buffer, not counting the terminating + * null character + */ +#define sprintf sprintf_ +int sprintf_(char* _buffer, const char* _format, ...); + +/** + * Tiny snprintf/vsnprintf implementation + * \param buffer A pointer to the buffer where to store the formatted string + * \param count The maximum number of characters to store in the buffer, + * including a terminating null character \param format A string that specifies + * the format of the output \param va A value identifying a variable arguments + * list \return The number of characters that COULD have been written into the + * buffer, not counting the terminating null character. A value equal or larger + * than count indicates truncation. Only when the returned value is non-negative + * and less than count, the string has been completely written. + */ +#define snprintf snprintf_ +#define vsnprintf vsnprintf_ +int snprintf_(char* _buffer, size_t _count, const char* _format, ...); +int vsnprintf_(char* _buffer, size_t _count, const char* _format, va_list _va); +int _vsnprintf(char* _buffer, const size_t _maxlen, const char* _format, + va_list _va); + +int32_t printf(const char* _fmt, ...); + +int32_t info(const char* _fmt, ...); + +int32_t warn(const char* _fmt, ...); + +int32_t err(const char* _fmt, ...); + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_STDIO_H */ diff --git a/src/libc/include/stdlib.h b/src/libc/include/stdlib.h new file mode 100644 index 000000000..726ca670b --- /dev/null +++ b/src/libc/include/stdlib.h @@ -0,0 +1,47 @@ + +/** + * @file stdlib.h + * @brief stdlib 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STDLIB_H +#define SIMPLEKERNEL_STDLIB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stddef.h" +#include "stdint.h" + +int abs(int); +int atoi(const char*); +long atol(const char*); +long long atoll(const char*); +int itoa(int _num, char* _str, int _len, int _base); +long strtol(const char* _nptr, char** _endptr, int _base); +long long strtoll(const char* _nptr, char** _endptr, int _base); + +void* malloc(size_t size); + +void free(void* ptr); + +void* kmalloc(size_t size); + +void kfree(void* ptr); + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_STDLIB_H */ diff --git a/src/libc/include/string.h b/src/libc/include/string.h new file mode 100644 index 000000000..5881a4742 --- /dev/null +++ b/src/libc/include/string.h @@ -0,0 +1,51 @@ + +/** + * @file string.h + * @brief string 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STRING_H +#define SIMPLEKERNEL_STRING_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stddef.h" +#include "stdint.h" + +extern void* memcpy(void* _dest, const void* _src, size_t _len); +extern void* memset(void* _dest, int val, size_t _len); +extern int memcmp(const void* _str1, const void* _str2, size_t _count); +extern void* memmove(void* _dest, const void* _src, size_t _len); +extern void bzero(void* _dest, uint32_t _len); +// 字符串比较 +extern int strcmp(const char* _src, const char* _dest); +extern int strncmp(const char* _s1, const char* _s2, size_t _n); +extern char* strcpy(char* _dest, const char* _src); +extern char* strncpy(char* _s1, const char* _s2, size_t _n); +// 字符串合并 +extern char* strcat(char* _dest, const char* _src); +extern char* strchr(const char* _s, int _c); +// length of string +extern size_t strlen(const char* _src); +extern size_t strnlen(const char* _str, size_t _maxlen); +extern void backspace(char* _src); +extern void append(char* _src, char _dest); +extern void strrev(char* _str); + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_STRING_H */ diff --git a/src/libc/include/time.h b/src/libc/include/time.h new file mode 100644 index 000000000..2527ff3bd --- /dev/null +++ b/src/libc/include/time.h @@ -0,0 +1,10 @@ + +// This file is a part of Simple-XX/SimpleKernel +// (https://github.com/Simple-XX/SimpleKernel). +// +// time.h for Simple-XX/SimpleKernel. + +// #ifndef _TIME_H_ +// #define _TIME_H_ +// +// #endif /* _TIME_H_ */ diff --git a/src/libc/src/math/math.c b/src/libc/src/math/math.c new file mode 100644 index 000000000..0a26daa61 --- /dev/null +++ b/src/libc/src/math/math.c @@ -0,0 +1,92 @@ + +/** + * @file math.c + * @brief math 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on libgcc + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "math.h" + +long long divmoddi4(long long _num, long long _den, long long* _rem_p) { + int minus = 0; + long long v; + + if (_num < 0) { + _num = -_num; + minus = 1; + } + if (_den < 0) { + _den = -_den; + minus ^= 1; + } + + v = udivmoddi4(_num, _den, (unsigned long long*)_rem_p); + if (minus) { + v = -v; + if (_rem_p) { + *_rem_p = -(*_rem_p); + } + } + + return v; +} + +// BUG: 在 x86_64 下观察到了精度损失 +unsigned long long udivmoddi4(unsigned long long _num, unsigned long long _den, + unsigned long long* _rem_p) { + unsigned long long quot = 0, qbit = 1; + + if (_den == 0) { + return 1 / ((unsigned)_den); /* Intentional divide by zero, without + triggering a compiler warning which + would abort the build */ + } + + /* Left-justify denominator and count shift */ + while ((long long)_den >= 0) { + _den <<= 1; + qbit <<= 1; + } + + while (qbit) { + if (_den <= _num) { + _num -= _den; + quot += qbit; + } + _den >>= 1; + qbit >>= 1; + } + + if (_rem_p) { + *_rem_p = _num; + } + return quot; +} + +unsigned long long udivdi3(unsigned long long _num, unsigned long long _den) { + return udivmoddi4(_num, _den, 0); +} + +unsigned long long umoddi3(unsigned long long _num, unsigned long long _den) { + unsigned long long v; + (void)udivmoddi4(_num, _den, &v); + return v; +} + +#ifdef __cplusplus +} +#endif diff --git a/src/libc/src/stdio/vsprintf.c b/src/libc/src/stdio/vsprintf.c new file mode 100644 index 000000000..8420ac755 --- /dev/null +++ b/src/libc/src/stdio/vsprintf.c @@ -0,0 +1,960 @@ + +/** + * @file vsprintf.c + * @brief vsprintf 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/mpaland/printf + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "math.h" +#include "stdarg.h" +#include "stdbool.h" +#include "stddef.h" +#include "stdint.h" +#include "stdio.h" + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE +# define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE +# define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +#define PRINTF_DISABLE_SUPPORT_FLOAT +#ifndef PRINTF_DISABLE_SUPPORT_FLOAT +# define PRINTF_SUPPORT_FLOAT +#endif + +// support for exponential floating point notation (%e/%g) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL +# define PRINTF_SUPPORT_EXPONENTIAL +#endif + +// define the default floating point precision +// default: 6 digits +#ifndef PRINTF_DEFAULT_FLOAT_PRECISION +# define PRINTF_DEFAULT_FLOAT_PRECISION 6U +#endif + +// define the largest float suitable to print with %f +// default: 1e9 +#ifndef PRINTF_MAX_FLOAT +# define PRINTF_MAX_FLOAT 1e9 +#endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG +# define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T +# define PRINTF_SUPPORT_PTRDIFF_T +#endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + +// import float.h for DBL_MAX +#if defined(PRINTF_SUPPORT_FLOAT) +# include "float.h" +#endif + +// output function type +typedef void (*out_fct_type)(char _character, void* _buffer, size_t _idx, + size_t _maxlen); + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char _character, void* arg); + void* arg; +} out_fct_wrap_type; + +// internal buffer output +inline static void +_out_buffer(char _character, void* _buffer, size_t _idx, size_t _maxlen) { + if (_idx < _maxlen) { + ((char*)_buffer)[_idx] = _character; + } +} + +// internal null output +inline static void +_out_null(char _character, void* _buffer, size_t _idx, size_t _maxlen) { + (void)_character; + (void)_buffer; + (void)_idx; + (void)_maxlen; +} + +// internal secure strlen +// \return The length of the string (excluding the terminating 0) limited by +// 'maxsize' +inline static unsigned int _strnlen_s(const char* _str, size_t _maxsize) { + const char* s; + for (s = _str; *s && _maxsize--; ++s) + ; + return (unsigned int)(s - _str); +} + +// internal test if char is a digit (0-9) +// \return true if char is a digit +inline static bool _is_digit(char _ch) { + return (_ch >= '0') && (_ch <= '9'); +} + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char** _str) { + unsigned int i = 0U; + while (_is_digit(**_str)) { + i = i * 10U + (unsigned int)(*((*_str)++) - '0'); + } + return i; +} + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type _out, char* _buffer, size_t _idx, + size_t _maxlen, const char* _buf, size_t _len, + unsigned int _width, unsigned int _flags) { + const size_t start_idx = _idx; + + // pad spaces up to given _width + if (!(_flags & FLAGS_LEFT) && !(_flags & FLAGS_ZEROPAD)) { + for (size_t i = _len; i < _width; i++) { + _out(' ', _buffer, _idx++, _maxlen); + } + } + + // reverse string + while (_len) { + _out(_buf[--_len], _buffer, _idx++, _maxlen); + } + + // append pad spaces up to given width + if (_flags & FLAGS_LEFT) { + while (_idx - start_idx < _width) { + _out(' ', _buffer, _idx++, _maxlen); + } + } + + return _idx; +} + +// internal itoa format +static size_t +_ntoa_format(out_fct_type _out, char* _buffer, size_t _idx, size_t _maxlen, + char* _buf, size_t _len, bool _negative, unsigned int _base, + unsigned int _prec, unsigned int _width, unsigned int _flags) { + // pad leading zeros + if (!(_flags & FLAGS_LEFT)) { + if (_width && (_flags & FLAGS_ZEROPAD) + && (_negative || (_flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + _width--; + } + while ((_len < _prec) && (_len < PRINTF_NTOA_BUFFER_SIZE)) { + _buf[_len++] = '0'; + } + while ((_flags & FLAGS_ZEROPAD) && (_len < _width) + && (_len < PRINTF_NTOA_BUFFER_SIZE)) { + _buf[_len++] = '0'; + } + } + + // handle hash + if (_flags & FLAGS_HASH) { + if (!(_flags & FLAGS_PRECISION) && _len + && ((_len == _prec) || (_len == _width))) { + _len--; + if (_len && (_base == 16U)) { + _len--; + } + } + if ((_base == 16U) && !(_flags & FLAGS_UPPERCASE) + && (_len < PRINTF_NTOA_BUFFER_SIZE)) { + _buf[_len++] = 'x'; + } + else if ((_base == 16U) && (_flags & FLAGS_UPPERCASE) + && (_len < PRINTF_NTOA_BUFFER_SIZE)) { + _buf[_len++] = 'X'; + } + else if ((_base == 2U) && (_len < PRINTF_NTOA_BUFFER_SIZE)) { + _buf[_len++] = 'b'; + } + if (_len < PRINTF_NTOA_BUFFER_SIZE) { + _buf[_len++] = '0'; + } + } + + if (_len < PRINTF_NTOA_BUFFER_SIZE) { + if (_negative) { + _buf[_len++] = '-'; + } + else if (_flags & FLAGS_PLUS) { + _buf[_len++] = '+'; // ignore the space if the '+' exists + } + else if (_flags & FLAGS_SPACE) { + _buf[_len++] = ' '; + } + } + + return _out_rev(_out, _buffer, _idx, _maxlen, _buf, _len, _width, _flags); +} + +// internal itoa for 'long' type +static size_t +_ntoa_long(out_fct_type _out, char* _buffer, size_t _idx, size_t _maxlen, + unsigned long _value, bool _negative, unsigned long _base, + unsigned int _prec, unsigned int _width, unsigned int _flags) { + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!_value) { + _flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and _value is != 0 + if (!(_flags & FLAGS_PRECISION) || _value) { + do { + const char digit = (char)(_value % _base); + buf[len++] = digit < 10 + ? '0' + digit + : (_flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + _value /= _base; + } while (_value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(_out, _buffer, _idx, _maxlen, buf, len, _negative, + (unsigned int)_base, _prec, _width, _flags); +} + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t +_ntoa_long_long(out_fct_type _out, char* _buffer, size_t _idx, size_t _maxlen, + unsigned long long _value, bool _negative, + unsigned long long _base, unsigned int _prec, + unsigned int _width, unsigned int _flags) { + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!_value) { + _flags &= ~FLAGS_HASH; + } + +# if defined(__i386__) + // write if precision != 0 and _value is != 0 + if (!(_flags & FLAGS_PRECISION) || _value) { + do { + unsigned long long no; + unsigned long long t = udivmoddi4(_value, _base, &no); + const char digit = (char)t; + buf[len++] = digit < 10 + ? '0' + digit + : (_flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + _value = udivdi3(_value, _base); + } while (_value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } +# else + // write if precision != 0 and value is != 0 + if (!(_flags & FLAGS_PRECISION) || _value) { + do { + const char digit = (char)(_value % _base); + buf[len++] = digit < 10 + ? '0' + digit + : (_flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + _value /= _base; + } while (_value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } +# endif + return _ntoa_format(_out, _buffer, _idx, _maxlen, buf, len, _negative, + (unsigned int)_base, _prec, _width, _flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + +#if defined(PRINTF_SUPPORT_FLOAT) + +# if defined(PRINTF_SUPPORT_EXPONENTIAL) +// forward declaration so that _ftoa can switch to exp notation for values > +// PRINTF_MAX_FLOAT +static size_t _etoa(out_fct_type _out, char* _buffer, size_t _idx, + size_t _maxlen, double _value, unsigned int _prec, + unsigned int _width, unsigned int _flags); +# endif + +// internal ftoa for fixed decimal floating point +static size_t _ftoa(out_fct_type _out, char* _buffer, size_t _idx, + size_t _maxlen, double _value, unsigned int _prec, + unsigned int _width, unsigned int _flags) { + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // powers of 10 + static const double pow10[] + = { 1, 10, 100, 1000, 10000, + 100000, 1000000, 10000000, 100000000, 1000000000 }; + + // test for special values + if (_value != _value) { + return _out_rev(_out, _buffer, _idx, _maxlen, "nan", 3, _width, _flags); + } + if (_value < -DBL_MAX) { + return _out_rev(_out, _buffer, _idx, _maxlen, "fni-", 4, _width, + _flags); + } + if (_value > DBL_MAX) { + return _out_rev(_out, _buffer, _idx, _maxlen, + (_flags & FLAGS_PLUS) ? "fni+" : "fni", + (_flags & FLAGS_PLUS) ? 4U : 3U, _width, _flags); + } + + // test for very large values + // standard printf behavior is to print EVERY whole number digit -- which + // could be 100s of characters overflowing your buffers == bad + if ((_value > PRINTF_MAX_FLOAT) || (_value < -PRINTF_MAX_FLOAT)) { +# if defined(PRINTF_SUPPORT_EXPONENTIAL) + return _etoa(_out, _buffer, _idx, _maxlen, _value, _prec, _width, + _flags); +# else + return 0U; +# endif + } + + // test for negative + bool negative = false; + if (_value < 0) { + negative = true; + _value = 0 - _value; + } + + // set default precision, if not set explicitly + if (!(_flags & FLAGS_PRECISION)) { + _prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (_prec > 9U)) { + buf[len++] = '0'; + _prec--; + } + + int whole = (int)_value; + double tmp = (_value - whole) * pow10[_prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if (diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if (frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } + else if (diff < 0.5) { + } + else if ((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + if (prec == 0U) { + diff = _value - (double)whole; + if ((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } + else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while (len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if (!(frac /= 10U)) { + break; + } + } + // add extra 0s + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if (len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while (len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if (!(whole /= 10)) { + break; + } + } + + // pad leading zeros + if (!(_flags & FLAGS_LEFT) && (_flags & FLAGS_ZEROPAD)) { + if (_width && (negative || (_flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + _width--; + } + while ((len < _width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + if (len < PRINTF_FTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } + else if (_flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if (_flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(_out, _buffer, _idx, _maxlen, buf, len, _width, _flags); +} + +# if defined(PRINTF_SUPPORT_EXPONENTIAL) +// internal ftoa variant for exponential floating-point type, contributed by +// Martijn Jasperse +static size_t _etoa(out_fct_type _out, char* _buffer, size_t _idx, + size_t _maxlen, double _value, unsigned int _prec, + unsigned int _width, unsigned int _flags) { + // check for NaN and special values + if ((_value != _value) || (_value > DBL_MAX) || (_value < -DBL_MAX)) { + return _ftoa(_out, _buffer, _idx, _maxlen, _value, _prec, _width, + _flags); + } + + // determine the sign + const bool negative = _value < 0; + if (negative) { + _value = -_value; + } + + // default precision + if (!(_flags & FLAGS_PRECISION)) { + _prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + + // determine the decimal exponent + // based on the algorithm by David Gay + // (https://www.ampl.com/netlib/fp/dtoa.c) + union { + uint64_t U; + double F; + } conv; + + conv.F = _value; + int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 + conv.U = (conv.U & ((1ULL << 52U) - 1U)) + | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) + // now approximate log10 from the log2 integer part and an expansion of ln + // around 1.5 + int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + + (conv.F - 1.5) * 0.289529654602168); + // now we want to compute 10^expval but we want to be sure it won't overflow + exp2 = (int)(expval * 3.321928094887362 + 0.5); + const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; + const double z2 = z * z; + conv.U = (uint64_t)(exp2 + 1023) << 52U; + // compute exp(z) using continued fractions, see + // https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex + conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); + // correct for rounding errors + if (_value < conv.F) { + expval--; + conv.F /= 10; + } + + // the exponent format is "%+03d" and largest value is "307", so set aside + // 4-5 characters + unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; + + // in "%g" mode, "prec" is the number of *significant figures* not decimals + if (_flags & FLAGS_ADAPT_EXP) { + // do we want to fall-back to "%f" mode? + if ((_value >= 1e-4) && (_value < 1e6)) { + if ((int)_prec > expval) { + _prec = (unsigned)((int)_prec - expval - 1); + } + else { + _prec = 0; + } + _flags |= FLAGS_PRECISION; // make sure _ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; + } + else { + // we use one sigfig for the whole part + if ((_prec > 0) && (_flags & FLAGS_PRECISION)) { + --_prec; + } + } + } + + // will everything fit? + unsigned int fwidth = _width; + if (_width > minwidth) { + // we didn't fall-back so subtract the characters required for the + // exponent + fwidth -= minwidth; + } + else { + // not enough characters, so go back to default sizing + fwidth = 0U; + } + if ((_flags & FLAGS_LEFT) && minwidth) { + // if we're padding on the right, DON'T pad the floating part + fwidth = 0U; + } + + // rescale the float value + if (expval) { + _value /= conv.F; + } + + // output the floating part + const size_t start_idx = _idx; + _idx = _ftoa(_out, _buffer, _idx, _maxlen, negative ? -_value : _value, + _prec, fwidth, _flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if (minwidth) { + // output the exponential symbol + _out((_flags & FLAGS_UPPERCASE) ? 'E' : 'e', _buffer, _idx++, _maxlen); + // output the exponent value + _idx = _ntoa_long(_out, _buffer, _idx, _maxlen, + (expval < 0) ? -expval : expval, expval < 0, 10, 0, + minwidth - 1, FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if (_flags & FLAGS_LEFT) { + while (_idx - start_idx < _width) { + _out(' ', _buffer, _idx++, _maxlen); + } + } + } + return _idx; +} + +# endif /* PRINTF_SUPPORT_EXPONENTIAL */ +#endif /* PRINTF_SUPPORT_FLOAT */ + +// internal vsnprintf +int _vsnprintf(char* _buffer, const size_t _maxlen, const char* _format, + va_list _va) { + out_fct_type out = _out_buffer; + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if (!_buffer) { + // use null output function + out = _out_null; + } + + while (*_format) { + // _format specifier? %[flags][width][.precision][length] + if (*_format != '%') { + // no + out(*_format, _buffer, idx++, _maxlen); + _format++; + continue; + } + else { + // yes, evaluate it + _format++; + } + + // evaluate flags + flags = 0U; + do { + switch (*_format) { + case '0': + flags |= FLAGS_ZEROPAD; + _format++; + n = 1U; + break; + case '-': + flags |= FLAGS_LEFT; + _format++; + n = 1U; + break; + case '+': + flags |= FLAGS_PLUS; + _format++; + n = 1U; + break; + case ' ': + flags |= FLAGS_SPACE; + _format++; + n = 1U; + break; + case '#': + flags |= FLAGS_HASH; + _format++; + n = 1U; + break; + default: + n = 0U; + break; + } + } while (n); + + // evaluate width field + width = 0U; + if (_is_digit(*_format)) { + width = _atoi(&_format); + } + else if (*_format == '*') { + const int w = va_arg(_va, int); + if (w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int)-w; + } + else { + width = (unsigned int)w; + } + _format++; + } + + // evaluate precision field + precision = 0U; + if (*_format == '.') { + flags |= FLAGS_PRECISION; + _format++; + if (_is_digit(*_format)) { + precision = _atoi(&_format); + } + else if (*_format == '*') { + const int prec = (int)va_arg(_va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + _format++; + } + } + + // evaluate length field + switch (*_format) { + case 'l': + flags |= FLAGS_LONG; + _format++; + if (*_format == 'l') { + flags |= FLAGS_LONG_LONG; + _format++; + } + break; + case 'h': + flags |= FLAGS_SHORT; + _format++; + if (*_format == 'h') { + flags |= FLAGS_CHAR; + _format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't': + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG + : FLAGS_LONG_LONG); + _format++; + break; +#endif + case 'j': + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG + : FLAGS_LONG_LONG); + _format++; + break; + case 'z': + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG + : FLAGS_LONG_LONG); + _format++; + break; + default: + break; + } + + // evaluate specifier + switch (*_format) { + case 'd': + case 'i': + case 'u': + case 'x': + case 'X': + case 'o': + case 'b': { + // set the base + unsigned int base; + if (*_format == 'x' || *_format == 'X') { + base = 16U; + } + else if (*_format == 'o') { + base = 8U; + } + else if (*_format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec _format + } + // uppercase + if (*_format == 'X') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if ((*_format != 'i') && (*_format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if (flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if ((*_format == 'i') || (*_format == 'd')) { + // signed + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(_va, long long); + idx = _ntoa_long_long( + out, _buffer, idx, _maxlen, + (unsigned long long)(value > 0 ? value : 0 - value), + value < 0, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + const long value = va_arg(_va, long); + idx = _ntoa_long(out, _buffer, idx, _maxlen, + (unsigned long)(value > 0 ? value + : 0 - value), + value < 0, base, precision, width, + flags); + } + else { + const int value + = (flags & FLAGS_CHAR) ? (char)va_arg(_va, int) + : (flags & FLAGS_SHORT) ? (short int)va_arg(_va, int) + : va_arg(_va, int); + idx = _ntoa_long(out, _buffer, idx, _maxlen, + (unsigned int)(value > 0 ? value + : 0 - value), + value < 0, base, precision, width, + flags); + } + } + else { + // unsigned + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, _buffer, idx, _maxlen, + va_arg(_va, unsigned long long), + false, base, precision, width, + flags); +#endif + } + else if (flags & FLAGS_LONG) { + idx = _ntoa_long(out, _buffer, idx, _maxlen, + va_arg(_va, unsigned long), false, + base, precision, width, flags); + } + else { + const unsigned int value + = (flags & FLAGS_CHAR) + ? (unsigned char)va_arg(_va, unsigned int) + : (flags & FLAGS_SHORT) + ? (unsigned short int)va_arg(_va, unsigned int) + : va_arg(_va, unsigned int); + idx = _ntoa_long(out, _buffer, idx, _maxlen, value, + false, base, precision, width, flags); + } + } + _format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f': + case 'F': + if (*_format == 'F') { + flags |= FLAGS_UPPERCASE; + } + idx = _ftoa(out, _buffer, idx, _maxlen, va_arg(_va, double), + precision, width, flags); + _format++; + break; +# if defined(PRINTF_SUPPORT_EXPONENTIAL) + case 'e': + case 'E': + case 'g': + case 'G': + if ((*_format == 'g') || (*_format == 'G')) { + flags |= FLAGS_ADAPT_EXP; + } + if ((*_format == 'E') || (*_format == 'G')) { + flags |= FLAGS_UPPERCASE; + } + idx = _etoa(out, _buffer, idx, _maxlen, va_arg(_va, double), + precision, width, flags); + _format++; + break; +# endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + case 'c': { + unsigned int l = 1U; + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', _buffer, idx++, _maxlen); + } + } + // char output + out((char)va_arg(_va, int), _buffer, idx++, _maxlen); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', _buffer, idx++, _maxlen); + } + } + _format++; + break; + } + + case 's': { + const char* p = va_arg(_va, char*); + unsigned int l + = _strnlen_s(p, precision ? precision : (size_t)-1); + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', _buffer, idx++, _maxlen); + } + } + // string output + while ((*p != 0) + && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), _buffer, idx++, _maxlen); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', _buffer, idx++, _maxlen); + } + } + _format++; + break; + } + + case 'p': { + width = sizeof(void*) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; +#if defined(PRINTF_SUPPORT_LONG_LONG) + const bool is_ll = sizeof(uintptr_t) == sizeof(long long); + if (is_ll) { + idx = _ntoa_long_long(out, _buffer, idx, _maxlen, + (unsigned long)va_arg(_va, void*), + false, 16U, precision, width, flags); + } + else { +#endif + idx = _ntoa_long( + out, _buffer, idx, _maxlen, + (unsigned long)((unsigned long)va_arg(_va, void*)), false, + 16U, precision, width, flags); +#if defined(PRINTF_SUPPORT_LONG_LONG) + } +#endif + _format++; + break; + } + + case '%': + out('%', _buffer, idx++, _maxlen); + _format++; + break; + + default: + out(*_format, _buffer, idx++, _maxlen); + _format++; + break; + } + } + + // termination + out((char)0, _buffer, idx < _maxlen ? idx : _maxlen - 1U, _maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + +int sprintf_(char* _buffer, const char* _format, ...) { + va_list va; + va_start(va, _format); + // const int ret = _vsnprintf(_buffer, (size_t)-1, _format, va); + const int ret = _vsnprintf(_buffer, (size_t)-1, "TEST:%d\n", va); + va_end(va); + return ret; +} + +int snprintf_(char* _buffer, size_t _count, const char* _format, ...) { + va_list va; + va_start(va, _format); + const int ret = _vsnprintf(_buffer, _count, _format, va); + va_end(va); + return ret; +} + +int vsnprintf_(char* _buffer, size_t _count, const char* _format, va_list _va) { + return _vsnprintf(_buffer, _count, _format, _va); +} + +#ifdef __cplusplus +} +#endif diff --git a/src/libc/src/stdlib/atoi.c b/src/libc/src/stdlib/atoi.c new file mode 100644 index 000000000..1c97acaa2 --- /dev/null +++ b/src/libc/src/stdlib/atoi.c @@ -0,0 +1,34 @@ + +/** + * @file atoi.c + * @brief atoi 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "stddef.h" +#include "stdlib.h" + +int abs(int _i) { + return _i < 0 ? -_i : _i; +} + +int atoi(const char* _str) { + return (int)strtol(_str, (char**)NULL, 10); +} + +long atol(const char* _str) { + return (long)strtoll(_str, (char**)NULL, 10); +} + +long long atoll(const char* _str) { + return (long long)strtoll(_str, (char**)NULL, 10); +} diff --git a/src/libc/src/stdlib/itoa.c b/src/libc/src/stdlib/itoa.c new file mode 100644 index 000000000..8d3517e43 --- /dev/null +++ b/src/libc/src/stdlib/itoa.c @@ -0,0 +1,43 @@ + +/** + * @file itoa.c + * @brief itoa 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "stdlib.h" +#include "string.h" + +int itoa(int _num, char* _str, int _len, int _base) { + int sum = _num; + int i = 0; + int digit; + if (_len == 0) { + return -1; + } + do { + digit = sum % _base; + if (digit < 0xA) { + _str[i++] = '0' + digit; + } + else { + _str[i++] = 'A' + digit - 0xA; + } + sum /= _base; + } while (sum && (i < (_len - 1))); + if (i == (_len - 1) && sum) { + return -1; + } + _str[i] = '\0'; + strrev(_str); + return 0; +} diff --git a/src/libc/src/stdlib/strtol.c b/src/libc/src/stdlib/strtol.c new file mode 100644 index 000000000..d73a20c71 --- /dev/null +++ b/src/libc/src/stdlib/strtol.c @@ -0,0 +1,207 @@ + +/** + * @file strtol.c + * @brief strtol 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on libgcc + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "ctype.h" +#include "limits.h" +#include "math.h" +#include "stdlib.h" + +/* + * Convert a string to a long integer. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +long strtol(const char* _nptr, char** _endptr, int _base) { + const char* s = _nptr; + unsigned long acc; + int c; + unsigned long cutoff; + int neg = 0, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } + else if (c == '+') { + c = *s++; + } + if ((_base == 0 || _base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + _base = 16; + } + if (_base == 0) { + _base = c == '0' ? 8 : 10; + } + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; + cutlim = cutoff % (unsigned long)_base; + cutoff /= (unsigned long)_base; + for (acc = 0, any = 0;; c = *s++) { + if (isdigit(c)) { + c -= '0'; + } + else if (isalpha(c)) { + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + } + else { + break; + } + if (c >= _base) { + break; + } + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + } + else { + any = 1; + acc *= _base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LONG_MIN : LONG_MAX; + } + else if (neg) { + acc = -acc; + } + if (_endptr != 0) { + *_endptr = (char*)(any ? s - 1 : _nptr); + } + return (acc); +} + +/* + * Convert a string to a long long integer. + * + * Ignores `locale' stuff. Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +long long strtoll(const char* _nptr, char** _endptr, int _base) { + const char* s = _nptr; + long long acc; + int c; + long long cutoff; + int neg = 0, any, cutlim; + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + do { + c = *s++; + } while (isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } + else if (c == '+') { + c = *s++; + } + if ((_base == 0 || _base == 16) && c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + _base = 16; + } + if (_base == 0) { + _base = c == '0' ? 8 : 10; + } + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for longs is + * [-2147483648..2147483647] and the input base is 10, + * cutoff will be set to 214748364 and cutlim to either + * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated + * a value > 214748364, or equal but the next digit is > 7 (or 8), + * the number is too big, and we will return a range error. + * + * Set any if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? (unsigned long long)-(LLONG_MIN + LLONG_MAX) + LLONG_MAX + : LLONG_MAX; + +#if defined(__i386__) + cutoff = udivmoddi4(cutoff, _base, (unsigned long long*)&cutlim); +#else + cutlim = cutoff % (long long)_base; + cutoff /= (long long)_base; +#endif + for (acc = 0, any = 0;; c = *s++) { + if (isdigit(c)) { + c -= '0'; + } + else if (isalpha(c)) { + c -= isupper(c) ? 'A' - 10 : 'a' - 10; + } + else { + break; + } + if (c >= _base) { + break; + } + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) { + any = -1; + } + else { + any = 1; + acc *= _base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LLONG_MIN : LLONG_MAX; + } + else if (neg) { + acc = -acc; + } + if (_endptr != 0) { + *_endptr = (char*)(any ? s - 1 : _nptr); + } + return (acc); +} diff --git a/src/libc/src/string/string.c b/src/libc/src/string/string.c new file mode 100644 index 000000000..3a2470585 --- /dev/null +++ b/src/libc/src/string/string.c @@ -0,0 +1,288 @@ + +/** + * @file string.c + * @brief string 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "string.h" +#include "assert.h" +#include "stddef.h" +#include "stdio.h" + +#define __glibc_unlikely(cond) __builtin_expect((cond), 0) +#define __glibc_likely(cond) __builtin_expect((cond), 1) + +// 获取字符串长度 +size_t strlen(const char* _str) { + size_t len = 0; + while (_str[len]) { + len++; + } + return len; +} + +size_t strnlen(const char* _str, size_t _maxlen) { + const char * char_ptr, *end_ptr = _str + _maxlen; + const unsigned long int* longword_ptr; + unsigned long int longword, himagic, lomagic; + + if (_maxlen == 0) { + return 0; + } + + if (__glibc_unlikely(end_ptr < _str)) { + end_ptr = (const char*)~0UL; + } + + /* Handle the first few characters by reading one character at a time. + Do this until CHAR_PTR is aligned on a longword boundary. */ + for (char_ptr = _str; + ((unsigned long int)char_ptr & (sizeof(longword) - 1)) != 0; + ++char_ptr) { + if (*char_ptr == '\0') { + if (char_ptr > end_ptr) { + char_ptr = end_ptr; + } + return char_ptr - _str; + } + } + + /* All these elucidatory comments refer to 4-byte longwords, + but the theory applies equally well to 8-byte longwords. */ + + longword_ptr = (unsigned long int*)char_ptr; + + /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits + the "holes." Note that there is a hole just to the left of + each byte, with an extra at the end: + + bits: 01111110 11111110 11111110 11111111 + bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD + + The 1-bits make sure that carries propagate to the next 0-bit. + The 0-bits provide holes for carries to fall into. */ + himagic = 0x80808080L; + lomagic = 0x01010101L; + if (sizeof(longword) > 4) { + /* 64-bit version of the magic. */ + /* Do the shift in two steps to avoid a warning if long has 32 bits. */ + himagic = ((himagic << 16) << 16) | himagic; + lomagic = ((lomagic << 16) << 16) | lomagic; + } + assert(sizeof(longword) <= 8); + // if (sizeof(longword) > 8) + // abort(); + assert(sizeof(longword) <= 8); + + /* Instead of the traditional loop which tests each character, + we will test a longword at a time. The tricky part is testing + if *any of the four* bytes in the longword in question are zero. */ + while (longword_ptr < (unsigned long int*)end_ptr) { + longword = *longword_ptr++; + + if ((longword - lomagic) & himagic) { + /* Which of the bytes was the zero? If none of them were, it was + a misfire; continue the search. */ + + const char* cp = (const char*)(longword_ptr - 1); + + char_ptr = cp; + if (cp[0] == 0) { + break; + } + char_ptr = cp + 1; + if (cp[1] == 0) { + break; + } + char_ptr = cp + 2; + if (cp[2] == 0) { + break; + } + char_ptr = cp + 3; + if (cp[3] == 0) { + break; + } + if (sizeof(longword) > 4) { + char_ptr = cp + 4; + if (cp[4] == 0) { + break; + } + char_ptr = cp + 5; + if (cp[5] == 0) { + break; + } + char_ptr = cp + 6; + if (cp[6] == 0) { + break; + } + char_ptr = cp + 7; + if (cp[7] == 0) { + break; + } + } + } + char_ptr = end_ptr; + } + + if (char_ptr > end_ptr) { + char_ptr = end_ptr; + } + return char_ptr - _str; +} + +// 如果 src > dest, 则返回值大于 0,如果 src = dest, 则返回值等于 0, +// 如果 srd < dest ,则返回值小于 0。 +int strcmp(const char* _src, const char* _dest) { + while (*_src && *_dest && (*_src == *_dest)) { + _src++; + _dest++; + } + return *_src - *_dest; +} + +int strncmp(const char* _s1, const char* _s2, size_t _n) { + if (_n == 0) { + return 0; + } + do { + if (*_s1 != *_s2++) { + return (*(const unsigned char*)_s1 + - *(const unsigned char*)(_s2 - 1)); + } + if (*_s1++ == '\0') { + break; + } + } while (--_n != 0); + return 0; +} + +char* strcpy(char* _dest, const char* _src) { + char* address = _dest; + while ((*_dest++ = *_src++) != '\0') { + ; + } + return address; +} + +char* strncpy(char* _s1, const char* _s2, size_t _n) { + size_t size = strnlen(_s2, _n); + if (size != _n) { + memset(_s1 + size, '\0', _n - size); + } + return memcpy(_s1, _s2, size); +} + +void backspace(char* _src) { + size_t len = strlen(_src); + _src[len - 1] = '\0'; +} + +void append(char* _src, char _dest) { + size_t len = strlen(_src); + _src[len] = _dest; + _src[len + 1] = '\0'; +} + +char* strcat(char* _dest, const char* _src) { + uint8_t* add_d = (uint8_t*)_dest; + if (_dest != 0 && _src != 0) { + while (*add_d) { + add_d++; + } + while (*_src) { + *add_d++ = *_src++; + } + } + return _dest; +} + +char* strchr(register const char* _s, int _c) { + do { + if (*_s == _c) { + return (char*)_s; + } + } while (*_s++); + return NULL; +} + +void* memcpy(void* _dest, const void* _src, size_t _len) { + char* d = _dest; + const char* s = _src; + while (_len--) { + *d++ = *s++; + } + return _dest; +} + +void* memset(void* _dest, int _val, size_t _len) { + unsigned char* ptr = _dest; + while (_len-- > 0) { + *ptr++ = _val; + } + return _dest; +} + +void bzero(void* _dest, uint32_t _len) { + memset(_dest, 0, _len); +} + +int memcmp(const void* _str1, const void* _str2, size_t _count) { + register const unsigned char* s1 = (const unsigned char*)_str1; + register const unsigned char* s2 = (const unsigned char*)_str2; + + while (_count-- > 0) { + if (*s1++ != *s2++) { + return s1[-1] < s2[-1] ? -1 : 1; + } + } + return 0; +} + +void* memmove(void* _dest, const void* _src, size_t _len) { + char* d = _dest; + const char* s = _src; + if (d < s) { + while (_len--) { + *d++ = *s++; + } + } + else { + const char* lasts = s + (_len - 1); + char* lastd = d + (_len - 1); + while (_len--) { + *lastd-- = *lasts--; + } + } + return _dest; +} + +void strrev(char* _str) { + int i; + int j; + unsigned char a; + unsigned len = strlen((const char*)_str); + for (i = 0, j = len - 1; i < j; i++, j--) { + a = _str[i]; + _str[i] = _str[j]; + _str[j] = a; + } + return; +} + +#ifdef __cplusplus +} +#endif diff --git a/src/libcxx/CMakeLists.txt b/src/libcxx/CMakeLists.txt new file mode 100644 index 000000000..bf3c61791 --- /dev/null +++ b/src/libcxx/CMakeLists.txt @@ -0,0 +1,16 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# CMakeLists.txt for Simple-XX/SimpleKernel. + +PROJECT(libcxx CXX ASM) + +find_asm_source_files(ASM_SOURCE_FILES ${libcxx_SOURCE_DIR}/src) +aux_source_directory(${libcxx_SOURCE_DIR}/src cxx_src) + +set(libcxx_src ${ASM_SOURCE_FILES} ${cxx_src}) +add_library(${PROJECT_NAME} OBJECT ${libcxx_src}) + +target_include_libc_header_files(${PROJECT_NAME}) +target_include_libcxx_header_files(${PROJECT_NAME}) diff --git a/src/libcxx/include/algo b/src/libcxx/include/algo new file mode 100644 index 000000000..b3f474415 --- /dev/null +++ b/src/libcxx/include/algo @@ -0,0 +1,2509 @@ + +/** + * @file algo + * @brief stl algo 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ALGO +#define SIMPLEKERNEL_ALGO + +// 这个头文件包含了 std 的一系列算法 + +#include "algobase" +#include "functional" +#include "heap_algo" +#include "memory" +#include "stddef.h" +#include "time.h" + +namespace mystl { + +/*****************************************************************************************/ +// all_of +// 检查[first, last)内是否全部元素都满足一元操作 unary_pred 为 true +// 的情况,满足则返回 true +/*****************************************************************************************/ +template +bool all_of(InputIter first, InputIter last, UnaryPredicate unary_pred) { + for (; first != last; ++first) { + if (!unary_pred(*first)) { + return false; + } + } + return true; +} + +/*****************************************************************************************/ +// any_of +// 检查[first, last)内是否存在某个元素满足一元操作 unary_pred 为 true +// 的情况,满足则返回 true +/*****************************************************************************************/ +template +bool any_of(InputIter first, InputIter last, UnaryPredicate unary_pred) { + for (; first != last; ++first) { + if (unary_pred(*first)) { + return true; + } + } + return false; +} + +/*****************************************************************************************/ +// none_of +// 检查[first, last)内是否全部元素都不满足一元操作 unary_pred 为 true +// 的情况,满足则返回 true +/*****************************************************************************************/ +template +bool none_of(InputIter first, InputIter last, UnaryPredicate unary_pred) { + for (; first != last; ++first) { + if (unary_pred(*first)) { + return false; + } + } + return true; +} + +/*****************************************************************************************/ +// count +// 对[first, last)区间内的元素与给定值进行比较,缺省使用 +// operator==,返回元素相等的个数 +/*****************************************************************************************/ +template +size_t count(InputIter first, InputIter last, const T& value) { + size_t n = 0; + for (; first != last; ++first) { + if (*first == value) { + ++n; + } + } + return n; +} + +/*****************************************************************************************/ +// count_if +// 对[first, last)区间内的每个元素都进行一元 unary_pred 操作,返回结果为 +// true 的个数 +/*****************************************************************************************/ +template +size_t count_if(InputIter first, InputIter last, UnaryPredicate unary_pred) { + size_t n = 0; + for (; first != last; ++first) { + if (unary_pred(*first)) { + ++n; + } + } + return n; +} + +/*****************************************************************************************/ +// find +// 在[first, last)区间内找到等于 value 的元素,返回指向该元素的迭代器 +/*****************************************************************************************/ +template +InputIter find(InputIter first, InputIter last, const T& value) { + while (first != last && *first != value) { + ++first; + } + return first; +} + +/*****************************************************************************************/ +// find_if +// 在[first, last)区间内找到第一个令一元操作 unary_pred 为 true +// 的元素并返回指向该元素的迭代器 +/*****************************************************************************************/ +template +InputIter find_if(InputIter first, InputIter last, UnaryPredicate unary_pred) { + while (first != last && !unary_pred(*first)) { + ++first; + } + return first; +} + +/*****************************************************************************************/ +// find_if_not +// 在[first, last)区间内找到第一个令一元操作 unary_pred 为 false +// 的元素并返回指向该元素的迭代器 +/*****************************************************************************************/ +template +InputIter +find_if_not(InputIter first, InputIter last, UnaryPredicate unary_pred) { + while (first != last && unary_pred(*first)) { + ++first; + } + return first; +} + +/*****************************************************************************************/ +// search +// 在[first1, last1)中查找[first2, last2)的首次出现点 +/*****************************************************************************************/ +template +ForwardIter1 search(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2) { + auto d1 = mystl::distance(first1, last1); + auto d2 = mystl::distance(first2, last2); + if (d1 < d2) { + return last1; + } + auto current1 = first1; + auto current2 = first2; + while (current2 != last2) { + if (*current1 == *current2) { + ++current1; + ++current2; + } + else { + if (d1 == d2) { + return last1; + } + else { + current1 = ++first1; + current2 = first2; + --d1; + } + } + } + return first1; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +ForwardIter1 search(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2, Compared comp) { + auto d1 = mystl::distance(first1, last1); + auto d2 = mystl::distance(first2, last2); + if (d1 < d2) { + return last1; + } + auto current1 = first1; + auto current2 = first2; + while (current2 != last2) { + if (comp(*current1, *current2)) { + ++current1; + ++current2; + } + else { + if (d1 == d2) { + return last1; + } + else { + current1 = ++first1; + current2 = first2; + --d1; + } + } + } + return first1; +} + +/*****************************************************************************************/ +// search_n +// 在[first, last)中查找连续 n 个 value +// 所形成的子序列,返回一个迭代器指向该子序列的起始处 +/*****************************************************************************************/ +template +ForwardIter +search_n(ForwardIter first, ForwardIter last, Size n, const T& value) { + if (n <= 0) { + return first; + } + else { + first = mystl::find(first, last, value); + while (first != last) { + auto m = n - 1; + auto i = first; + ++i; + while (i != last && m != 0 && *i == value) { + ++i; + --m; + } + if (m == 0) { + return first; + } + else { + first = mystl::find(i, last, value); + } + } + return last; + } +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +ForwardIter search_n(ForwardIter first, ForwardIter last, Size n, + const T& value, Compared comp) { + if (n <= 0) { + return first; + } + else { + while (first != last) { + if (comp(*first, value)) { + break; + } + ++first; + } + while (first != last) { + auto m = n - 1; + auto i = first; + ++i; + while (i != last && m != 0 && comp(*i, value)) { + ++i; + --m; + } + if (m == 0) { + return first; + } + else { + while (i != last) { + if (comp(*i, value)) { + break; + } + ++i; + } + first = i; + } + } + return last; + } +} + +/*****************************************************************************************/ +// find_end +// 在[first1, last1)区间中查找[first2, +// last2)最后一次出现的地方,若不存在返回 last1 +/*****************************************************************************************/ +// find_end_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter1 find_end_dispatch(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2, + forward_iterator_tag, forward_iterator_tag) { + if (first2 == last2) { + return last1; + } + else { + auto result = last1; + while (true) { + // 利用 search 查找某个子序列的首次出现点,找不到则返回 last1 + auto new_result = mystl::search(first1, last1, first2, last2); + if (new_result == last1) { + return result; + } + else { + result = new_result; + first1 = new_result; + ++first1; + } + } + } +} + +// find_end_dispatch 的 bidirectional_iterator_tag 版本 +template +BidirectionalIter1 +find_end_dispatch(BidirectionalIter1 first1, BidirectionalIter1 last1, + BidirectionalIter2 first2, BidirectionalIter2 last2, + bidirectional_iterator_tag, bidirectional_iterator_tag) { + typedef reverse_iterator reviter1; + typedef reverse_iterator reviter2; + reviter1 rlast1(first1); + reviter2 rlast2(first2); + reviter1 rresult + = mystl::search(reviter1(last1), rlast1, reviter2(last2), rlast2); + if (rresult == rlast1) { + return last1; + } + else { + auto result = rresult.base(); + mystl::advance(result, -mystl::distance(first2, last2)); + return result; + } +} + +template +ForwardIter1 find_end(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2) { + typedef typename iterator_traits::iterator_category Category1; + typedef typename iterator_traits::iterator_category Category2; + return mystl::find_end_dispatch(first1, last1, first2, last2, Category1(), + Category2()); +} + +// 重载版本使用函数对象 comp 代替比较操作 +// find_end_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter1 +find_end_dispatch(ForwardIter1 first1, ForwardIter1 last1, ForwardIter2 first2, + ForwardIter2 last2, forward_iterator_tag, + forward_iterator_tag, Compared comp) { + if (first2 == last2) { + return last1; + } + else { + auto result = last1; + while (true) { + // 利用 search 查找某个子序列的首次出现点,找不到则返回 last1 + auto new_result = mystl::search(first1, last1, first2, last2, comp); + if (new_result == last1) { + return result; + } + else { + result = new_result; + first1 = new_result; + ++first1; + } + } + } +} + +// find_end_dispatch 的 bidirectional_iterator_tag 版本 +template +BidirectionalIter1 +find_end_dispatch(BidirectionalIter1 first1, BidirectionalIter1 last1, + BidirectionalIter2 first2, BidirectionalIter2 last2, + bidirectional_iterator_tag, bidirectional_iterator_tag, + Compared comp) { + typedef reverse_iterator reviter1; + typedef reverse_iterator reviter2; + reviter1 rlast1(first1); + reviter2 rlast2(first2); + reviter1 rresult + = mystl::search(reviter1(last1), rlast1, reviter2(last2), rlast2, comp); + if (rresult == rlast1) { + return last1; + } + else { + auto result = rresult.base(); + mystl::advance(result, -mystl::distance(first2, last2)); + return result; + } +} + +template +ForwardIter1 find_end(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2, Compared comp) { + typedef typename iterator_traits::iterator_category Category1; + typedef typename iterator_traits::iterator_category Category2; + return mystl::find_end_dispatch(first1, last1, first2, last2, Category1(), + Category2(), comp); +} + +/*****************************************************************************************/ +// find_first_of +// 在[first1, last1)中查找[first2, +// last2)中的某些元素,返回指向第一次出现的元素的迭代器 +/*****************************************************************************************/ +template +InputIter find_first_of(InputIter first1, InputIter last1, ForwardIter first2, + ForwardIter last2) { + for (; first1 != last1; ++first1) { + for (auto iter = first2; iter != last2; ++iter) { + if (*first1 == *iter) { + return first1; + } + } + } + return last1; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +InputIter find_first_of(InputIter first1, InputIter last1, ForwardIter first2, + ForwardIter last2, Compared comp) { + for (; first1 != last1; ++first1) { + for (auto iter = first2; iter != last2; ++iter) { + if (comp(*first1, *iter)) { + return first1; + } + } + } + return last1; +} + +/*****************************************************************************************/ +// for_each +// 使用一个函数对象 f 对[first, last)区间内的每个元素执行一个 operator() +// 操作,但不能改变元素内容 f() 可返回一个值,但该值会被忽略 +/*****************************************************************************************/ +template +Function for_each(InputIter first, InputIter last, Function f) { + for (; first != last; ++first) { + f(*first); + } + return f; +} + +/*****************************************************************************************/ +// adjacent_find +// 找出第一对匹配的相邻元素,缺省使用 operator== +// 比较,如果找到返回一个迭代器,指向这对元素的第一个元素 +/*****************************************************************************************/ +template +ForwardIter adjacent_find(ForwardIter first, ForwardIter last) { + if (first == last) { + return last; + } + auto next = first; + while (++next != last) { + if (*first == *next) { + return first; + } + first = next; + } + return last; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +ForwardIter adjacent_find(ForwardIter first, ForwardIter last, Compared comp) { + if (first == last) { + return last; + } + auto next = first; + while (++next != last) { + if (comp(*first, *next)) { + return first; + } + first = next; + } + return last; +} + +/*****************************************************************************************/ +// lower_bound +// 在[first, last)中查找第一个不小于 value +// 的元素,并返回指向它的迭代器,若没有则返回 last +/*****************************************************************************************/ +// lbound_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter lbound_dispatch(ForwardIter first, ForwardIter last, const T& value, + forward_iterator_tag) { + auto len = mystl::distance(first, last); + auto half = len; + ForwardIter middle; + while (len > 0) { + half = len >> 1; + middle = first; + mystl::advance(middle, half); + if (*middle < value) { + first = middle; + ++first; + len = len - half - 1; + } + else { + len = half; + } + } + return first; +} + +// lbound_dispatch 的 random_access_iterator_tag 版本 +template +RandomIter lbound_dispatch(RandomIter first, RandomIter last, const T& value, + random_access_iterator_tag) { + auto len = last - first; + auto half = len; + RandomIter middle; + while (len > 0) { + half = len >> 1; + middle = first + half; + if (*middle < value) { + first = middle + 1; + len = len - half - 1; + } + else { + len = half; + } + } + return first; +} + +template +ForwardIter lower_bound(ForwardIter first, ForwardIter last, const T& value) { + return mystl::lbound_dispatch(first, last, value, iterator_category(first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +// lbound_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter lbound_dispatch(ForwardIter first, ForwardIter last, const T& value, + forward_iterator_tag, Compared comp) { + auto len = mystl::distance(first, last); + auto half = len; + ForwardIter middle; + while (len > 0) { + half = len >> 1; + middle = first; + mystl::advance(middle, half); + if (comp(*middle, value)) { + first = middle; + ++first; + len = len - half - 1; + } + else { + len = half; + } + } + return first; +} + +// lbound_dispatch 的 random_access_iterator_tag 版本 +template +RandomIter lbound_dispatch(RandomIter first, RandomIter last, const T& value, + random_access_iterator_tag, Compared comp) { + auto len = last - first; + auto half = len; + RandomIter middle; + while (len > 0) { + half = len >> 1; + middle = first + half; + if (comp(*middle, value)) { + first = middle + 1; + len = len - half - 1; + } + else { + len = half; + } + } + return first; +} + +template +ForwardIter lower_bound(ForwardIter first, ForwardIter last, const T& value, + Compared comp) { + return mystl::lbound_dispatch(first, last, value, iterator_category(first), + comp); +} + +/*****************************************************************************************/ +// upper_bound +// 在[first, last)中查找第一个大于value +// 的元素,并返回指向它的迭代器,若没有则返回 last +/*****************************************************************************************/ +// ubound_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter ubound_dispatch(ForwardIter first, ForwardIter last, const T& value, + forward_iterator_tag) { + auto len = mystl::distance(first, last); + auto half = len; + ForwardIter middle; + while (len > 0) { + half = len >> 1; + middle = first; + mystl::advance(middle, half); + if (value < *middle) { + len = half; + } + else { + first = middle; + ++first; + len = len - half - 1; + } + } + return first; +} + +// ubound_dispatch 的 random_access_iterator_tag 版本 +template +RandomIter ubound_dispatch(RandomIter first, RandomIter last, const T& value, + random_access_iterator_tag) { + auto len = last - first; + auto half = len; + RandomIter middle; + while (len > 0) { + half = len >> 1; + middle = first + half; + if (value < *middle) { + len = half; + } + else { + first = middle + 1; + len = len - half - 1; + } + } + return first; +} + +template +ForwardIter upper_bound(ForwardIter first, ForwardIter last, const T& value) { + return mystl::ubound_dispatch(first, last, value, iterator_category(first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +// ubound_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter ubound_dispatch(ForwardIter first, ForwardIter last, const T& value, + forward_iterator_tag, Compared comp) { + auto len = mystl::distance(first, last); + auto half = len; + ForwardIter middle; + while (len > 0) { + half = len >> 1; + middle = first; + mystl::advance(middle, half); + if (comp(value, *middle)) { + len = half; + } + else { + first = middle; + ++first; + len = len - half - 1; + } + } + return first; +} + +// ubound_dispatch 的 random_access_iterator_tag 版本 +template +RandomIter ubound_dispatch(RandomIter first, RandomIter last, const T& value, + random_access_iterator_tag, Compared comp) { + auto len = last - first; + auto half = len; + RandomIter middle; + while (len > 0) { + half = len >> 1; + middle = first + half; + if (comp(value, *middle)) { + len = half; + } + else { + first = middle + 1; + len = len - half - 1; + } + } + return first; +} + +template +ForwardIter upper_bound(ForwardIter first, ForwardIter last, const T& value, + Compared comp) { + return mystl::ubound_dispatch(first, last, value, iterator_category(first), + comp); +} + +/*****************************************************************************************/ +// binary_search +// 二分查找,如果在[first, last)内有等同于 value 的元素,返回 true,否则返回 +// false +/*****************************************************************************************/ +template +bool binary_search(ForwardIter first, ForwardIter last, const T& value) { + auto i = mystl::lower_bound(first, last, value); + return i != last && !(value < *i); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool binary_search(ForwardIter first, ForwardIter last, const T& value, + Compared comp) { + auto i = mystl::lower_bound(first, last, value); + return i != last && !comp(value, *i); +} + +/*****************************************************************************************/ +// equal_range +// 查找[first,last)区间中与 value +// 相等的元素所形成的区间,返回一对迭代器指向区间首尾 +// 第一个迭代器指向第一个不小于 value 的元素,第二个迭代器指向第一个大于 +// value 的元素 +/*****************************************************************************************/ +// erange_dispatch 的 forward_iterator_tag 版本 +template +mystl::pair +erange_dispatch(ForwardIter first, ForwardIter last, const T& value, + forward_iterator_tag) { + auto len = mystl::distance(first, last); + auto half = len; + ForwardIter middle, left, right; + while (len > 0) { + half = len >> 1; + middle = first; + mystl::advance(middle, half); + if (*middle < value) { + first = middle; + ++first; + len = len - half - 1; + } + else if (value < *middle) { + len = half; + } + else { + left = mystl::lower_bound(first, last, value); + mystl::advance(first, len); + right = mystl::upper_bound(++middle, first, value); + return mystl::pair(left, right); + } + } + return mystl::pair(last, last); +} + +// erange_dispatch 的 random_access_iterator_tag 版本 +template +mystl::pair +erange_dispatch(RandomIter first, RandomIter last, const T& value, + random_access_iterator_tag) { + auto len = last - first; + auto half = len; + RandomIter middle, left, right; + while (len > 0) { + half = len >> 1; + middle = first + half; + if (*middle < value) { + first = middle + 1; + len = len - half - 1; + } + else if (value < *middle) { + len = half; + } + else { + left = mystl::lower_bound(first, middle, value); + right = mystl::upper_bound(++middle, first + len, value); + return mystl::pair(left, right); + } + } + return mystl::pair(last, last); +} + +template +mystl::pair +equal_range(ForwardIter first, ForwardIter last, const T& value) { + return mystl::erange_dispatch(first, last, value, iterator_category(first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +// erange_dispatch 的 forward iterator 版本 +template +mystl::pair +erange_dispatch(ForwardIter first, ForwardIter last, const T& value, + forward_iterator_tag, Compared comp) { + auto len = mystl::distance(first, last); + auto half = len; + ForwardIter middle, left, right; + while (len > 0) { + half = len >> 1; + middle = first; + mystl::advance(middle, half); + if (comp(*middle, value)) { + first = middle; + ++first; + len = len - half - 1; + } + else if (comp(value, *middle)) { + len = half; + } + else { + left = mystl::lower_bound(first, last, value, comp); + mystl::advance(first, len); + right = mystl::upper_bound(++middle, first, value, comp); + return mystl::pair(left, right); + } + } + return mystl::pair(last, last); +} + +// erange_dispatch 的 random access iterator 版本 +template +mystl::pair +erange_dispatch(RandomIter first, RandomIter last, const T& value, + random_access_iterator_tag, Compared comp) { + auto len = last - first; + auto half = len; + RandomIter middle, left, right; + while (len > 0) { + half = len >> 1; + middle = first + half; + if (comp(*middle, value)) { + first = middle + 1; + len = len - half - 1; + } + else if (comp(value, *middle)) { + len = half; + } + else { + left = mystl::lower_bound(first, middle, value, comp); + right = mystl::upper_bound(++middle, first + len, value, comp); + return mystl::pair(left, right); + } + } + return mystl::pair(last, last); +} + +template +mystl::pair +equal_range(ForwardIter first, ForwardIter last, const T& value, + Compared comp) { + return mystl::erange_dispatch(first, last, value, iterator_category(first), + comp); +} + +/*****************************************************************************************/ +// generate +// 将函数对象 gen 的运算结果对[first, last)内的每个元素赋值 +/*****************************************************************************************/ +template +void generate(ForwardIter first, ForwardIter last, Generator gen) { + for (; first != last; ++first) { + *first = gen(); + } +} + +/*****************************************************************************************/ +// generate_n +// 用函数对象 gen 连续对 n 个元素赋值 +/*****************************************************************************************/ +template +void generate_n(ForwardIter first, Size n, Generator gen) { + for (; n > 0; --n, ++first) { + *first = gen(); + } +} + +/*****************************************************************************************/ +// includes +// 判断序列一S1 是否包含序列二S2 +/*****************************************************************************************/ +template +bool includes(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2) { + while (first1 != last1 && first2 != last2) { + if (*first2 < *first1) { + return false; + } + else if (*first1 < *first2) { + ++first1; + } + else { + ++first1, ++first2; + } + } + return first2 == last2; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool includes(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, Compared comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first2, *first1)) { + return false; + } + else if (comp(*first1, *first2)) { + ++first1; + } + else { + ++first1, ++first2; + } + } + return first2 == last2; +} + +/*****************************************************************************************/ +// is_heap +// 检查[first, last)内的元素是否为一个堆,如果是,则返回 true +/*****************************************************************************************/ +template +bool is_heap(RandomIter first, RandomIter last) { + auto n = mystl::distance(first, last); + auto parent = 0; + for (auto child = 1; child < n; ++child) { + if (first[parent] < first[child]) { + return false; + } + if ((child & 1) == 0) { + ++parent; + } + } + return true; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool is_heap(RandomIter first, RandomIter last, Compared comp) { + auto n = mystl::distance(first, last); + auto parent = 0; + for (auto child = 1; child < n; ++child) { + if (comp(first[parent], first[child])) { + return false; + } + if ((child & 1) == 0) { + ++parent; + } + } + return true; +} + +/*****************************************************************************************/ +// is_sorted +// 检查[first, last)内的元素是否升序,如果是升序,则返回 true +/*****************************************************************************************/ +template +bool is_sorted(ForwardIter first, ForwardIter last) { + if (first == last) { + return true; + } + auto next = first; + ++next; + for (; next != last; first = next, ++next) { + if (*next < *first) { + return false; + } + } + return true; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool is_sorted(ForwardIter first, ForwardIter last, Compared comp) { + if (first == last) { + return true; + } + auto next = first; + ++next; + for (; next != last; first = next, ++next) { + if (comp(*next, *first)) { + return false; + } + } + return true; +} + +/*****************************************************************************************/ +// median +// 找出三个值的中间值 +/*****************************************************************************************/ +template +const T& median(const T& left, const T& mid, const T& right) { + if (left < mid) { + if (mid < right) { // left < mid < right + return mid; + } + else if (left < right) { // left < right <= mid + return right; + } + else { // right <= left < mid + return left; + } + } + else if (left < right) { // mid <= left < right + return left; + } + else if (mid < right) { // mid < right <= left + return right; + } + else { // right <= mid <= left + return mid; + } +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +const T& median(const T& left, const T& mid, const T& right, Compared comp) { + if (comp(left, mid)) { + if (comp(mid, right)) { + return mid; + } + else if (comp(left, right)) { + return right; + } + else { + return left; + } + } + else if (comp(left, right)) { + return left; + } + else if (comp(mid, right)) { + return right; + } + else { + return mid; + } +} + +/*****************************************************************************************/ +// max_element +// 返回一个迭代器,指向序列中最大的元素 +/*****************************************************************************************/ +template +ForwardIter max_element(ForwardIter first, ForwardIter last) { + if (first == last) { + return first; + } + auto result = first; + while (++first != last) { + if (*result < *first) { + result = first; + } + } + return result; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +ForwardIter max_element(ForwardIter first, ForwardIter last, Compared comp) { + if (first == last) { + return first; + } + auto result = first; + while (++first != last) { + if (comp(*result, *first)) { + result = first; + } + } + return result; +} + +/*****************************************************************************************/ +// min_element +// 返回一个迭代器,指向序列中最小的元素 +/*****************************************************************************************/ +template +ForwardIter min_elememt(ForwardIter first, ForwardIter last) { + if (first == last) { + return first; + } + auto result = first; + while (++first != last) { + if (*first < *result) { + result = first; + } + } + return result; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +ForwardIter min_elememt(ForwardIter first, ForwardIter last, Compared comp) { + if (first == last) { + return first; + } + auto result = first; + while (++first != last) { + if (comp(*first, *result)) { + result = first; + } + } + return result; +} + +/*****************************************************************************************/ +// swap_ranges +// 将[first1, last1)从 first2 开始,交换相同个数元素 +// 交换的区间长度必须相同,两个序列不能互相重叠,返回一个迭代器指向序列二最后一个被交换元素的下一位置 +/*****************************************************************************************/ +template +ForwardIter2 +swap_ranges(ForwardIter1 first1, ForwardIter1 last1, ForwardIter2 first2) { + for (; first1 != last1; ++first1, ++first2) { + mystl::iter_swap(first1, first2); + } + return first2; +} + +/*****************************************************************************************/ +// transform +// 第一个版本以函数对象 unary_op 作用于[first, +// last)中的每个元素并将结果保存至 result 中 第二个版本以函数对象 binary_op +// 作用于两个序列[first1, last1)、[first2, last2)的相同位置 +/*****************************************************************************************/ +template +OutputIter transform(InputIter first, InputIter last, OutputIter result, + UnaryOperation unary_op) { + for (; first != last; ++first, ++result) { + *result = unary_op(*first); + } + return result; +} + +template +OutputIter transform(InputIter1 first1, InputIter1 last1, InputIter2 first2, + OutputIter result, BinaryOperation binary_op) { + for (; first1 != last1; ++first1, ++first2, ++result) { + *result = binary_op(*first1, *first2); + } + return result; +} + +/*****************************************************************************************/ +// remove_copy +// 移除区间内与指定 value 相等的元素,并将结果复制到以 result +// 标示起始位置的容器上 +/*****************************************************************************************/ +template +OutputIter remove_copy(InputIter first, InputIter last, OutputIter result, + const T& value) { + for (; first != last; ++first) { + if (*first != value) { + *result++ = *first; + } + } + return result; +} + +/*****************************************************************************************/ +// remove +// 移除所有与指定 value 相等的元素 +// 并不从容器中删除这些元素,所以 remove 和 remove_if 不适用于 array +/*****************************************************************************************/ +template +ForwardIter remove(ForwardIter first, ForwardIter last, const T& value) { + first + = mystl::find(first, last, value); // 利用 find 找出第一个匹配的地方 + auto next = first; + return first == last ? first + : mystl::remove_copy(++next, last, first, value); +} + +/*****************************************************************************************/ +// remove_copy_if +// 移除区间内所有令一元操作 unary_pred 为 true 的元素,并将结果复制到以 +// result 为起始位置的容器上 +/*****************************************************************************************/ +template +OutputIter remove_copy_if(InputIter first, InputIter last, OutputIter result, + UnaryPredicate unary_pred) { + for (; first != last; ++first) { + if (!unary_pred(*first)) { + *result = *first; + ++result; + } + } + return result; +} + +/*****************************************************************************************/ +// remove_if +// 移除区间内所有令一元操作 unary_pred 为 true 的元素 +/*****************************************************************************************/ +template +ForwardIter +remove_if(ForwardIter first, ForwardIter last, UnaryPredicate unary_pred) { + first = mystl::find_if(first, last, + unary_pred); // 利用 find_if 找出第一个匹配的地方 + auto next = first; + return first == last + ? first + : mystl::remove_copy_if(++next, last, first, unary_pred); +} + +/*****************************************************************************************/ +// replace +// 将区间内所有的 old_value 都以 new_value 替代 +/*****************************************************************************************/ +template +void replace(ForwardIter first, ForwardIter last, const T& old_value, + const T& new_value) { + for (; first != last; ++first) { + if (*first == old_value) { + *first = new_value; + } + } +} + +/*****************************************************************************************/ +// replace_copy +// 行为与 replace 类似,不同的是将结果复制到 result +// 所指的容器中,原序列没有改变 +/*****************************************************************************************/ +template +OutputIter replace_copy(InputIter first, InputIter last, OutputIter result, + const T& old_value, const T& new_value) { + for (; first != last; ++first, ++result) { + *result = *first == old_value ? new_value : *first; + } + return result; +} + +/*****************************************************************************************/ +// replace_copy_if +// 行为与 replace_if 类似,不同的是将结果复制到 result +// 所指的容器中,原序列没有改变 +/*****************************************************************************************/ +template +OutputIter replace_copy_if(InputIter first, InputIter last, OutputIter result, + UnaryPredicate unary_pred, const T& new_value) { + for (; first != last; ++first, ++result) { + *result = unary_pred(*first) ? new_value : *first; + } + return result; +} + +/*****************************************************************************************/ +// replace_if +// 将区间内所有令一元操作 unary_pred 为 true 的元素都用 new_value 替代 +/*****************************************************************************************/ +template +void replace_if(ForwardIter first, ForwardIter last, UnaryPredicate unary_pred, + const T& new_value) { + for (; first != last; ++first) { + if (unary_pred(*first)) { + *first = new_value; + } + } +} + +/*****************************************************************************************/ +// reverse +// 将[first, last)区间内的元素反转 +/*****************************************************************************************/ +// reverse_dispatch 的 bidirectional_iterator_tag 版本 +template +void reverse_dispatch(BidirectionalIter first, BidirectionalIter last, + bidirectional_iterator_tag) { + while (true) { + if (first == last || first == --last) { + return; + } + mystl::iter_swap(first++, last); + } +} + +// reverse_dispatch 的 random_access_iterator_tag 版本 +template +void reverse_dispatch(RandomIter first, RandomIter last, + random_access_iterator_tag) { + while (first < last) { + mystl::iter_swap(first++, --last); + } +} + +template +void reverse(BidirectionalIter first, BidirectionalIter last) { + mystl::reverse_dispatch(first, last, iterator_category(first)); +} + +/*****************************************************************************************/ +// reverse_copy +// 行为与 reverse 类似,不同的是将结果复制到 result 所指容器中 +/*****************************************************************************************/ +template +OutputIter reverse_copy(BidirectionalIter first, BidirectionalIter last, + OutputIter result) { + while (first != last) { + --last; + *result = *last; + ++result; + } + return result; +} + +/*****************************************************************************************/ +// random_shuffle +// 将[first, last)内的元素次序随机重排 +// 重载版本使用一个产生随机数的函数对象 rand +/*****************************************************************************************/ +template +void random_shuffle(RandomIter first, RandomIter last) { + if (first == last) { + return; + } + // srand((unsigned)time(0)); + // for (auto i = first + 1; i != last; ++i) { + // mystl::iter_swap(i, first + (rand() % (i - first + 1))); + // } +} + +// 重载版本使用一个产生随机数的函数对象 rand +template +void random_shuffle(RandomIter first, RandomIter last, + RandomNumberGenerator& rand) { + if (first == last) { + return; + } + auto len = mystl::distance(first, last); + for (auto i = first + 1; i != last; ++i) { + mystl::iter_swap(i, first + (rand(i - first + 1) % len)); + } +} + +/*****************************************************************************************/ +// rotate +// 将[first, middle)内的元素和 [middle, +// last)内的元素互换,可以交换两个长度不同的区间 返回交换后 middle 的位置 +/*****************************************************************************************/ +// rotate_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter rotate_dispatch(ForwardIter first, ForwardIter middle, + ForwardIter last, forward_iterator_tag) { + auto first2 = middle; + do { + mystl::swap(*first++, *first2++); + if (first == middle) { + middle = first2; + } + } while (first2 != last); // 后半段移到前面 + + auto new_middle = first; // 迭代器返回的位置 + first2 = middle; + while (first2 != last) { // 调整剩余元素 + mystl::swap(*first++, *first2++); + if (first == middle) { + middle = first2; + } + else if (first2 == last) { + first2 = middle; + } + } + return new_middle; +} + +// rotate_dispatch 的 bidirectional_iterator_tag 版本 +template +BidirectionalIter +rotate_dispatch(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, bidirectional_iterator_tag) { + mystl::reverse_dispatch(first, middle, bidirectional_iterator_tag()); + mystl::reverse_dispatch(middle, last, bidirectional_iterator_tag()); + while (first != middle && middle != last) { + mystl::swap(*first++, *--last); + } + if (first == middle) { + mystl::reverse_dispatch(middle, last, bidirectional_iterator_tag()); + return last; + } + else { + mystl::reverse_dispatch(first, middle, bidirectional_iterator_tag()); + return first; + } +} + +// 求最大公因子 +template +EuclideanRingElement rgcd(EuclideanRingElement m, EuclideanRingElement n) { + while (n != 0) { + auto t = m % n; + m = n; + n = t; + } + return m; +} + +// rotate_dispatch 的 random_access_iterator_tag 版本 +template +RandomIter rotate_dispatch(RandomIter first, RandomIter middle, RandomIter last, + random_access_iterator_tag) { + // 因为是 random access iterator,我们可以确定每个元素的位置 + auto n = last - first; + auto l = middle - first; + auto r = n - l; + auto result = first + (last - middle); + if (l == r) { + mystl::swap_ranges(first, middle, middle); + return result; + } + auto cycle_times = rgcd(n, l); + for (auto i = 0; i < cycle_times; ++i) { + auto tmp = *first; + auto p = first; + if (l < r) { + for (auto j = 0; j < r / cycle_times; ++j) { + if (p > first + r) { + *p = *(p - r); + p -= r; + } + *p = *(p + l); + p += l; + } + } + else { + for (auto j = 0; j < l / cycle_times - 1; ++j) { + if (p < last - l) { + *p = *(p + l); + p += l; + } + *p = *(p - r); + p -= r; + } + } + *p = tmp; + ++first; + } + return result; +} + +template +ForwardIter rotate(ForwardIter first, ForwardIter middle, ForwardIter last) { + if (first == middle) { + return last; + } + if (middle == last) { + return first; + } + return mystl::rotate_dispatch(first, middle, last, + iterator_category(first)); +} + +/*****************************************************************************************/ +// rotate_copy +// 行为与 rotate 类似,不同的是将结果复制到 result 所指的容器中 +/*****************************************************************************************/ +template +ForwardIter rotate_copy(ForwardIter first, ForwardIter middle, ForwardIter last, + OutputIter result) { + return mystl::copy(first, middle, mystl::copy(middle, last, result)); +} + +/*****************************************************************************************/ +// is_permutation +// 判断[first1,last1)是否为[first2, last2)的排列组合 +/*****************************************************************************************/ +template +bool is_permutation_aux(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2, + BinaryPred pred) { + constexpr bool is_ra_it + = mystl::is_random_access_iterator::value + && mystl::is_random_access_iterator::value; + if (is_ra_it) { + auto len1 = last1 - first1; + auto len2 = last2 - first2; + if (len1 != len2) { + return false; + } + } + + // 先找出相同的前缀段 + for (; first1 != last1 && first2 != last2; ++first1, (void)++first2) { + if (!pred(*first1, *first2)) { + break; + } + } + if (is_ra_it) { + if (first1 == last1) { + return true; + } + } + else { + auto len1 = mystl::distance(first1, last1); + auto len2 = mystl::distance(first2, last2); + if (len1 == 0 && len2 == 0) { + return true; + } + if (len1 != len2) { + return false; + } + } + + // 判断剩余部分 + for (auto i = first1; i != last1; ++i) { + bool is_repeated = false; + for (auto j = first1; j != i; ++j) { + if (pred(*j, *i)) { + is_repeated = true; + break; + } + } + + if (!is_repeated) { + // 计算 *i 在 [first2, last2) 的数目 + auto c2 = 0; + for (auto j = first2; j != last2; ++j) { + if (pred(*i, *j)) { + ++c2; + } + } + if (c2 == 0) { + return false; + } + + // 计算 *i 在 [first1, last1) 的数目 + auto c1 = 1; + auto j = i; + for (++j; j != last1; ++j) { + if (pred(*i, *j)) { + ++c1; + } + } + if (c1 != c2) { + return false; + } + } + } + return true; +} + +template +bool is_permutation(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2, BinaryPred pred) { + return is_permutation_aux(first1, last1, first2, last2, pred); +} + +template +bool is_permutation(ForwardIter1 first1, ForwardIter1 last1, + ForwardIter2 first2, ForwardIter2 last2) { + typedef typename iterator_traits::value_type v1; + typedef typename iterator_traits::value_type v2; + static_assert(std::is_same::value, + "the type should be same in mystl::is_permutation"); + return is_permutation_aux(first1, last1, first2, last2, + mystl::equal_to()); +} + +/*****************************************************************************************/ +// next_permutation +// 取得[first, last)所标示序列的下一个排列组合,如果没有下一个排序组合,返回 +// false,否则返回 true +/*****************************************************************************************/ +template +bool next_permutation(BidirectionalIter first, BidirectionalIter last) { + auto i = last; + if (first == last || first == --i) { + return false; + } + for (;;) { + auto ii = i; + if (*--i < *ii) { // 找到第一对小于关系的元素 + auto j = last; + while (!(*i < *--j)) { + } + mystl::iter_swap(i, j); // 交换 i,j 所指元素 + mystl::reverse(ii, last); // 将 ii 之后的所有元素反转 + return true; + } + if (i == first) { + mystl::reverse(first, last); + return false; + } + } +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool next_permutation(BidirectionalIter first, BidirectionalIter last, + Compared comp) { + auto i = last; + if (first == last || first == --i) { + return false; + } + for (;;) { + auto ii = i; + if (comp(*--i, *ii)) { + auto j = last; + while (!comp(*i, *--j)) { + } + mystl::iter_swap(i, j); // 交换 i,j 所指元素 + mystl::reverse(ii, last); // 将 ii 之后的所有元素反转 + return true; + } + if (i == first) { + mystl::reverse(first, last); + return false; + } + } +} + +/*****************************************************************************************/ +// prev_permutation +// 取得[first, last)所标示序列的上一个排列组合,如果没有上一个排序组合,返回 +// false,否则返回 true +/*****************************************************************************************/ +template +bool prev_permutation(BidirectionalIter first, BidirectionalIter last) { + auto i = last; + if (first == last || first == --i) { + return false; + } + for (;;) { + auto ii = i; + if (*ii < *--i) { // 找到第一对大于关系的元素 + auto j = last; + while (!(*--j < *i)) { + } + mystl::iter_swap(i, j); // 交换i,j + mystl::reverse(ii, last); // 将 ii 之后的所有元素反转 + return true; + } + if (i == first) { + mystl::reverse(first, last); + return false; + } + } +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool prev_permutation(BidirectionalIter first, BidirectionalIter last, + Compared comp) { + auto i = last; + if (first == last || first == --i) { + return false; + } + for (;;) { + auto ii = i; + if (comp(*ii, *--i)) { + auto j = last; + while (!comp(*--j, *i)) { + } + mystl::iter_swap(i, j); // 交换i,j + mystl::reverse(ii, last); // 将 ii 之后的所有元素反转 + return true; + } + if (i == first) { + mystl::reverse(first, last); + return false; + } + } +} + +/*****************************************************************************************/ +// merge +// 将两个经过排序的集合 S1 和 S2 +// 合并起来置于另一段空间,返回一个迭代器指向最后一个元素的下一位置 +/*****************************************************************************************/ +template +OutputIter merge(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result) { + while (first1 != last1 && first2 != last2) { + if (*first2 < *first1) { + *result = *first2; + ++first2; + } + else { + *result = *first1; + ++first1; + } + ++result; + } + return mystl::copy(first2, last2, mystl::copy(first1, last1, result)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +OutputIter merge(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result, Compared comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first2, *first1)) { + *result = *first2; + ++first2; + } + else { + *result = *first1; + ++first1; + } + ++result; + } + return mystl::copy(first2, last2, mystl::copy(first1, last1, result)); +} + +/*****************************************************************************************/ +// inplace_merge +// 把连接在一起的两个有序序列结合成单一序列并保持有序 +/*****************************************************************************************/ +// 没有缓冲区的情况下合并 +template +void merge_without_buffer(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, Distance len1, + Distance len2) { + if (len1 == 0 || len2 == 0) { + return; + } + if (len1 + len2 == 2) { + if (*middle < *first) { + mystl::iter_swap(first, middle); + } + return; + } + auto first_cut = first; + auto second_cut = middle; + Distance len11 = 0; + Distance len22 = 0; + if (len1 > len2) { // 序列一较长,找到序列一的中点 + len11 = len1 >> 1; + mystl::advance(first_cut, len11); + second_cut = mystl::lower_bound(middle, last, *first_cut); + len22 = mystl::distance(middle, second_cut); + } + else { // 序列二较长,找到序列二的中点 + len22 = len2 >> 1; + mystl::advance(second_cut, len22); + first_cut = mystl::upper_bound(first, middle, *second_cut); + len11 = mystl::distance(first, first_cut); + } + auto new_middle = mystl::rotate(first_cut, middle, second_cut); + mystl::merge_without_buffer(first, first_cut, new_middle, len11, len22); + mystl::merge_without_buffer(new_middle, second_cut, last, len1 - len11, + len2 - len22); +} + +template +BidirectionalIter1 +merge_backward(BidirectionalIter1 first1, BidirectionalIter1 last1, + BidirectionalIter2 first2, BidirectionalIter2 last2, + BidirectionalIter1 result) { + if (first1 == last1) { + return mystl::copy_backward(first2, last2, result); + } + if (first2 == last2) { + return mystl::copy_backward(first1, last1, result); + } + --last1; + --last2; + while (true) { + if (*last2 < *last1) { + *--result = *last1; + if (first1 == last1) { + return mystl::copy_backward(first2, ++last2, result); + } + --last1; + } + else { + *--result = *last2; + if (first2 == last2) { + return mystl::copy_backward(first1, ++last1, result); + } + --last2; + } + } +} + +template +BidirectionalIter1 +rotate_adaptive(BidirectionalIter1 first, BidirectionalIter1 middle, + BidirectionalIter1 last, Distance len1, Distance len2, + BidirectionalIter2 buffer, Distance buffer_size) { + BidirectionalIter2 buffer_end; + if (len1 > len2 && len2 <= buffer_size) { + buffer_end = mystl::copy(middle, last, buffer); + mystl::copy_backward(first, middle, last); + return mystl::copy(buffer, buffer_end, first); + } + else if (len1 <= buffer_size) { + buffer_end = mystl::copy(first, middle, buffer); + mystl::copy(middle, last, first); + return mystl::copy_backward(buffer, buffer_end, last); + } + else { + return mystl::rotate(first, middle, last); + } +} + +// 有缓冲区的情况下合并 +template +void merge_adaptive(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, Distance len1, Distance len2, + Pointer buffer, Distance buffer_size) { + // 区间长度足够放进缓冲区 + if (len1 <= len2 && len1 <= buffer_size) { + Pointer buffer_end = mystl::copy(first, middle, buffer); + mystl::merge(buffer, buffer_end, middle, last, first); + } + else if (len2 <= buffer_size) { + Pointer buffer_end = mystl::copy(middle, last, buffer); + mystl::merge_backward(first, middle, buffer, buffer_end, last); + } + else { // 区间长度太长,分割递归处理 + auto first_cut = first; + auto second_cut = middle; + Distance len11 = 0; + Distance len22 = 0; + if (len1 > len2) { + len11 = len1 >> 1; + mystl::advance(first_cut, len11); + second_cut = mystl::lower_bound(middle, last, *first_cut); + len22 = mystl::distance(middle, second_cut); + } + else { + len22 = len2 >> 1; + mystl::advance(second_cut, len22); + first_cut = mystl::upper_bound(first, middle, *second_cut); + len11 = mystl::distance(first, first_cut); + } + auto new_middle + = mystl::rotate_adaptive(first_cut, middle, second_cut, len1 - len11, + len22, buffer, buffer_size); + mystl::merge_adaptive(first, first_cut, new_middle, len11, len22, + buffer, buffer_size); + mystl::merge_adaptive(new_middle, second_cut, last, len1 - len11, + len2 - len22, buffer, buffer_size); + } +} + +template +void inplace_merge_aux(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, T*) { + auto len1 = mystl::distance(first, middle); + auto len2 = mystl::distance(middle, last); + temporary_buffer buf(first, last); + if (!buf.begin()) { + mystl::merge_without_buffer(first, middle, last, len1, len2); + } + else { + mystl::merge_adaptive(first, middle, last, len1, len2, buf.begin(), + buf.size()); + } +} + +template +void inplace_merge(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last) { + if (first == middle || middle == last) { + return; + } + mystl::inplace_merge_aux(first, middle, last, value_type(first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +// 没有缓冲区的情况下合并 +template +void merge_without_buffer(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, Distance len1, Distance len2, + Compared comp) { + if (len1 == 0 || len2 == 0) { + return; + } + if (len1 + len2 == 2) { + if (comp(*middle, *first)) { + mystl::iter_swap(first, middle); + } + return; + } + auto first_cut = first; + auto second_cut = middle; + Distance len11 = 0; + Distance len22 = 0; + if (len1 > len2) { + len11 = len1 >> 1; + mystl::advance(first_cut, len11); + second_cut = mystl::lower_bound(middle, last, *first_cut, comp); + len22 = mystl::distance(middle, second_cut); + } + else { + len22 = len2 >> 1; + mystl::advance(second_cut, len22); + first_cut = mystl::upper_bound(first, middle, *second_cut, comp); + len11 = mystl::distance(first, first_cut); + } + auto new_middle = mystl::rotate(first_cut, middle, second_cut); + mystl::merge_without_buffer(first, first_cut, new_middle, len11, len22, + comp); + mystl::merge_without_buffer(new_middle, second_cut, last, len1 - len11, + len2 - len22, comp); +} + +template +BidirectionalIter1 +merge_backward(BidirectionalIter1 first1, BidirectionalIter1 last1, + BidirectionalIter2 first2, BidirectionalIter2 last2, + BidirectionalIter1 result, Compared comp) { + if (first1 == last1) { + return mystl::copy_backward(first2, last2, result); + } + if (first2 == last2) { + return mystl::copy_backward(first1, last1, result); + } + --last1; + --last2; + while (true) { + if (comp(*last2, *last1)) { + *--result = *last1; + if (first1 == last1) { + return mystl::copy_backward(first2, ++last2, result); + } + --last1; + } + else { + *--result = *last2; + if (first2 == last2) { + return mystl::copy_backward(first1, ++last1, result); + } + --last2; + } + } +} + +// 有缓冲区的情况下合并 +template +void merge_adaptive(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, Distance len1, Distance len2, + Pointer buffer, Distance buffer_size, Compared comp) { + // 区间长度足够放进缓冲区 + if (len1 <= len2 && len1 <= buffer_size) { + Pointer buffer_end = mystl::copy(first, middle, buffer); + mystl::merge(buffer, buffer_end, middle, last, first, comp); + } + else if (len2 <= buffer_size) { + Pointer buffer_end = mystl::copy(middle, last, buffer); + mystl::merge_backward(first, middle, buffer, buffer_end, last, comp); + } + else { // 区间长度太长,分割递归处理 + auto first_cut = first; + auto second_cut = middle; + Distance len11 = 0; + Distance len22 = 0; + if (len1 > len2) { + len11 = len1 >> 1; + mystl::advance(first_cut, len11); + second_cut = mystl::lower_bound(middle, last, *first_cut, comp); + len22 = mystl::distance(middle, second_cut); + } + else { + len22 = len2 >> 1; + mystl::advance(second_cut, len22); + first_cut = mystl::upper_bound(first, middle, *second_cut, comp); + len11 = mystl::distance(first, first_cut); + } + auto new_middle + = mystl::rotate_adaptive(first_cut, middle, second_cut, len1 - len11, + len22, buffer, buffer_size); + mystl::merge_adaptive(first, first_cut, new_middle, len11, len22, + buffer, buffer_size, comp); + mystl::merge_adaptive(new_middle, second_cut, last, len1 - len11, + len2 - len22, buffer, buffer_size, comp); + } +} + +template +void inplace_merge_aux(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, T*, Compared comp) { + auto len1 = mystl::distance(first, middle); + auto len2 = mystl::distance(middle, last); + temporary_buffer buf(first, last); + if (!buf.begin()) { + mystl::merge_without_buffer(first, middle, last, len1, len2, comp); + } + else { + mystl::merge_adaptive(first, middle, last, len1, len2, buf.begin(), + buf.size(), comp); + } +} + +template +void inplace_merge(BidirectionalIter first, BidirectionalIter middle, + BidirectionalIter last, Compared comp) { + if (first == middle || middle == last) { + return; + } + mystl::inplace_merge_aux(first, middle, last, value_type(first), comp); +} + +/*****************************************************************************************/ +// partial_sort +// 对整个序列做部分排序,保证较小的 N 个元素以递增顺序置于[first, first + +// N)中 +/*****************************************************************************************/ +template +void partial_sort(RandomIter first, RandomIter middle, RandomIter last) { + mystl::make_heap(first, middle); + for (auto i = middle; i < last; ++i) { + if (*i < *first) { + mystl::pop_heap_aux(first, middle, i, *i, distance_type(first)); + } + } + mystl::sort_heap(first, middle); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +void partial_sort(RandomIter first, RandomIter middle, RandomIter last, + Compared comp) { + mystl::make_heap(first, middle, comp); + for (auto i = middle; i < last; ++i) { + if (comp(*i, *first)) { + mystl::pop_heap_aux(first, middle, i, *i, distance_type(first), + comp); + } + } + mystl::sort_heap(first, middle, comp); +} + +/*****************************************************************************************/ +// partial_sort_copy +// 行为与 partial_sort 类似,不同的是把排序结果复制到 result 容器中 +/*****************************************************************************************/ +template +RandomIter +psort_copy_aux(InputIter first, InputIter last, RandomIter result_first, + RandomIter result_last, Distance*) { + if (result_first == result_last) { + return result_last; + } + auto result_iter = result_first; + while (first != last && result_iter != result_last) { + *result_iter = *first; + ++result_iter; + ++first; + } + mystl::make_heap(result_first, result_iter); + while (first != last) { + if (*first < *result_first) { + mystl::adjust_heap(result_first, static_cast(0), + result_iter - result_first, *first); + } + ++first; + } + mystl::sort_heap(result_first, result_iter); + return result_iter; +} + +template +RandomIter partial_sort_copy(InputIter first, InputIter last, + RandomIter result_first, RandomIter result_last) { + return mystl::psort_copy_aux(first, last, result_first, result_last, + distance_type(result_first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +RandomIter +psort_copy_aux(InputIter first, InputIter last, RandomIter result_first, + RandomIter result_last, Distance*, Compared comp) { + if (result_first == result_last) { + return result_last; + } + auto result_iter = result_first; + while (first != last && result_iter != result_last) { + *result_iter = *first; + ++result_iter; + ++first; + } + mystl::make_heap(result_first, result_iter, comp); + while (first != last) { + if (comp(*first, *result_first)) { + mystl::adjust_heap(result_first, static_cast(0), + result_iter - result_first, *first, comp); + } + ++first; + } + mystl::sort_heap(result_first, result_iter, comp); + return result_iter; +} + +template +RandomIter +partial_sort_copy(InputIter first, InputIter last, RandomIter result_first, + RandomIter result_last, Compared comp) { + return mystl::psort_copy_aux(first, last, result_first, result_last, + distance_type(result_first), comp); +} + +/*****************************************************************************************/ +// partition +// 对区间内的元素重排,被一元条件运算判定为 true 的元素会放到区间的前段 +// 该函数不保证元素的原始相对位置 +/*****************************************************************************************/ +template +BidirectionalIter partition(BidirectionalIter first, BidirectionalIter last, + UnaryPredicate unary_pred) { + while (true) { + while (first != last && unary_pred(*first)) { + ++first; + } + if (first == last) { + break; + } + --last; + while (first != last && !unary_pred(*last)) { + --last; + } + if (first == last) { + break; + } + mystl::iter_swap(first, last); + ++first; + } + return first; +} + +/*****************************************************************************************/ +// partition_copy +// 行为与 partition 类似,不同的是,将被一元操作符判定为 true 的放到 +// result_true 的输出区间 其余放到 result_false 的输出区间,并返回一个 +// mystl::pair 指向这两个区间的尾部 +/*****************************************************************************************/ +template +mystl::pair +partition_copy(InputIter first, InputIter last, OutputIter1 result_true, + OutputIter2 result_false, UnaryPredicate unary_pred) { + for (; first != last; ++first) { + if (unary_pred(*first)) { + *result_true++ = *first; + } + else { + *result_false++ = *first; + } + } + return mystl::pair(result_true, result_false); +} + +/*****************************************************************************************/ +// sort +// 将[first, last)内的元素以递增的方式排序 +/*****************************************************************************************/ +constexpr static size_t kSmallSectionSize + = 128; // 小型区间的大小,在这个大小内采用插入排序 + +// 用于控制分割恶化的情况 +template +Size slg2(Size n) { // 找出 lgk <= n 的 k 的最大值 + Size k = 0; + for (; n > 1; n >>= 1) { + ++k; + } + return k; +} + +// 分割函数 unchecked_partition +template +RandomIter +unchecked_partition(RandomIter first, RandomIter last, const T& pivot) { + while (true) { + while (*first < pivot) { + ++first; + } + --last; + while (pivot < *last) { + --last; + } + if (!(first < last)) { + return first; + } + mystl::iter_swap(first, last); + ++first; + } +} + +// 内省式排序,先进行 quick sort,当分割行为有恶化倾向时,改用 heap sort +template +void intro_sort(RandomIter first, RandomIter last, Size depth_limit) { + while (static_cast(last - first) > kSmallSectionSize) { + if (depth_limit == 0) { // 到达最大分割深度限制 + mystl::partial_sort(first, last, last); // 改用 heap_sort + return; + } + --depth_limit; + auto mid + = mystl::median(*(first), *(first + (last - first) / 2), *(last - 1)); + auto cut = mystl::unchecked_partition(first, last, mid); + mystl::intro_sort(cut, last, depth_limit); + last = cut; + } +} + +// 插入排序辅助函数 unchecked_linear_insert +template +void unchecked_linear_insert(RandomIter last, const T& value) { + auto next = last; + --next; + while (value < *next) { + *last = *next; + last = next; + --next; + } + *last = value; +} + +// 插入排序函数 unchecked_insertion_sort +template +void unchecked_insertion_sort(RandomIter first, RandomIter last) { + for (auto i = first; i != last; ++i) { + mystl::unchecked_linear_insert(i, *i); + } +} + +// 插入排序函数 insertion_sort +template +void insertion_sort(RandomIter first, RandomIter last) { + if (first == last) { + return; + } + for (auto i = first + 1; i != last; ++i) { + auto value = *i; + if (value < *first) { + mystl::copy_backward(first, i, i + 1); + *first = value; + } + else { + mystl::unchecked_linear_insert(i, value); + } + } +} + +// 最终插入排序函数 final_insertion_sort +template +void final_insertion_sort(RandomIter first, RandomIter last) { + if (static_cast(last - first) > kSmallSectionSize) { + mystl::insertion_sort(first, first + kSmallSectionSize); + mystl::unchecked_insertion_sort(first + kSmallSectionSize, last); + } + else { + mystl::insertion_sort(first, last); + } +} + +template +void sort(RandomIter first, RandomIter last) { + if (first != last) { + // 内省式排序,将区间分为一个个小区间,然后对整体进行插入排序 + mystl::intro_sort(first, last, slg2(last - first) * 2); + mystl::final_insertion_sort(first, last); + } +} + +// 重载版本使用函数对象 comp 代替比较操作 +// 分割函数 unchecked_partition +template +RandomIter unchecked_partition(RandomIter first, RandomIter last, + const T& pivot, Compared comp) { + while (true) { + while (comp(*first, pivot)) { + ++first; + } + --last; + while (comp(pivot, *last)) { + --last; + } + if (!(first < last)) { + return first; + } + mystl::iter_swap(first, last); + ++first; + } +} + +// 内省式排序,先进行 quick sort,当分割行为有恶化倾向时,改用 heap sort +template +void intro_sort(RandomIter first, RandomIter last, Size depth_limit, + Compared comp) { + while (static_cast(last - first) > kSmallSectionSize) { + if (depth_limit == 0) { // 到达最大分割深度限制 + mystl::partial_sort(first, last, last, comp); // 改用 heap_sort + return; + } + --depth_limit; + auto mid + = mystl::median(*(first), *(first + (last - first) / 2), *(last - 1)); + auto cut = mystl::unchecked_partition(first, last, mid, comp); + mystl::intro_sort(cut, last, depth_limit, comp); + last = cut; + } +} + +// 插入排序辅助函数 unchecked_linear_insert +template +void unchecked_linear_insert(RandomIter last, const T& value, Compared comp) { + auto next = last; + --next; + while (comp(value, *next)) { // 从尾部开始寻找第一个可插入位置 + *last = *next; + last = next; + --next; + } + *last = value; +} + +// 插入排序函数 unchecked_insertion_sort +template +void unchecked_insertion_sort(RandomIter first, RandomIter last, + Compared comp) { + for (auto i = first; i != last; ++i) { + mystl::unchecked_linear_insert(i, *i, comp); + } +} + +// 插入排序函数 insertion_sort +template +void insertion_sort(RandomIter first, RandomIter last, Compared comp) { + if (first == last) { + return; + } + for (auto i = first + 1; i != last; ++i) { + auto value = *i; + if (comp(value, *first)) { + mystl::copy_backward(first, i, i + 1); + *first = value; + } + else { + mystl::unchecked_linear_insert(i, value, comp); + } + } +} + +// 最终插入排序函数 final_insertion_sort +template +void final_insertion_sort(RandomIter first, RandomIter last, Compared comp) { + if (static_cast(last - first) > kSmallSectionSize) { + mystl::insertion_sort(first, first + kSmallSectionSize, comp); + mystl::unchecked_insertion_sort(first + kSmallSectionSize, last, comp); + } + else { + mystl::insertion_sort(first, last, comp); + } +} + +template +void sort(RandomIter first, RandomIter last, Compared comp) { + if (first != last) { + // 内省式排序,将区间分为一个个小区间,然后对整体进行插入排序 + mystl::intro_sort(first, last, slg2(last - first) * 2, comp); + mystl::final_insertion_sort(first, last, comp); + } +} + +/*****************************************************************************************/ +// nth_element +// 对序列重排,使得所有小于第 n +// 个元素的元素出现在它的前面,大于它的出现在它的后面 +/*****************************************************************************************/ +template +void nth_element(RandomIter first, RandomIter nth, RandomIter last) { + if (nth == last) { + return; + } + while (last - first > 3) { + auto cut = mystl::unchecked_partition( + first, last, + mystl::median(*first, *(first + (last - first) / 2), *(last - 1))); + if (cut <= nth) { // 如果 nth 位于右段 + first = cut; // 对右段进行分割 + } + else { + last = cut; // 对左段进行分割 + } + } + mystl::insertion_sort(first, last); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +void nth_element(RandomIter first, RandomIter nth, RandomIter last, + Compared comp) { + if (nth == last) { + return; + } + while (last - first > 3) { + auto cut = mystl::unchecked_partition( + first, last, + mystl::median(*first, *(first + (last - first) / 2), *(last - 1)), + comp); + if (cut <= nth) { // 如果 nth 位于右段 + first = cut; // 对右段进行分割 + } + else { + last = cut; // 对左段进行分割 + } + } + mystl::insertion_sort(first, last, comp); +} + +/*****************************************************************************************/ +// unique_copy +// 从[first, last)中将元素复制到 result +// 上,序列必须有序,如果有重复的元素,只会复制一次 +/*****************************************************************************************/ +// unique_copy_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter unique_copy_dispatch(InputIter first, InputIter last, + ForwardIter result, forward_iterator_tag) { + *result = *first; + while (++first != last) { + if (*result != *first) { + *++result = *first; + } + } + return ++result; +} + +// unique_copy_dispatch 的 output_iterator_tag 版本 +// 由于 output iterator 只能进行只读操作,所以不能有 *result != *first +// 这样的判断 +template +OutputIter unique_copy_dispatch(InputIter first, InputIter last, + OutputIter result, output_iterator_tag) { + auto value = *first; + *result = value; + while (++first != last) { + if (value != *first) { + value = *first; + *++result = value; + } + } + return ++result; +} + +template +OutputIter unique_copy(InputIter first, InputIter last, OutputIter result) { + if (first == last) { + return result; + } + return mystl::unique_copy_dispatch(first, last, result, + iterator_category(result)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +// unique_copy_dispatch 的 forward_iterator_tag 版本 +template +ForwardIter +unique_copy_dispatch(InputIter first, InputIter last, ForwardIter result, + forward_iterator_tag, Compared comp) { + *result = *first; + while (++first != last) { + if (!comp(*result, *first)) { + *++result = *first; + } + } + return ++result; +} + +// unique_copy_dispatch 的 output_iterator_tag 版本 +// 由于 output iterator 只能进行只读操作,所以不能有 *result != *first +// 这样的判断 +template +OutputIter +unique_copy_dispatch(InputIter first, InputIter last, OutputIter result, + output_iterator_tag, Compared comp) { + auto value = *first; + *result = value; + while (++first != last) { + if (!comp(value, *first)) { + value = *first; + *++result = value; + } + } + return ++result; +} + +template +OutputIter +unique_copy(InputIter first, InputIter last, OutputIter result, Compared comp) { + if (first == last) { + return result; + } + return mystl::unique_copy_dispatch(first, last, result, + iterator_category(result), comp); +} + +/*****************************************************************************************/ +// unique +// 移除[first, last)内重复的元素,序列必须有序,和 remove +// 类似,它也不能真正的删除重复元素 +/*****************************************************************************************/ +template +ForwardIter unique(ForwardIter first, ForwardIter last) { + first = mystl::adjacent_find(first, last); + return mystl::unique_copy(first, last, first); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +ForwardIter unique(ForwardIter first, ForwardIter last, Compared comp) { + first = mystl::adjacent_find(first, last, comp); + return mystl::unique_copy(first, last, first, comp); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_ALGO */ diff --git a/src/libcxx/include/algobase b/src/libcxx/include/algobase new file mode 100644 index 000000000..1672844fe --- /dev/null +++ b/src/libcxx/include/algobase @@ -0,0 +1,495 @@ + +/** + * @file algobase + * @brief stl algobase 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ALGOBASE +#define SIMPLEKERNEL_ALGOBASE + +// 这个头文件包含了 std 的基本算法 + +#include "cstring" +#include "iterator" +#include "util" + +namespace mystl { + +#ifdef max +# pragma message("#undefing marco max") +# undef max +#endif // max + +#ifdef min +# pragma message("#undefing marco min") +# undef min +#endif // min + +/*****************************************************************************************/ +// max +// 取二者中的较大值,语义相等时保证返回第一个参数 +/*****************************************************************************************/ +template +const T& max(const T& lhs, const T& rhs) { + return lhs < rhs ? rhs : lhs; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +const T& max(const T& lhs, const T& rhs, Compare comp) { + return comp(lhs, rhs) ? rhs : lhs; +} + +/*****************************************************************************************/ +// min +// 取二者中的较小值,语义相等时保证返回第一个参数 +/*****************************************************************************************/ +template +const T& min(const T& lhs, const T& rhs) { + return rhs < lhs ? rhs : lhs; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +const T& min(const T& lhs, const T& rhs, Compare comp) { + return comp(rhs, lhs) ? rhs : lhs; +} + +/*****************************************************************************************/ +// iter_swap +// 将两个迭代器所指对象对调 +/*****************************************************************************************/ +template +void iter_swap(FIter1 lhs, FIter2 rhs) { + mystl::swap(*lhs, *rhs); +} + +/*****************************************************************************************/ +// copy +// 把 [first, last)区间内的元素拷贝到 [result, result + (last - first))内 +/*****************************************************************************************/ +// input_iterator_tag 版本 +template +OutputIter unchecked_copy_cat(InputIter first, InputIter last, + OutputIter result, mystl::input_iterator_tag) { + for (; first != last; ++first, ++result) { + *result = *first; + } + return result; +} + +// ramdom_access_iterator_tag 版本 +template +OutputIter +unchecked_copy_cat(RandomIter first, RandomIter last, OutputIter result, + mystl::random_access_iterator_tag) { + for (auto n = last - first; n > 0; --n, ++first, ++result) { + *result = *first; + } + return result; +} + +template +OutputIter unchecked_copy(InputIter first, InputIter last, OutputIter result) { + return unchecked_copy_cat(first, last, result, iterator_category(first)); +} + +// 为 trivially_copy_assignable 类型提供特化版本 +template +typename std::enable_if< + std::is_same::type, Up>::value + && std::is_trivially_copy_assignable::value, + Up*>::type +unchecked_copy(Tp* first, Tp* last, Up* result) { + const auto n = static_cast(last - first); + if (n != 0) { + std::memmove(result, first, n * sizeof(Up)); + } + return result + n; +} + +template +OutputIter copy(InputIter first, InputIter last, OutputIter result) { + return unchecked_copy(first, last, result); +} + +/*****************************************************************************************/ +// copy_backward +// 将 [first, last)区间内的元素拷贝到 [result - (last - first), result)内 +/*****************************************************************************************/ +// unchecked_copy_backward_cat 的 bidirectional_iterator_tag 版本 +template +BidirectionalIter2 +unchecked_copy_backward_cat(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result, + mystl::bidirectional_iterator_tag) { + while (first != last) { + *--result = *--last; + } + return result; +} + +// unchecked_copy_backward_cat 的 random_access_iterator_tag 版本 +template +BidirectionalIter2 +unchecked_copy_backward_cat(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result, + mystl::random_access_iterator_tag) { + for (auto n = last - first; n > 0; --n) { + *--result = *--last; + } + return result; +} + +template +BidirectionalIter2 +unchecked_copy_backward(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result) { + return unchecked_copy_backward_cat(first, last, result, + iterator_category(first)); +} + +// 为 trivially_copy_assignable 类型提供特化版本 +template +typename std::enable_if< + std::is_same::type, Up>::value + && std::is_trivially_copy_assignable::value, + Up*>::type +unchecked_copy_backward(Tp* first, Tp* last, Up* result) { + const auto n = static_cast(last - first); + if (n != 0) { + result -= n; + std::memmove(result, first, n * sizeof(Up)); + } + return result; +} + +template +BidirectionalIter2 +copy_backward(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result) { + return unchecked_copy_backward(first, last, result); +} + +/*****************************************************************************************/ +// copy_if +// 把[first, last)内满足一元操作 unary_pred 的元素拷贝到以 result +// 为起始的位置上 +/*****************************************************************************************/ +template +OutputIter copy_if(InputIter first, InputIter last, OutputIter result, + UnaryPredicate unary_pred) { + for (; first != last; ++first) { + if (unary_pred(*first)) { + *result++ = *first; + } + } + return result; +} + +/*****************************************************************************************/ +// copy_n +// 把 [first, first + n)区间上的元素拷贝到 [result, result + n)上 +// 返回一个 pair 分别指向拷贝结束的尾部 +/*****************************************************************************************/ +template +mystl::pair +unchecked_copy_n(InputIter first, Size n, OutputIter result, + mystl::input_iterator_tag) { + for (; n > 0; --n, ++first, ++result) { + *result = *first; + } + return mystl::pair(first, result); +} + +template +mystl::pair +unchecked_copy_n(RandomIter first, Size n, OutputIter result, + mystl::random_access_iterator_tag) { + auto last = first + n; + return mystl::pair(last, mystl::copy(first, last, + result)); +} + +template +mystl::pair +copy_n(InputIter first, Size n, OutputIter result) { + return unchecked_copy_n(first, n, result, iterator_category(first)); +} + +/*****************************************************************************************/ +// move +// 把 [first, last)区间内的元素移动到 [result, result + (last - first))内 +/*****************************************************************************************/ +// input_iterator_tag 版本 +template +OutputIter unchecked_move_cat(InputIter first, InputIter last, + OutputIter result, mystl::input_iterator_tag) { + for (; first != last; ++first, ++result) { + *result = mystl::move(*first); + } + return result; +} + +// ramdom_access_iterator_tag 版本 +template +OutputIter +unchecked_move_cat(RandomIter first, RandomIter last, OutputIter result, + mystl::random_access_iterator_tag) { + for (auto n = last - first; n > 0; --n, ++first, ++result) { + *result = mystl::move(*first); + } + return result; +} + +template +OutputIter unchecked_move(InputIter first, InputIter last, OutputIter result) { + return unchecked_move_cat(first, last, result, iterator_category(first)); +} + +// 为 trivially_copy_assignable 类型提供特化版本 +template +typename std::enable_if< + std::is_same::type, Up>::value + && std::is_trivially_move_assignable::value, + Up*>::type +unchecked_move(Tp* first, Tp* last, Up* result) { + const size_t n = static_cast(last - first); + if (n != 0) { + std::memmove(result, first, n * sizeof(Up)); + } + return result + n; +} + +template +OutputIter move(InputIter first, InputIter last, OutputIter result) { + return unchecked_move(first, last, result); +} + +/*****************************************************************************************/ +// move_backward +// 将 [first, last)区间内的元素移动到 [result - (last - first), result)内 +/*****************************************************************************************/ +// bidirectional_iterator_tag 版本 +template +BidirectionalIter2 +unchecked_move_backward_cat(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result, + mystl::bidirectional_iterator_tag) { + while (first != last) { + *--result = mystl::move(*--last); + } + return result; +} + +// random_access_iterator_tag 版本 +template +RandomIter2 unchecked_move_backward_cat(RandomIter1 first, RandomIter1 last, + RandomIter2 result, + mystl::random_access_iterator_tag) { + for (auto n = last - first; n > 0; --n) { + *--result = mystl::move(*--last); + } + return result; +} + +template +BidirectionalIter2 +unchecked_move_backward(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result) { + return unchecked_move_backward_cat(first, last, result, + iterator_category(first)); +} + +// 为 trivially_copy_assignable 类型提供特化版本 +template +typename std::enable_if< + std::is_same::type, Up>::value + && std::is_trivially_move_assignable::value, + Up*>::type +unchecked_move_backward(Tp* first, Tp* last, Up* result) { + const size_t n = static_cast(last - first); + if (n != 0) { + result -= n; + std::memmove(result, first, n * sizeof(Up)); + } + return result; +} + +template +BidirectionalIter2 +move_backward(BidirectionalIter1 first, BidirectionalIter1 last, + BidirectionalIter2 result) { + return unchecked_move_backward(first, last, result); +} + +/*****************************************************************************************/ +// equal +// 比较第一序列在 [first, last)区间上的元素值是否和第二序列相等 +/*****************************************************************************************/ +template +bool equal(InputIter1 first1, InputIter1 last1, InputIter2 first2) { + for (; first1 != last1; ++first1, ++first2) { + if (*first1 != *first2) { + return false; + } + } + return true; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool equal(InputIter1 first1, InputIter1 last1, InputIter2 first2, + Compared comp) { + for (; first1 != last1; ++first1, ++first2) { + if (!comp(*first1, *first2)) { + return false; + } + } + return true; +} + +/*****************************************************************************************/ +// fill_n +// 从 first 位置开始填充 n 个值 +/*****************************************************************************************/ +template +OutputIter unchecked_fill_n(OutputIter first, Size n, const T& value) { + for (; n > 0; --n, ++first) { + *first = value; + } + return first; +} + +// 为 one-byte 类型提供特化版本 +template +typename std::enable_if::value && sizeof(Tp) == 1 + && !std::is_same::value + && std::is_integral::value && sizeof(Up) == 1, + Tp*>::type +unchecked_fill_n(Tp* first, Size n, Up value) { + if (n > 0) { + std::memset(first, (unsigned char)value, (size_t)(n)); + } + return first + n; +} + +template +OutputIter fill_n(OutputIter first, Size n, const T& value) { + return unchecked_fill_n(first, n, value); +} + +/*****************************************************************************************/ +// fill +// 为 [first, last)区间内的所有元素填充新值 +/*****************************************************************************************/ +template +void fill_cat(ForwardIter first, ForwardIter last, const T& value, + mystl::forward_iterator_tag) { + for (; first != last; ++first) { + *first = value; + } +} + +template +void fill_cat(RandomIter first, RandomIter last, const T& value, + mystl::random_access_iterator_tag) { + fill_n(first, last - first, value); +} + +template +void fill(ForwardIter first, ForwardIter last, const T& value) { + fill_cat(first, last, value, iterator_category(first)); +} + +/*****************************************************************************************/ +// lexicographical_compare +// 以字典序排列对两个序列进行比较,当在某个位置发现第一组不相等元素时,有下列几种情况: +// (1)如果第一序列的元素较小,返回 true ,否则返回 false +// (2)如果到达 last1 而尚未到达 last2 返回 true +// (3)如果到达 last2 而尚未到达 last1 返回 false +// (4)如果同时到达 last1 和 last2 返回 false +/*****************************************************************************************/ +template +bool lexicographical_compare(InputIter1 first1, InputIter1 last1, + InputIter2 first2, InputIter2 last2) { + for (; first1 != last1 && first2 != last2; ++first1, ++first2) { + if (*first1 < *first2) { + return true; + } + if (*first2 < *first1) { + return false; + } + } + return first1 == last1 && first2 != last2; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +bool lexicographical_compare(InputIter1 first1, InputIter1 last1, + InputIter2 first2, InputIter2 last2, + Compred comp) { + for (; first1 != last1 && first2 != last2; ++first1, ++first2) { + if (comp(*first1, *first2)) { + return true; + } + if (comp(*first2, *first1)) { + return false; + } + } + return first1 == last1 && first2 != last2; +} + +// 针对 const unsigned char* 的特化版本 +// bool lexicographical_compare(const unsigned char *first1, +// const unsigned char *last1, +// const unsigned char *first2, +// const unsigned char *last2) { +// const auto len1 = last1 - first1; +// const auto len2 = last2 - first2; +// // 先比较相同长度的部分 +// const auto result = std::memcmp(first1, first2, mystl::min(len1, +// len2)); +// // 若相等,长度较长的比较大 +// return result != 0 ? result < 0 : len1 < len2; +// } + +/*****************************************************************************************/ +// mismatch +// 平行比较两个序列,找到第一处失配的元素,返回一对迭代器,分别指向两个序列中失配的元素 +/*****************************************************************************************/ +template +mystl::pair +mismatch(InputIter1 first1, InputIter1 last1, InputIter2 first2) { + while (first1 != last1 && *first1 == *first2) { + ++first1; + ++first2; + } + return mystl::pair(first1, first2); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +mystl::pair +mismatch(InputIter1 first1, InputIter1 last1, InputIter2 first2, Compred comp) { + while (first1 != last1 && comp(*first1, *first2)) { + ++first1; + ++first2; + } + return mystl::pair(first1, first2); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_ALGOBASE */ diff --git a/src/libcxx/include/algorithm b/src/libcxx/include/algorithm new file mode 100644 index 000000000..23245af93 --- /dev/null +++ b/src/libcxx/include/algorithm @@ -0,0 +1,32 @@ + +/** + * @file algorithm + * @brief stl algorithm 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ALGORITHM +#define SIMPLEKERNEL_ALGORITHM + +// 这个头文件包含了 std 的所有算法,包括基本算法,数值算法,heap 算法,set +// 算法和其他算法 + +#include "algo" +#include "algobase" +#include "heap_algo" +#include "numeric" +#include "set_algo" + +namespace mystl { }; + +#endif /* SIMPLEKERNEL_ALGORITHM */ diff --git a/src/libcxx/include/allocator b/src/libcxx/include/allocator new file mode 100644 index 000000000..0be8b136f --- /dev/null +++ b/src/libcxx/include/allocator @@ -0,0 +1,123 @@ + +/** + * @file allocator + * @brief stl allocator 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ALLOCATOR +#define SIMPLEKERNEL_ALLOCATOR + +// 这个头文件包含一个模板类 +// allocator,用于管理内存的分配、释放,对象的构造、析构 + +#include "construct" +#include "stddef.h" +#include "util" + +namespace mystl { + +// 模板类:allocator +// 模板函数代表数据类型 +template +class allocator { +public: + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + +public: + static T* allocate(); + static T* allocate(size_type n); + + static void deallocate(T* ptr); + static void deallocate(T* ptr, size_type n); + + static void construct(T* ptr); + static void construct(T* ptr, const T& value); + static void construct(T* ptr, T&& value); + + template + static void construct(T* ptr, Args&&... args); + + static void destroy(T* ptr); + static void destroy(T* first, T* last); +}; + +template +T* allocator::allocate() { + return static_cast(::operator new(sizeof(T))); +} + +template +T* allocator::allocate(size_type n) { + if (n == 0) { + return nullptr; + } + return static_cast(::operator new(n * sizeof(T))); +} + +template +void allocator::deallocate(T* ptr) { + if (ptr == nullptr) { + return; + } + ::operator delete(ptr); +} + +template +void allocator::deallocate(T* ptr, size_type /*size*/) { + if (ptr == nullptr) { + return; + } + ::operator delete(ptr); +} + +template +void allocator::construct(T* ptr) { + mystl::construct(ptr); +} + +template +void allocator::construct(T* ptr, const T& value) { + mystl::construct(ptr, value); +} + +template +void allocator::construct(T* ptr, T&& value) { + mystl::construct(ptr, mystl::move(value)); +} + +template +template +void allocator::construct(T* ptr, Args&&... args) { + mystl::construct(ptr, mystl::forward(args)...); +} + +template +void allocator::destroy(T* ptr) { + mystl::destroy(ptr); +} + +template +void allocator::destroy(T* first, T* last) { + mystl::destroy(first, last); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_ALLOCATOR */ diff --git a/src/libcxx/include/astring b/src/libcxx/include/astring new file mode 100644 index 000000000..c12e19451 --- /dev/null +++ b/src/libcxx/include/astring @@ -0,0 +1,34 @@ + +/** + * @file astring + * @brief stl astring 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ASTRING +#define SIMPLEKERNEL_ASTRING + +// 定义了 string, wstring, u16string, u32string 类型 + +#include "basic_string" + +namespace mystl { + +using string = mystl::basic_string; +using wstring = mystl::basic_string; +using u16string = mystl::basic_string; +using u32string = mystl::basic_string; + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_ASTRING */ diff --git a/src/libcxx/include/atomic b/src/libcxx/include/atomic new file mode 100644 index 000000000..86bd19c05 --- /dev/null +++ b/src/libcxx/include/atomic @@ -0,0 +1,1368 @@ + +/** + * @file atomic + * @brief stl atomic 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on GCC + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +// -*- C++ -*- header. + +// Copyright (C) 2008-2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/** @file include/atomic + * This is a Standard C++ Library header. + */ + +// Based on "C++ Atomic Types and Operations" by Hans Boehm and Lawrence Crowl. +// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2427.html + +// 原子操作 + +#ifndef SIMPLEKERNEL_ATOMIC +#define SIMPLEKERNEL_ATOMIC + +#include "atomic_basic" + +namespace std { + +#if __cplusplus > 201402L +# define __cpp_lib_atomic_is_always_lock_free 201603 +# define ATOMIC_INT_LOCK_FREE 2 +# define ATOMIC_BOOL_LOCK_FREE 2 +# define ATOMIC_LONG_LOCK_FREE 2 +# define ATOMIC_LLONG_LOCK_FREE 2 +# define ATOMIC_POINTER_LOCK_FREE 2 +# define ATOMIC_CHAR_LOCK_FREE 2 +# define ATOMIC_SHORT_LOCK_FREE 2 +# define ATOMIC_WCHAR_T_LOCK_FREE 2 +# define ATOMIC_CHAR16_T_LOCK_FREE 2 +# define ATOMIC_CHAR32_T_LOCK_FREE 2 +#endif + +template +struct atomic; + +/// atomic +// NB: No operators or fetch-operations for this type. +template <> +struct atomic { +private: + __atomic_base _M_base; + +public: + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(bool __i) noexcept : _M_base(__i) { + } + + bool operator=(bool __i) noexcept { + return _M_base.operator=(__i); + } + + bool operator=(bool __i) volatile noexcept { + return _M_base.operator=(__i); + } + + operator bool() const noexcept { + return _M_base.load(); + } + + operator bool() const volatile noexcept { + return _M_base.load(); + } + + bool is_lock_free() const noexcept { + return _M_base.is_lock_free(); + } + + bool is_lock_free() const volatile noexcept { + return _M_base.is_lock_free(); + } + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_BOOL_LOCK_FREE == 2; +#endif + + void store(bool __i, memory_order __m = memory_order_seq_cst) noexcept { + _M_base.store(__i, __m); + } + + void + store(bool __i, memory_order __m = memory_order_seq_cst) volatile noexcept { + _M_base.store(__i, __m); + } + + bool load(memory_order __m = memory_order_seq_cst) const noexcept { + return _M_base.load(__m); + } + + bool load(memory_order __m = memory_order_seq_cst) const volatile noexcept { + return _M_base.load(__m); + } + + bool exchange(bool __i, memory_order __m = memory_order_seq_cst) noexcept { + return _M_base.exchange(__i, __m); + } + + bool exchange(bool __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return _M_base.exchange(__i, __m); + } + + bool compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) noexcept { + return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); + } + + bool compare_exchange_weak(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) volatile noexcept { + return _M_base.compare_exchange_weak(__i1, __i2, __m1, __m2); + } + + bool + compare_exchange_weak(bool& __i1, bool __i2, + memory_order __m = memory_order_seq_cst) noexcept { + return _M_base.compare_exchange_weak(__i1, __i2, __m); + } + + bool compare_exchange_weak(bool& __i1, bool __i2, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return _M_base.compare_exchange_weak(__i1, __i2, __m); + } + + bool compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) noexcept { + return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); + } + + bool compare_exchange_strong(bool& __i1, bool __i2, memory_order __m1, + memory_order __m2) volatile noexcept { + return _M_base.compare_exchange_strong(__i1, __i2, __m1, __m2); + } + + bool + compare_exchange_strong(bool& __i1, bool __i2, + memory_order __m = memory_order_seq_cst) noexcept { + return _M_base.compare_exchange_strong(__i1, __i2, __m); + } + + bool compare_exchange_strong(bool& __i1, bool __i2, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return _M_base.compare_exchange_strong(__i1, __i2, __m); + } +}; + +/** + * @brief Generic atomic type, primary class template. + * + * @tparam _Tp Type to be made atomic, must be trivally copyable. + */ +template +struct atomic { +private: + // Align 1/2/4/8/16-byte types to at least their size. + static constexpr int _S_min_alignment + = (sizeof(_Tp) & (sizeof(_Tp) - 1)) || sizeof(_Tp) > 16 ? 0 : sizeof(_Tp); + + static constexpr int _S_alignment + = _S_min_alignment > alignof(_Tp) ? _S_min_alignment : alignof(_Tp); + + alignas(_S_alignment) _Tp _M_i; + + static_assert(__is_trivially_copyable(_Tp), + "std::atomic requires a trivially copyable type"); + + static_assert(sizeof(_Tp) > 0, + "Incomplete or zero-sized types are not supported"); + +public: + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(_Tp __i) noexcept : _M_i(__i) { + } + + operator _Tp() const noexcept { + return load(); + } + + operator _Tp() const volatile noexcept { + return load(); + } + + _Tp operator=(_Tp __i) noexcept { + store(__i); + return __i; + } + + _Tp operator=(_Tp __i) volatile noexcept { + store(__i); + return __i; + } + + bool is_lock_free() const noexcept { + // Produce a fake, minimally aligned pointer. + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + bool is_lock_free() const volatile noexcept { + // Produce a fake, minimally aligned pointer. + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free + = __atomic_always_lock_free(sizeof(_M_i), 0); +#endif + + void store(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept { + __atomic_store(&(_M_i), &(__i), __m); + } + + void + store(_Tp __i, memory_order __m = memory_order_seq_cst) volatile noexcept { + __atomic_store(&(_M_i), &(__i), __m); + } + + _Tp load(memory_order __m = memory_order_seq_cst) const noexcept { + alignas(_Tp) unsigned char __buf[sizeof(_Tp)]; + _Tp* __ptr = reinterpret_cast<_Tp*>(__buf); + __atomic_load(&(_M_i), __ptr, __m); + return *__ptr; + } + + _Tp load(memory_order __m = memory_order_seq_cst) const volatile noexcept { + alignas(_Tp) unsigned char __buf[sizeof(_Tp)]; + _Tp* __ptr = reinterpret_cast<_Tp*>(__buf); + __atomic_load(&(_M_i), __ptr, __m); + return *__ptr; + } + + _Tp exchange(_Tp __i, memory_order __m = memory_order_seq_cst) noexcept { + alignas(_Tp) unsigned char __buf[sizeof(_Tp)]; + _Tp* __ptr = reinterpret_cast<_Tp*>(__buf); + __atomic_exchange(&(_M_i), &(__i), __ptr, __m); + return *__ptr; + } + + _Tp exchange(_Tp __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + alignas(_Tp) unsigned char __buf[sizeof(_Tp)]; + _Tp* __ptr = reinterpret_cast<_Tp*>(__buf); + __atomic_exchange(&(_M_i), &(__i), __ptr, __m); + return *__ptr; + } + + bool compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) noexcept { + return __atomic_compare_exchange(&(_M_i), &(__e), &(__i), true, __s, + __f); + } + + bool compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) volatile noexcept { + return __atomic_compare_exchange(&(_M_i), &(__e), &(__i), true, __s, + __f); + } + + bool + compare_exchange_weak(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) noexcept { + return compare_exchange_weak(__e, __i, __m, + __cmpexch_failure_order(__m)); + } + + bool compare_exchange_weak(_Tp& __e, _Tp __i, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return compare_exchange_weak(__e, __i, __m, + __cmpexch_failure_order(__m)); + } + + bool compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) noexcept { + return __atomic_compare_exchange(&(_M_i), &(__e), &(__i), false, __s, + __f); + } + + bool compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, + memory_order __f) volatile noexcept { + return __atomic_compare_exchange(&(_M_i), &(__e), &(__i), false, __s, + __f); + } + + bool + compare_exchange_strong(_Tp& __e, _Tp __i, + memory_order __m = memory_order_seq_cst) noexcept { + return compare_exchange_strong(__e, __i, __m, + __cmpexch_failure_order(__m)); + } + + bool compare_exchange_strong(_Tp& __e, _Tp __i, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return compare_exchange_strong(__e, __i, __m, + __cmpexch_failure_order(__m)); + } +}; + +/// Partial specialization for pointer types. +template +struct atomic<_Tp*> { + typedef _Tp* __pointer_type; + typedef __atomic_base<_Tp*> __base_type; + __base_type _M_b; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__pointer_type __p) noexcept : _M_b(__p) { + } + + operator __pointer_type() const noexcept { + return __pointer_type(_M_b); + } + + operator __pointer_type() const volatile noexcept { + return __pointer_type(_M_b); + } + + __pointer_type operator=(__pointer_type __p) noexcept { + return _M_b.operator=(__p); + } + + __pointer_type operator=(__pointer_type __p) volatile noexcept { + return _M_b.operator=(__p); + } + + __pointer_type operator++(int) noexcept { + return _M_b++; + } + + __pointer_type operator++(int) volatile noexcept { + return _M_b++; + } + + __pointer_type operator--(int) noexcept { + return _M_b--; + } + + __pointer_type operator--(int) volatile noexcept { + return _M_b--; + } + + __pointer_type operator++() noexcept { + return ++_M_b; + } + + __pointer_type operator++() volatile noexcept { + return ++_M_b; + } + + __pointer_type operator--() noexcept { + return --_M_b; + } + + __pointer_type operator--() volatile noexcept { + return --_M_b; + } + + __pointer_type operator+=(ptrdiff_t __d) noexcept { + return _M_b.operator+=(__d); + } + + __pointer_type operator+=(ptrdiff_t __d) volatile noexcept { + return _M_b.operator+=(__d); + } + + __pointer_type operator-=(ptrdiff_t __d) noexcept { + return _M_b.operator-=(__d); + } + + __pointer_type operator-=(ptrdiff_t __d) volatile noexcept { + return _M_b.operator-=(__d); + } + + bool is_lock_free() const noexcept { + return _M_b.is_lock_free(); + } + + bool is_lock_free() const volatile noexcept { + return _M_b.is_lock_free(); + } + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_POINTER_LOCK_FREE == 2; +#endif + + void store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept { + return _M_b.store(__p, __m); + } + + void store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return _M_b.store(__p, __m); + } + + __pointer_type + load(memory_order __m = memory_order_seq_cst) const noexcept { + return _M_b.load(__m); + } + + __pointer_type + load(memory_order __m = memory_order_seq_cst) const volatile noexcept { + return _M_b.load(__m); + } + + __pointer_type exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept { + return _M_b.exchange(__p, __m); + } + + __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return _M_b.exchange(__p, __m); + } + + bool compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, memory_order __m2) noexcept { + return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); + } + + bool compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) volatile noexcept { + return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); + } + + bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m = memory_order_seq_cst) noexcept { + return compare_exchange_weak(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + bool compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return compare_exchange_weak(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, memory_order __m2) noexcept { + return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); + } + + bool compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) volatile noexcept { + return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); + } + + bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m = memory_order_seq_cst) noexcept { + return _M_b.compare_exchange_strong(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + bool compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return _M_b.compare_exchange_strong(__p1, __p2, __m, + __cmpexch_failure_order(__m)); + } + + __pointer_type + fetch_add(ptrdiff_t __d, memory_order __m = memory_order_seq_cst) noexcept { + return _M_b.fetch_add(__d, __m); + } + + __pointer_type + fetch_add(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return _M_b.fetch_add(__d, __m); + } + + __pointer_type + fetch_sub(ptrdiff_t __d, memory_order __m = memory_order_seq_cst) noexcept { + return _M_b.fetch_sub(__d, __m); + } + + __pointer_type + fetch_sub(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return _M_b.fetch_sub(__d, __m); + } +}; + +/// Explicit specialization for char. +template <> +struct atomic : __atomic_base { + typedef char __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_CHAR_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for signed char. +template <> +struct atomic : __atomic_base { + typedef signed char __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_CHAR_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for unsigned char. +template <> +struct atomic : __atomic_base { + typedef unsigned char __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_CHAR_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for short. +template <> +struct atomic : __atomic_base { + typedef short __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_SHORT_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for unsigned short. +template <> +struct atomic : __atomic_base { + typedef unsigned short __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_SHORT_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for int. +template <> +struct atomic : __atomic_base { + typedef int __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_INT_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for unsigned int. +template <> +struct atomic : __atomic_base { + typedef unsigned int __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_INT_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for long. +template <> +struct atomic : __atomic_base { + typedef long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_LONG_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for unsigned long. +template <> +struct atomic : __atomic_base { + typedef unsigned long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_LONG_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for long long. +template <> +struct atomic : __atomic_base { + typedef long long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_LLONG_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for unsigned long long. +template <> +struct atomic : __atomic_base { + typedef unsigned long long __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_LLONG_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for wchar_t. +template <> +struct atomic : __atomic_base { + typedef wchar_t __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_WCHAR_T_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for char16_t. +template <> +struct atomic : __atomic_base { + typedef char16_t __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_CHAR16_T_LOCK_FREE == 2; +#endif +}; + +/// Explicit specialization for char32_t. +template <> +struct atomic : __atomic_base { + typedef char32_t __integral_type; + typedef __atomic_base __base_type; + + atomic() noexcept = default; + ~atomic() noexcept = default; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + + constexpr atomic(__integral_type __i) noexcept : __base_type(__i) { + } + + using __base_type::operator __integral_type; + using __base_type::operator=; + +#if __cplusplus > 201402L + static constexpr bool is_always_lock_free = ATOMIC_CHAR32_T_LOCK_FREE == 2; +#endif +}; + +/// atomic_bool +typedef atomic atomic_bool; + +/// atomic_char +typedef atomic atomic_char; + +/// atomic_schar +typedef atomic atomic_schar; + +/// atomic_uchar +typedef atomic atomic_uchar; + +/// atomic_short +typedef atomic atomic_short; + +/// atomic_ushort +typedef atomic atomic_ushort; + +/// atomic_int +typedef atomic atomic_int; + +/// atomic_uint +typedef atomic atomic_uint; + +/// atomic_long +typedef atomic atomic_long; + +/// atomic_ulong +typedef atomic atomic_ulong; + +/// atomic_llong +typedef atomic atomic_llong; + +/// atomic_ullong +typedef atomic atomic_ullong; + +/// atomic_wchar_t +typedef atomic atomic_wchar_t; + +/// atomic_char16_t +typedef atomic atomic_char16_t; + +/// atomic_char32_t +typedef atomic atomic_char32_t; + +#ifdef _GLIBCXX_USE_C99_STDINT_TR1 +// _GLIBCXX_RESOLVE_LIB_DEFECTS +// 2441. Exact-width atomic typedefs should be provided + +/// atomic_int8_t +typedef atomic atomic_int8_t; + +/// atomic_uint8_t +typedef atomic atomic_uint8_t; + +/// atomic_int16_t +typedef atomic atomic_int16_t; + +/// atomic_uint16_t +typedef atomic atomic_uint16_t; + +/// atomic_int32_t +typedef atomic atomic_int32_t; + +/// atomic_uint32_t +typedef atomic atomic_uint32_t; + +/// atomic_int64_t +typedef atomic atomic_int64_t; + +/// atomic_uint64_t +typedef atomic atomic_uint64_t; + +/// atomic_int_least8_t +typedef atomic atomic_int_least8_t; + +/// atomic_uint_least8_t +typedef atomic atomic_uint_least8_t; + +/// atomic_int_least16_t +typedef atomic atomic_int_least16_t; + +/// atomic_uint_least16_t +typedef atomic atomic_uint_least16_t; + +/// atomic_int_least32_t +typedef atomic atomic_int_least32_t; + +/// atomic_uint_least32_t +typedef atomic atomic_uint_least32_t; + +/// atomic_int_least64_t +typedef atomic atomic_int_least64_t; + +/// atomic_uint_least64_t +typedef atomic atomic_uint_least64_t; + +/// atomic_int_fast8_t +typedef atomic atomic_int_fast8_t; + +/// atomic_uint_fast8_t +typedef atomic atomic_uint_fast8_t; + +/// atomic_int_fast16_t +typedef atomic atomic_int_fast16_t; + +/// atomic_uint_fast16_t +typedef atomic atomic_uint_fast16_t; + +/// atomic_int_fast32_t +typedef atomic atomic_int_fast32_t; + +/// atomic_uint_fast32_t +typedef atomic atomic_uint_fast32_t; + +/// atomic_int_fast64_t +typedef atomic atomic_int_fast64_t; + +/// atomic_uint_fast64_t +typedef atomic atomic_uint_fast64_t; +#endif + +/// atomic_intptr_t +typedef atomic atomic_intptr_t; + +/// atomic_uintptr_t +typedef atomic atomic_uintptr_t; + +/// atomic_size_t +typedef atomic atomic_size_t; + +/// atomic_ptrdiff_t +typedef atomic atomic_ptrdiff_t; + +#ifdef _GLIBCXX_USE_C99_STDINT_TR1 +/// atomic_intmax_t +typedef atomic atomic_intmax_t; + +/// atomic_uintmax_t +typedef atomic atomic_uintmax_t; +#endif + +// Function definitions, atomic_flag operations. +inline bool +atomic_flag_test_and_set_explicit(atomic_flag* __a, memory_order __m) noexcept { + return __a->test_and_set(__m); +} + +inline bool atomic_flag_test_and_set_explicit(volatile atomic_flag* __a, + memory_order __m) noexcept { + return __a->test_and_set(__m); +} + +inline void +atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept { + __a->clear(__m); +} + +inline void atomic_flag_clear_explicit(volatile atomic_flag* __a, + memory_order __m) noexcept { + __a->clear(__m); +} + +inline bool atomic_flag_test_and_set(atomic_flag* __a) noexcept { + return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); +} + +inline bool atomic_flag_test_and_set(volatile atomic_flag* __a) noexcept { + return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); +} + +inline void atomic_flag_clear(atomic_flag* __a) noexcept { + atomic_flag_clear_explicit(__a, memory_order_seq_cst); +} + +inline void atomic_flag_clear(volatile atomic_flag* __a) noexcept { + atomic_flag_clear_explicit(__a, memory_order_seq_cst); +} + +// Function templates generally applicable to atomic types. +template +inline bool atomic_is_lock_free(const atomic<_ITp>* __a) noexcept { + return __a->is_lock_free(); +} + +template +inline bool atomic_is_lock_free(const volatile atomic<_ITp>* __a) noexcept { + return __a->is_lock_free(); +} + +template +inline void atomic_init(atomic<_ITp>* __a, _ITp __i) noexcept { + __a->store(__i, memory_order_relaxed); +} + +template +inline void atomic_init(volatile atomic<_ITp>* __a, _ITp __i) noexcept { + __a->store(__i, memory_order_relaxed); +} + +template +inline void +atomic_store_explicit(atomic<_ITp>* __a, _ITp __i, memory_order __m) noexcept { + __a->store(__i, __m); +} + +template +inline void atomic_store_explicit(volatile atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + __a->store(__i, __m); +} + +template +inline _ITp +atomic_load_explicit(const atomic<_ITp>* __a, memory_order __m) noexcept { + return __a->load(__m); +} + +template +inline _ITp atomic_load_explicit(const volatile atomic<_ITp>* __a, + memory_order __m) noexcept { + return __a->load(__m); +} + +template +inline _ITp atomic_exchange_explicit(atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->exchange(__i, __m); +} + +template +inline _ITp atomic_exchange_explicit(volatile atomic<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->exchange(__i, __m); +} + +template +inline bool atomic_compare_exchange_weak_explicit(atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2, memory_order __m1, + memory_order __m2) noexcept { + return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); +} + +template +inline bool +atomic_compare_exchange_weak_explicit(volatile atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2, memory_order __m1, + memory_order __m2) noexcept { + return __a->compare_exchange_weak(*__i1, __i2, __m1, __m2); +} + +template +inline bool +atomic_compare_exchange_strong_explicit(atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2, memory_order __m1, + memory_order __m2) noexcept { + return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); +} + +template +inline bool +atomic_compare_exchange_strong_explicit(volatile atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2, memory_order __m1, + memory_order __m2) noexcept { + return __a->compare_exchange_strong(*__i1, __i2, __m1, __m2); +} + +template +inline void atomic_store(atomic<_ITp>* __a, _ITp __i) noexcept { + atomic_store_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline void atomic_store(volatile atomic<_ITp>* __a, _ITp __i) noexcept { + atomic_store_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp atomic_load(const atomic<_ITp>* __a) noexcept { + return atomic_load_explicit(__a, memory_order_seq_cst); +} + +template +inline _ITp atomic_load(const volatile atomic<_ITp>* __a) noexcept { + return atomic_load_explicit(__a, memory_order_seq_cst); +} + +template +inline _ITp atomic_exchange(atomic<_ITp>* __a, _ITp __i) noexcept { + return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp atomic_exchange(volatile atomic<_ITp>* __a, _ITp __i) noexcept { + return atomic_exchange_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline bool atomic_compare_exchange_weak(atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2) noexcept { + return atomic_compare_exchange_weak_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); +} + +template +inline bool atomic_compare_exchange_weak(volatile atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2) noexcept { + return atomic_compare_exchange_weak_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); +} + +template +inline bool atomic_compare_exchange_strong(atomic<_ITp>* __a, _ITp* __i1, + _ITp __i2) noexcept { + return atomic_compare_exchange_strong_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); +} + +template +inline bool atomic_compare_exchange_strong(volatile atomic<_ITp>* __a, + _ITp* __i1, _ITp __i2) noexcept { + return atomic_compare_exchange_strong_explicit(__a, __i1, __i2, + memory_order_seq_cst, + memory_order_seq_cst); +} + +// Function templates for atomic_integral operations only, using +// __atomic_base. Template argument should be constricted to +// intergral types as specified in the standard, excluding address +// types. +template +inline _ITp atomic_fetch_add_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->fetch_add(__i, __m); +} + +template +inline _ITp atomic_fetch_add_explicit(volatile __atomic_base<_ITp>* __a, + _ITp __i, memory_order __m) noexcept { + return __a->fetch_add(__i, __m); +} + +template +inline _ITp atomic_fetch_sub_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->fetch_sub(__i, __m); +} + +template +inline _ITp atomic_fetch_sub_explicit(volatile __atomic_base<_ITp>* __a, + _ITp __i, memory_order __m) noexcept { + return __a->fetch_sub(__i, __m); +} + +template +inline _ITp atomic_fetch_and_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->fetch_and(__i, __m); +} + +template +inline _ITp atomic_fetch_and_explicit(volatile __atomic_base<_ITp>* __a, + _ITp __i, memory_order __m) noexcept { + return __a->fetch_and(__i, __m); +} + +template +inline _ITp atomic_fetch_or_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->fetch_or(__i, __m); +} + +template +inline _ITp atomic_fetch_or_explicit(volatile __atomic_base<_ITp>* __a, + _ITp __i, memory_order __m) noexcept { + return __a->fetch_or(__i, __m); +} + +template +inline _ITp atomic_fetch_xor_explicit(__atomic_base<_ITp>* __a, _ITp __i, + memory_order __m) noexcept { + return __a->fetch_xor(__i, __m); +} + +template +inline _ITp atomic_fetch_xor_explicit(volatile __atomic_base<_ITp>* __a, + _ITp __i, memory_order __m) noexcept { + return __a->fetch_xor(__i, __m); +} + +template +inline _ITp atomic_fetch_add(__atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp +atomic_fetch_add(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_add_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp atomic_fetch_sub(__atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp +atomic_fetch_sub(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_sub_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp atomic_fetch_and(__atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp +atomic_fetch_and(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_and_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp atomic_fetch_or(__atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp +atomic_fetch_or(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_or_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp atomic_fetch_xor(__atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); +} + +template +inline _ITp +atomic_fetch_xor(volatile __atomic_base<_ITp>* __a, _ITp __i) noexcept { + return atomic_fetch_xor_explicit(__a, __i, memory_order_seq_cst); +} + +// Partial specializations for pointers. +template +inline _ITp* atomic_fetch_add_explicit(atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept { + return __a->fetch_add(__d, __m); +} + +template +inline _ITp* +atomic_fetch_add_explicit(volatile atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept { + return __a->fetch_add(__d, __m); +} + +template +inline _ITp* +atomic_fetch_add(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept { + return __a->fetch_add(__d); +} + +template +inline _ITp* atomic_fetch_add(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept { + return __a->fetch_add(__d); +} + +template +inline _ITp* +atomic_fetch_sub_explicit(volatile atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept { + return __a->fetch_sub(__d, __m); +} + +template +inline _ITp* atomic_fetch_sub_explicit(atomic<_ITp*>* __a, ptrdiff_t __d, + memory_order __m) noexcept { + return __a->fetch_sub(__d, __m); +} + +template +inline _ITp* +atomic_fetch_sub(volatile atomic<_ITp*>* __a, ptrdiff_t __d) noexcept { + return __a->fetch_sub(__d); +} + +template +inline _ITp* atomic_fetch_sub(atomic<_ITp*>* __a, ptrdiff_t __d) noexcept { + return __a->fetch_sub(__d); +} + +} // namespace std + +#endif /* SIMPLEKERNEL_ATOMIC */ diff --git a/src/libcxx/include/atomic_basic b/src/libcxx/include/atomic_basic new file mode 100644 index 000000000..fce06526a --- /dev/null +++ b/src/libcxx/include/atomic_basic @@ -0,0 +1,756 @@ + +/** + * @file atomic_basic + * @brief stl atomic_basic 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on GCC + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +// -*- C++ -*- header. + +// Copyright (C) 2008-2018 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/** @file bits/atomic_base.h + * This is an internal header file, included by other library headers. + * Do not attempt to use it directly. @headername{atomic} + */ + +#ifndef SIMPLEKERNEL_ATOMIC_BASIC +#define SIMPLEKERNEL_ATOMIC_BASIC + +#include "cassert" + +namespace std { + +/** + * @defgroup atomics Atomics + * + * Components for performing atomic operations. + * @{ + */ + +/// Enumeration for memory_order +typedef enum memory_order { + memory_order_relaxed, + memory_order_consume, + memory_order_acquire, + memory_order_release, + memory_order_acq_rel, + memory_order_seq_cst +} memory_order; + +enum __memory_order_modifier { + __memory_order_mask = 0x0ffff, + __memory_order_modifier_mask = 0xffff0000, + __memory_order_hle_acquire = 0x10000, + __memory_order_hle_release = 0x20000 +}; + +constexpr memory_order +operator|(memory_order __m, __memory_order_modifier __mod) { + return memory_order(__m | int(__mod)); +} + +constexpr memory_order +operator&(memory_order __m, __memory_order_modifier __mod) { + return memory_order(__m & int(__mod)); +} + +// Drop release ordering as per [atomics.types.operations.req]/21 +constexpr memory_order __cmpexch_failure_order2(memory_order __m) noexcept { + return __m == memory_order_acq_rel ? memory_order_acquire + : __m == memory_order_release ? memory_order_relaxed + : __m; +} + +constexpr memory_order __cmpexch_failure_order(memory_order __m) noexcept { + return memory_order(__cmpexch_failure_order2(__m & __memory_order_mask) + | (__m & __memory_order_modifier_mask)); +} + +inline void atomic_thread_fence(memory_order __m) noexcept { + __atomic_thread_fence(__m); +} + +inline void atomic_signal_fence(memory_order __m) noexcept { + __atomic_signal_fence(__m); +} + +/// kill_dependency +template +inline _Tp kill_dependency(_Tp __y) noexcept { + _Tp __ret(__y); + return __ret; +} + +// Base types for atomics. +template +struct __atomic_base; + +#define ATOMIC_VAR_INIT(_VI) \ + { _VI } + +template +struct atomic; + +template +struct atomic<_Tp*>; + +/* The target's "set" value for test-and-set may not be exactly 1. */ +#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 +#if __GCC_ATOMIC_TEST_AND_SET_TRUEVAL == 1 +typedef bool __atomic_flag_data_type; +#else +typedef unsigned char __atomic_flag_data_type; +#endif + +/** + * @brief Base type for atomic_flag. + * + * Base type is POD with data, allowing atomic_flag to derive from + * it and meet the standard layout type requirement. In addition to + * compatibility with a C interface, this allows different + * implementations of atomic_flag to use the same atomic operation + * functions, via a standard conversion to the __atomic_flag_base + * argument. + */ + +#ifdef __cplucpluc +extern "C" { +#endif + +struct __atomic_flag_base { + __atomic_flag_data_type _M_i; +}; + +#ifdef __cplucpluc +} +#endif + +#define ATOMIC_FLAG_INIT \ + { 0 } + +/// atomic_flag +struct atomic_flag : public __atomic_flag_base { + atomic_flag() noexcept = default; + ~atomic_flag() noexcept = default; + atomic_flag(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) volatile = delete; + + // Conversion to ATOMIC_FLAG_INIT. + constexpr atomic_flag(bool __i) noexcept + : __atomic_flag_base { _S_init(__i) } { + } + + inline bool test_and_set(memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_test_and_set(&_M_i, __m); + } + + inline bool + test_and_set(memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_test_and_set(&_M_i, __m); + } + + inline void clear(memory_order __m = memory_order_seq_cst) noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_consume); + assert(__b != memory_order_acquire); + assert(__b != memory_order_acq_rel); + + __atomic_clear(&_M_i, __m); + } + + inline void + clear(memory_order __m = memory_order_seq_cst) volatile noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_consume); + assert(__b != memory_order_acquire); + assert(__b != memory_order_acq_rel); + + __atomic_clear(&_M_i, __m); + } + +private: + static constexpr __atomic_flag_data_type _S_init(bool __i) { + return __i ? __GCC_ATOMIC_TEST_AND_SET_TRUEVAL : 0; + } +}; + +/// Base class for atomic integrals. +// +// For each of the integral types, define atomic_[integral type] struct +// +// atomic_bool bool +// atomic_char char +// atomic_schar signed char +// atomic_uchar unsigned char +// atomic_short short +// atomic_ushort unsigned short +// atomic_int int +// atomic_uint unsigned int +// atomic_long long +// atomic_ulong unsigned long +// atomic_llong long long +// atomic_ullong unsigned long long +// atomic_char16_t char16_t +// atomic_char32_t char32_t +// atomic_wchar_t wchar_t +// +// NB: Assuming _ITp is an integral scalar type that is 1, 2, 4, or +// 8 bytes, since that is what GCC built-in functions for atomic +// memory access expect. +template +struct __atomic_base { +private: + typedef _ITp __int_type; + + static constexpr int _S_alignment + = sizeof(_ITp) > alignof(_ITp) ? sizeof(_ITp) : alignof(_ITp); + + alignas(_S_alignment) __int_type _M_i; + +public: + __atomic_base() noexcept = default; + ~__atomic_base() noexcept = default; + __atomic_base(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) volatile = delete; + + // Requires __int_type convertible to _M_i. + constexpr __atomic_base(__int_type __i) noexcept : _M_i(__i) { + } + + operator __int_type() const noexcept { + return load(); + } + + operator __int_type() const volatile noexcept { + return load(); + } + + __int_type operator=(__int_type __i) noexcept { + store(__i); + return __i; + } + + __int_type operator=(__int_type __i) volatile noexcept { + store(__i); + return __i; + } + + __int_type operator++(int) noexcept { + return fetch_add(1); + } + + __int_type operator++(int) volatile noexcept { + return fetch_add(1); + } + + __int_type operator--(int) noexcept { + return fetch_sub(1); + } + + __int_type operator--(int) volatile noexcept { + return fetch_sub(1); + } + + __int_type operator++() noexcept { + return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); + } + + __int_type operator++() volatile noexcept { + return __atomic_add_fetch(&_M_i, 1, memory_order_seq_cst); + } + + __int_type operator--() noexcept { + return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); + } + + __int_type operator--() volatile noexcept { + return __atomic_sub_fetch(&_M_i, 1, memory_order_seq_cst); + } + + __int_type operator+=(__int_type __i) noexcept { + return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator+=(__int_type __i) volatile noexcept { + return __atomic_add_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator-=(__int_type __i) noexcept { + return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator-=(__int_type __i) volatile noexcept { + return __atomic_sub_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator&=(__int_type __i) noexcept { + return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator&=(__int_type __i) volatile noexcept { + return __atomic_and_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator|=(__int_type __i) noexcept { + return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator|=(__int_type __i) volatile noexcept { + return __atomic_or_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator^=(__int_type __i) noexcept { + return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); + } + + __int_type operator^=(__int_type __i) volatile noexcept { + return __atomic_xor_fetch(&_M_i, __i, memory_order_seq_cst); + } + + bool is_lock_free() const noexcept { + // Use a fake, minimally aligned pointer. + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + bool is_lock_free() const volatile noexcept { + // Use a fake, minimally aligned pointer. + return __atomic_is_lock_free(sizeof(_M_i), + reinterpret_cast(-__alignof(_M_i))); + } + + inline void + store(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_acquire); + assert(__b != memory_order_acq_rel); + assert(__b != memory_order_consume); + + __atomic_store_n(&_M_i, __i, __m); + } + + inline void + store(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_acquire); + assert(__b != memory_order_acq_rel); + assert(__b != memory_order_consume); + + __atomic_store_n(&_M_i, __i, __m); + } + + inline __int_type + load(memory_order __m = memory_order_seq_cst) const noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_release); + assert(__b != memory_order_acq_rel); + + return __atomic_load_n(&_M_i, __m); + } + + inline __int_type + load(memory_order __m = memory_order_seq_cst) const volatile noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_release); + assert(__b != memory_order_acq_rel); + + return __atomic_load_n(&_M_i, __m); + } + + inline __int_type + exchange(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_exchange_n(&_M_i, __i, __m); + } + + inline __int_type + exchange(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_exchange_n(&_M_i, __i, __m); + } + + inline bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, memory_order __m1, + memory_order __m2) noexcept { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + assert(__b2 != memory_order_release); + assert(__b2 != memory_order_acq_rel); + assert(__b2 <= __b1); + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2); + } + + inline bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, memory_order __m1, + memory_order __m2) volatile noexcept { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + assert(__b2 != memory_order_release); + assert(__b2 != memory_order_acq_rel); + assert(__b2 <= __b1); + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 1, __m1, __m2); + } + + inline bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, + memory_order __m = memory_order_seq_cst) noexcept { + return compare_exchange_weak(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline bool + compare_exchange_weak(__int_type& __i1, __int_type __i2, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return compare_exchange_weak(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m1, memory_order __m2) noexcept { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + assert(__b2 != memory_order_release); + assert(__b2 != memory_order_acq_rel); + assert(__b2 <= __b1); + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2); + } + + inline bool compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m1, + memory_order __m2) volatile noexcept { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + + assert(__b2 != memory_order_release); + assert(__b2 != memory_order_acq_rel); + assert(__b2 <= __b1); + + return __atomic_compare_exchange_n(&_M_i, &__i1, __i2, 0, __m1, __m2); + } + + inline bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m = memory_order_seq_cst) noexcept { + return compare_exchange_strong(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline bool + compare_exchange_strong(__int_type& __i1, __int_type __i2, + memory_order __m + = memory_order_seq_cst) volatile noexcept { + return compare_exchange_strong(__i1, __i2, __m, + __cmpexch_failure_order(__m)); + } + + inline __int_type + fetch_add(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_add(&_M_i, __i, __m); + } + + inline __int_type + fetch_add(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_add(&_M_i, __i, __m); + } + + inline __int_type + fetch_sub(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_sub(&_M_i, __i, __m); + } + + inline __int_type + fetch_sub(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_sub(&_M_i, __i, __m); + } + + inline __int_type + fetch_and(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_and(&_M_i, __i, __m); + } + + inline __int_type + fetch_and(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_and(&_M_i, __i, __m); + } + + inline __int_type + fetch_or(__int_type __i, memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_or(&_M_i, __i, __m); + } + + inline __int_type + fetch_or(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_or(&_M_i, __i, __m); + } + + inline __int_type + fetch_xor(__int_type __i, + memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_xor(&_M_i, __i, __m); + } + + inline __int_type + fetch_xor(__int_type __i, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_xor(&_M_i, __i, __m); + } +}; + +/// Partial specialization for pointer types. +template +struct __atomic_base<_PTp*> { +private: + typedef _PTp* __pointer_type; + + __pointer_type _M_p; + + // Factored out to facilitate explicit specialization. + constexpr ptrdiff_t _M_type_size(ptrdiff_t __d) const { + return __d * sizeof(_PTp); + } + + constexpr ptrdiff_t _M_type_size(ptrdiff_t __d) const volatile { + return __d * sizeof(_PTp); + } + +public: + __atomic_base() noexcept = default; + ~__atomic_base() noexcept = default; + __atomic_base(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) = delete; + __atomic_base& operator=(const __atomic_base&) volatile = delete; + + // Requires __pointer_type convertible to _M_p. + constexpr __atomic_base(__pointer_type __p) noexcept : _M_p(__p) { + } + + operator __pointer_type() const noexcept { + return load(); + } + + operator __pointer_type() const volatile noexcept { + return load(); + } + + __pointer_type operator=(__pointer_type __p) noexcept { + store(__p); + return __p; + } + + __pointer_type operator=(__pointer_type __p) volatile noexcept { + store(__p); + return __p; + } + + __pointer_type operator++(int) noexcept { + return fetch_add(1); + } + + __pointer_type operator++(int) volatile noexcept { + return fetch_add(1); + } + + __pointer_type operator--(int) noexcept { + return fetch_sub(1); + } + + __pointer_type operator--(int) volatile noexcept { + return fetch_sub(1); + } + + __pointer_type operator++() noexcept { + return __atomic_add_fetch(&_M_p, _M_type_size(1), memory_order_seq_cst); + } + + __pointer_type operator++() volatile noexcept { + return __atomic_add_fetch(&_M_p, _M_type_size(1), memory_order_seq_cst); + } + + __pointer_type operator--() noexcept { + return __atomic_sub_fetch(&_M_p, _M_type_size(1), memory_order_seq_cst); + } + + __pointer_type operator--() volatile noexcept { + return __atomic_sub_fetch(&_M_p, _M_type_size(1), memory_order_seq_cst); + } + + __pointer_type operator+=(ptrdiff_t __d) noexcept { + return __atomic_add_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); + } + + __pointer_type operator+=(ptrdiff_t __d) volatile noexcept { + return __atomic_add_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); + } + + __pointer_type operator-=(ptrdiff_t __d) noexcept { + return __atomic_sub_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); + } + + __pointer_type operator-=(ptrdiff_t __d) volatile noexcept { + return __atomic_sub_fetch(&_M_p, _M_type_size(__d), + memory_order_seq_cst); + } + + bool is_lock_free() const noexcept { + // Produce a fake, minimally aligned pointer. + return __atomic_is_lock_free(sizeof(_M_p), + reinterpret_cast(-__alignof(_M_p))); + } + + bool is_lock_free() const volatile noexcept { + // Produce a fake, minimally aligned pointer. + return __atomic_is_lock_free(sizeof(_M_p), + reinterpret_cast(-__alignof(_M_p))); + } + + inline void store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept { + memory_order __b = __m & __memory_order_mask; + + assert(__b != memory_order_acquire); + assert(__b != memory_order_acq_rel); + assert(__b != memory_order_consume); + + __atomic_store_n(&_M_p, __p, __m); + } + + inline void + store(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_acquire); + assert(__b != memory_order_acq_rel); + assert(__b != memory_order_consume); + + __atomic_store_n(&_M_p, __p, __m); + } + + inline __pointer_type + load(memory_order __m = memory_order_seq_cst) const noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_release); + assert(__b != memory_order_acq_rel); + + return __atomic_load_n(&_M_p, __m); + } + + inline __pointer_type + load(memory_order __m = memory_order_seq_cst) const volatile noexcept { + memory_order __b = __m & __memory_order_mask; + assert(__b != memory_order_release); + assert(__b != memory_order_acq_rel); + + return __atomic_load_n(&_M_p, __m); + } + + inline __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_exchange_n(&_M_p, __p, __m); + } + + inline __pointer_type + exchange(__pointer_type __p, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_exchange_n(&_M_p, __p, __m); + } + + inline bool + compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, memory_order __m2) noexcept { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + assert(__b2 != memory_order_release); + assert(__b2 != memory_order_acq_rel); + assert(__b2 <= __b1); + + return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2); + } + + inline bool compare_exchange_strong(__pointer_type& __p1, + __pointer_type __p2, memory_order __m1, + memory_order __m2) volatile noexcept { + memory_order __b2 = __m2 & __memory_order_mask; + memory_order __b1 = __m1 & __memory_order_mask; + + assert(__b2 != memory_order_release); + assert(__b2 != memory_order_acq_rel); + assert(__b2 <= __b1); + + return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 0, __m1, __m2); + } + + inline __pointer_type + fetch_add(ptrdiff_t __d, memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_add(&_M_p, _M_type_size(__d), __m); + } + + inline __pointer_type + fetch_add(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_add(&_M_p, _M_type_size(__d), __m); + } + + inline __pointer_type + fetch_sub(ptrdiff_t __d, memory_order __m = memory_order_seq_cst) noexcept { + return __atomic_fetch_sub(&_M_p, _M_type_size(__d), __m); + } + + inline __pointer_type + fetch_sub(ptrdiff_t __d, + memory_order __m = memory_order_seq_cst) volatile noexcept { + return __atomic_fetch_sub(&_M_p, _M_type_size(__d), __m); + } +}; + +}; // namespace std + +#endif /* SIMPLEKERNEL_ATOMIC_BASIC */ diff --git a/src/libcxx/include/basic_string b/src/libcxx/include/basic_string new file mode 100644 index 000000000..9ad92cfad --- /dev/null +++ b/src/libcxx/include/basic_string @@ -0,0 +1,2059 @@ + +/** + * @file basic_string + * @brief stl basic_string 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_BASIC_STRING +#define SIMPLEKERNEL_BASIC_STRING + +// 这个头文件包含一个模板类 basic_string +// 用于表示字符串类型 + +#include "cstring" +#include "exceptdef" +#include "functional" +#include "iostream" +#include "iterator" +#include "memory" + +namespace mystl { + +// char_traits + +template +struct char_traits { + typedef CharType char_type; + + static size_t length(const char_type* str) { + size_t len = 0; + for (; *str != char_type(0); ++str) { + ++len; + } + return len; + } + + static int compare(const char_type* s1, const char_type* s2, size_t n) { + for (; n != 0; --n, ++s1, ++s2) { + if (*s1 < *s2) { + return -1; + } + if (*s2 < *s1) { + return 1; + } + } + return 0; + } + + static char_type* copy(char_type* dst, const char_type* src, size_t n) { + MYSTL_DEBUG(src + n <= dst || dst + n <= src); + char_type* r = dst; + for (; n != 0; --n, ++dst, ++src) { + *dst = *src; + } + return r; + } + + static char_type* move(char_type* dst, const char_type* src, size_t n) { + char_type* r = dst; + if (dst < src) { + for (; n != 0; --n, ++dst, ++src) { + *dst = *src; + } + } + else if (src < dst) { + dst += n; + src += n; + for (; n != 0; --n) { + *--dst = *--src; + } + } + return r; + } + + static char_type* fill(char_type* dst, char_type ch, size_t count) { + char_type* r = dst; + for (; count > 0; --count, ++dst) { + *dst = ch; + } + return r; + } +}; + +// Partialized. char_traits +template <> +struct char_traits { + typedef char char_type; + + static size_t length(const char_type* str) noexcept { + return std::strlen(str); + } + + static int + compare(const char_type* s1, const char_type* s2, size_t n) noexcept { + return std::memcmp(s1, s2, n); + } + + static char_type* + copy(char_type* dst, const char_type* src, size_t n) noexcept { + MYSTL_DEBUG(src + n <= dst || dst + n <= src); + return static_cast(std::memcpy(dst, src, n)); + } + + static char_type* + move(char_type* dst, const char_type* src, size_t n) noexcept { + return static_cast(std::memmove(dst, src, n)); + } + + static char_type* + fill(char_type* dst, char_type ch, size_t count) noexcept { + return static_cast(std::memset(dst, ch, count)); + } +}; + +// Partialized. char_traits +// template <> +// struct char_traits { +// typedef wchar_t char_type; + +// static size_t length(const char_type *str) noexcept { +// return std::wcslen(str); +// } + +// static int compare(const char_type *s1, const char_type *s2, +// size_t n) noexcept { +// return std::wmemcmp(s1, s2, n); +// } + +// static char_type *copy(char_type *dst, const char_type *src, +// size_t n) noexcept { +// MYSTL_DEBUG(src + n <= dst || dst + n <= src); +// return static_cast(std::wmemcpy(dst, src, n)); +// } + +// static char_type *move(char_type *dst, const char_type *src, +// size_t n) noexcept { +// return static_cast(std::wmemmove(dst, src, n)); +// } + +// static char_type *fill(char_type *dst, char_type ch, +// size_t count) noexcept { +// return static_cast(std::wmemset(dst, ch, count)); +// } +// }; + +// Partialized. char_traits +template <> +struct char_traits { + typedef char16_t char_type; + + static size_t length(const char_type* str) noexcept { + size_t len = 0; + for (; *str != char_type(0); ++str) { + ++len; + } + return len; + } + + static int + compare(const char_type* s1, const char_type* s2, size_t n) noexcept { + for (; n != 0; --n, ++s1, ++s2) { + if (*s1 < *s2) { + return -1; + } + if (*s2 < *s1) { + return 1; + } + } + return 0; + } + + static char_type* + copy(char_type* dst, const char_type* src, size_t n) noexcept { + MYSTL_DEBUG(src + n <= dst || dst + n <= src); + char_type* r = dst; + for (; n != 0; --n, ++dst, ++src) { + *dst = *src; + } + return r; + } + + static char_type* + move(char_type* dst, const char_type* src, size_t n) noexcept { + char_type* r = dst; + if (dst < src) { + for (; n != 0; --n, ++dst, ++src) { + *dst = *src; + } + } + else if (src < dst) { + dst += n; + src += n; + for (; n != 0; --n) { + *--dst = *--src; + } + } + return r; + } + + static char_type* + fill(char_type* dst, char_type ch, size_t count) noexcept { + char_type* r = dst; + for (; count > 0; --count, ++dst) { + *dst = ch; + } + return r; + } +}; + +// Partialized. char_traits +template <> +struct char_traits { + typedef char32_t char_type; + + static size_t length(const char_type* str) noexcept { + size_t len = 0; + for (; *str != char_type(0); ++str) { + ++len; + } + return len; + } + + static int + compare(const char_type* s1, const char_type* s2, size_t n) noexcept { + for (; n != 0; --n, ++s1, ++s2) { + if (*s1 < *s2) { + return -1; + } + if (*s2 < *s1) { + return 1; + } + } + return 0; + } + + static char_type* + copy(char_type* dst, const char_type* src, size_t n) noexcept { + MYSTL_DEBUG(src + n <= dst || dst + n <= src); + char_type* r = dst; + for (; n != 0; --n, ++dst, ++src) { + *dst = *src; + } + return r; + } + + static char_type* + move(char_type* dst, const char_type* src, size_t n) noexcept { + char_type* r = dst; + if (dst < src) { + for (; n != 0; --n, ++dst, ++src) { + *dst = *src; + } + } + else if (src < dst) { + dst += n; + src += n; + for (; n != 0; --n) { + *--dst = *--src; + } + } + return r; + } + + static char_type* + fill(char_type* dst, char_type ch, size_t count) noexcept { + char_type* r = dst; + for (; count > 0; --count, ++dst) { + *dst = ch; + } + return r; + } +}; + +// 初始化 basic_string 尝试分配的最小 buffer 大小,可能被忽略 +#define STRING_INIT_SIZE 32 + +// 模板类 basic_string +// 参数一代表字符类型,参数二代表萃取字符类型的方式,缺省使用 +// mystl::char_traits +template > +class basic_string { +public: + typedef CharTraits traits_type; + typedef CharTraits char_traits; + + typedef mystl::allocator allocator_type; + typedef mystl::allocator data_allocator; + + typedef typename allocator_type::value_type value_type; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef mystl::reverse_iterator reverse_iterator; + typedef mystl::reverse_iterator const_reverse_iterator; + + allocator_type get_allocator() { + return allocator_type(); + } + + static_assert(std::is_trivial::value, + "Character type of basic_string must be a POD"); + static_assert( + std::is_same::value, + "CharType must be same as traits_type::char_type"); + +public: + // 末尾位置的值,例: + // if (str.find('a') != string::npos) { /* do something */ } + static constexpr size_type npos = static_cast(-1); + +private: + iterator buffer_; // 储存字符串的起始位置 + size_type size_; // 大小 + size_type cap_; // 容量 + +public: + // 构造、复制、移动、析构函数 + + basic_string() noexcept { + try_init(); + } + + basic_string(size_type n, value_type ch) + : buffer_(nullptr), size_(0), cap_(0) { + fill_init(n, ch); + } + + basic_string(const basic_string& other, size_type pos) + : buffer_(nullptr), size_(0), cap_(0) { + init_from(other.buffer_, pos, other.size_ - pos); + } + + basic_string(const basic_string& other, size_type pos, size_type count) + : buffer_(nullptr), size_(0), cap_(0) { + init_from(other.buffer_, pos, count); + } + + basic_string(const_pointer str) : buffer_(nullptr), size_(0), cap_(0) { + init_from(str, 0, char_traits::length(str)); + } + + basic_string(const_pointer str, size_type count) + : buffer_(nullptr), size_(0), cap_(0) { + init_from(str, 0, count); + } + + template ::value, int>::type + = 0> + basic_string(Iter first, Iter last) { + copy_init(first, last, iterator_category(first)); + } + + basic_string(const basic_string& rhs) + : buffer_(nullptr), size_(0), cap_(0) { + init_from(rhs.buffer_, 0, rhs.size_); + } + + basic_string(basic_string&& rhs) noexcept + : buffer_(rhs.buffer_), size_(rhs.size_), cap_(rhs.cap_) { + rhs.buffer_ = nullptr; + rhs.size_ = 0; + rhs.cap_ = 0; + } + + basic_string& operator=(const basic_string& rhs); + basic_string& operator=(basic_string&& rhs) noexcept; + + basic_string& operator=(const_pointer str); + basic_string& operator=(value_type ch); + + ~basic_string() { + destroy_buffer(); + } + +public: + // 迭代器相关操作 + iterator begin() noexcept { + return buffer_; + } + + const_iterator begin() const noexcept { + return buffer_; + } + + iterator end() noexcept { + return buffer_ + size_; + } + + const_iterator end() const noexcept { + return buffer_ + size_; + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关操作 + bool empty() const noexcept { + return size_ == 0; + } + + size_type size() const noexcept { + return size_; + } + + size_type length() const noexcept { + return size_; + } + + size_type capacity() const noexcept { + return cap_; + } + + size_type max_size() const noexcept { + return static_cast(-1); + } + + void reserve(size_type n); + void shrink_to_fit(); + + // 访问元素相关操作 + reference operator[](size_type n) { + MYSTL_DEBUG(n <= size_); + if (n == size_) { + *(buffer_ + n) = value_type(); + } + return *(buffer_ + n); + } + + const_reference operator[](size_type n) const { + MYSTL_DEBUG(n <= size_); + if (n == size_) { + *(buffer_ + n) = value_type(); + } + return *(buffer_ + n); + } + + reference at(size_type n) { + THROW_OUT_OF_RANGE_IF(n >= size_, "basic_string::at()" + "subscript out of range"); + return (*this)[n]; + } + + const_reference at(size_type n) const { + THROW_OUT_OF_RANGE_IF(n >= size_, "basic_string::at()" + "subscript out of range"); + return (*this)[n]; + } + + reference front() { + MYSTL_DEBUG(!empty()); + return *begin(); + } + + const_reference front() const { + MYSTL_DEBUG(!empty()); + return *begin(); + } + + reference back() { + MYSTL_DEBUG(!empty()); + return *(end() - 1); + } + + const_reference back() const { + MYSTL_DEBUG(!empty()); + return *(end() - 1); + } + + const_pointer data() const noexcept { + return to_raw_pointer(); + } + + const_pointer c_str() const noexcept { + return to_raw_pointer(); + } + + // 添加删除相关操作 + + // insert + iterator insert(const_iterator pos, value_type ch); + iterator insert(const_iterator pos, size_type count, value_type ch); + + template + iterator insert(const_iterator pos, Iter first, Iter last); + + // push_back / pop_back + void push_back(value_type ch) { + append(1, ch); + } + + void pop_back() { + MYSTL_DEBUG(!empty()); + --size_; + } + + // append + basic_string& append(size_type count, value_type ch); + + basic_string& append(const basic_string& str) { + return append(str, 0, str.size_); + } + + basic_string& append(const basic_string& str, size_type pos) { + return append(str, pos, str.size_ - pos); + } + + basic_string& + append(const basic_string& str, size_type pos, size_type count); + + basic_string& append(const_pointer s) { + return append(s, char_traits::length(s)); + } + + basic_string& append(const_pointer s, size_type count); + + template ::value, int>::type + = 0> + basic_string& append(Iter first, Iter last) { + return append_range(first, last); + } + + // erase /clear + iterator erase(const_iterator pos); + iterator erase(const_iterator first, const_iterator last); + + // resize + void resize(size_type count) { + resize(count, value_type()); + } + + void resize(size_type count, value_type ch); + + void clear() noexcept { + size_ = 0; + } + + // basic_string 相关操作 + + // compare + int compare(const basic_string& other) const; + int + compare(size_type pos1, size_type count1, const basic_string& other) const; + int compare(size_type pos1, size_type count1, const basic_string& other, + size_type pos2, size_type count2 = npos) const; + int compare(const_pointer s) const; + int compare(size_type pos1, size_type count1, const_pointer s) const; + int compare(size_type pos1, size_type count1, const_pointer s, + size_type count2) const; + + // substr + basic_string substr(size_type index, size_type count = npos) { + count = mystl::min(count, size_ - index); + return basic_string(buffer_ + index, buffer_ + index + count); + } + + // replace + basic_string& + replace(size_type pos, size_type count, const basic_string& str) { + THROW_OUT_OF_RANGE_IF( + pos > size_, + "basic_string::replace's pos out of range"); + return replace_cstr(buffer_ + pos, count, str.buffer_, str.size_); + } + + basic_string& replace(const_iterator first, const_iterator last, + const basic_string& str) { + MYSTL_DEBUG(begin() <= first && last <= end() && first <= last); + return replace_cstr(first, static_cast(last - first), + str.buffer_, str.size_); + } + + basic_string& replace(size_type pos, size_type count, const_pointer str) { + THROW_OUT_OF_RANGE_IF( + pos > size_, + "basic_string::replace's pos out of range"); + return replace_cstr(buffer_ + pos, count, str, + char_traits::length(str)); + } + + basic_string& + replace(const_iterator first, const_iterator last, const_pointer str) { + MYSTL_DEBUG(begin() <= first && last <= end() && first <= last); + return replace_cstr(first, static_cast(last - first), str, + char_traits::length(str)); + } + + basic_string& replace(size_type pos, size_type count, const_pointer str, + size_type count2) { + THROW_OUT_OF_RANGE_IF( + pos > size_, + "basic_string::replace's pos out of range"); + return replace_cstr(buffer_ + pos, count, str, count2); + } + + basic_string& replace(const_iterator first, const_iterator last, + const_pointer str, size_type count) { + MYSTL_DEBUG(begin() <= first && last <= end() && first <= last); + return replace_cstr(first, static_cast(last - first), str, + count); + } + + basic_string& + replace(size_type pos, size_type count, size_type count2, value_type ch) { + THROW_OUT_OF_RANGE_IF( + pos > size_, + "basic_string::replace's pos out of range"); + return replace_fill(buffer_ + pos, count, count2, ch); + } + + basic_string& replace(const_iterator first, const_iterator last, + size_type count, value_type ch) { + MYSTL_DEBUG(begin() <= first && last <= end() && first <= last); + return replace_fill(first, static_cast(last - first), count, + ch); + } + + basic_string& + replace(size_type pos1, size_type count1, const basic_string& str, + size_type pos2, size_type count2 = npos) { + THROW_OUT_OF_RANGE_IF( + pos1 > size_ || pos2 > str.size_, + "basic_string::replace's pos out of range"); + return replace_cstr(buffer_ + pos1, count1, str.buffer_ + pos2, count2); + } + + template ::value, int>::type + = 0> + basic_string& replace(const_iterator first, const_iterator last, + Iter first2, Iter last2) { + MYSTL_DEBUG(begin() <= first && last <= end() && first <= last); + return replace_copy(first, last, first2, last2); + } + + // reverse + void reverse() noexcept; + + // swap + void swap(basic_string& rhs) noexcept; + + // 查找相关操作 + + // find + size_type find(value_type ch, size_type pos = 0) const noexcept; + size_type find(const_pointer str, size_type pos = 0) const noexcept; + size_type + find(const_pointer str, size_type pos, size_type count) const noexcept; + size_type find(const basic_string& str, size_type pos = 0) const noexcept; + + // rfind + size_type rfind(value_type ch, size_type pos = npos) const noexcept; + size_type rfind(const_pointer str, size_type pos = npos) const noexcept; + size_type + rfind(const_pointer str, size_type pos, size_type count) const noexcept; + size_type + rfind(const basic_string& str, size_type pos = npos) const noexcept; + + // find_first_of + size_type find_first_of(value_type ch, size_type pos = 0) const noexcept; + size_type find_first_of(const_pointer s, size_type pos = 0) const noexcept; + size_type find_first_of(const_pointer s, size_type pos, + size_type count) const noexcept; + size_type + find_first_of(const basic_string& str, size_type pos = 0) const noexcept; + + // find_first_not_of + size_type + find_first_not_of(value_type ch, size_type pos = 0) const noexcept; + size_type + find_first_not_of(const_pointer s, size_type pos = 0) const noexcept; + size_type find_first_not_of(const_pointer s, size_type pos, + size_type count) const noexcept; + size_type find_first_not_of(const basic_string& str, + size_type pos = 0) const noexcept; + + // find_last_of + size_type find_last_of(value_type ch, size_type pos = 0) const noexcept; + size_type find_last_of(const_pointer s, size_type pos = 0) const noexcept; + size_type find_last_of(const_pointer s, size_type pos, + size_type count) const noexcept; + size_type + find_last_of(const basic_string& str, size_type pos = 0) const noexcept; + + // find_last_not_of + size_type find_last_not_of(value_type ch, size_type pos = 0) const noexcept; + size_type + find_last_not_of(const_pointer s, size_type pos = 0) const noexcept; + size_type find_last_not_of(const_pointer s, size_type pos, + size_type count) const noexcept; + size_type + find_last_not_of(const basic_string& str, size_type pos = 0) const noexcept; + + // count + size_type count(value_type ch, size_type pos = 0) const noexcept; + +public: + // 重载 operator+= + basic_string& operator+=(const basic_string& str) { + return append(str); + } + + basic_string& operator+=(value_type ch) { + return append(1, ch); + } + + basic_string& operator+=(const_pointer str) { + return append(str, str + char_traits::length(str)); + } + + // 重载 operator >> / operatror << + + // friend std::istream &operator>>(std::istream &is, basic_string &str) + // { + // value_type *buf = new value_type[4096]; + // is >> buf; + // basic_string tmp(buf); + // str = std::move(tmp); + // delete[] buf; + // return is; + // } + + friend std::ostream& operator<<(std::ostream& os, const basic_string& str) { + for (size_type i = 0; i < str.size_; ++i) { + os << *(str.buffer_ + i); + } + return os; + } + +private: + // helper functions + + // init / destroy + void try_init() noexcept; + + void fill_init(size_type n, value_type ch); + + template + void copy_init(Iter first, Iter last, mystl::input_iterator_tag); + template + void copy_init(Iter first, Iter last, mystl::forward_iterator_tag); + + void init_from(const_pointer src, size_type pos, size_type n); + + void destroy_buffer(); + + // get raw pointer + const_pointer to_raw_pointer() const; + + // shrink_to_fit + void reinsert(size_type size); + + // append + template + basic_string& append_range(Iter first, Iter last); + + // compare + int compare_cstr(const_pointer s1, size_type n1, const_pointer s2, + size_type n2) const; + + // replace + basic_string& replace_cstr(const_iterator first, size_type count1, + const_pointer str, size_type count2); + basic_string& replace_fill(const_iterator first, size_type count1, + size_type count2, value_type ch); + template + basic_string& replace_copy(const_iterator first, const_iterator last, + Iter first2, Iter last2); + + // reallocate + void reallocate(size_type need); + iterator reallocate_and_fill(iterator pos, size_type n, value_type ch); + iterator reallocate_and_copy(iterator pos, const_iterator first, + const_iterator last); +}; + +/*****************************************************************************************/ + +// 复制赋值操作符 +template +basic_string& +basic_string::operator=(const basic_string& rhs) { + if (this != &rhs) { + basic_string tmp(rhs); + swap(tmp); + } + return *this; +} + +// 移动赋值操作符 +template +basic_string& +basic_string::operator=(basic_string&& rhs) noexcept { + destroy_buffer(); + buffer_ = rhs.buffer_; + size_ = rhs.size_; + cap_ = rhs.cap_; + rhs.buffer_ = nullptr; + rhs.size_ = 0; + rhs.cap_ = 0; + return *this; +} + +// 用一个字符串赋值 +template +basic_string& +basic_string::operator=(const_pointer str) { + const size_type len = char_traits::length(str); + if (cap_ < len) { + auto new_buffer = data_allocator::allocate(len + 1); + data_allocator::deallocate(buffer_); + buffer_ = new_buffer; + cap_ = len + 1; + } + char_traits::copy(buffer_, str, len); + size_ = len; + return *this; +} + +// 用一个字符赋值 +template +basic_string& +basic_string::operator=(value_type ch) { + if (cap_ < 1) { + auto new_buffer = data_allocator::allocate(2); + data_allocator::deallocate(buffer_); + buffer_ = new_buffer; + cap_ = 2; + } + *buffer_ = ch; + size_ = 1; + return *this; +} + +// 预留储存空间 +template +void basic_string::reserve(size_type n) { + if (cap_ < n) { + THROW_LENGTH_ERROR_IF(n > max_size(), + "n can not larger than max_size()" + "in basic_string::reserve(n)"); + auto new_buffer = data_allocator::allocate(n); + char_traits::move(new_buffer, buffer_, size_); + buffer_ = new_buffer; + cap_ = n; + } +} + +// 减少不用的空间 +template +void basic_string::shrink_to_fit() { + if (size_ != cap_) { + reinsert(size_); + } +} + +// 在 pos 处插入一个元素 +template +typename basic_string::iterator +basic_string::insert(const_iterator pos, value_type ch) { + iterator r = const_cast(pos); + if (size_ == cap_) { + return reallocate_and_fill(r, 1, ch); + } + char_traits::move(r + 1, r, end() - r); + ++size_; + *r = ch; + return r; +} + +// 在 pos 处插入 n 个元素 +template +typename basic_string::iterator +basic_string::insert(const_iterator pos, size_type count, + value_type ch) { + iterator r = const_cast(pos); + if (count == 0) { + return r; + } + if (cap_ - size_ < count) { + return reallocate_and_fill(r, count, ch); + } + if (pos == end()) { + char_traits::fill(end(), ch, count); + size_ += count; + return r; + } + char_traits::move(r + count, r, count); + char_traits::fill(r, ch, count); + size_ += count; + return r; +} + +// 在 pos 处插入 [first, last) 内的元素 +template +template +typename basic_string::iterator +basic_string::insert(const_iterator pos, Iter first, + Iter last) { + iterator r = const_cast(pos); + const size_type len = mystl::distance(first, last); + if (len == 0) { + return r; + } + if (cap_ - size_ < len) { + return reallocate_and_copy(r, first, last); + } + if (pos == end()) { + mystl::uninitialized_copy(first, last, end()); + size_ += len; + return r; + } + char_traits::move(r + len, r, len); + mystl::uninitialized_copy(first, last, r); + size_ += len; + return r; +} + +// 在末尾添加 count 个 ch +template +basic_string& +basic_string::append(size_type count, value_type ch) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - count, + "basic_string's size too big"); + if (cap_ - size_ < count) { + reallocate(count); + } + char_traits::fill(buffer_ + size_, ch, count); + size_ += count; + return *this; +} + +// 在末尾添加 [str[pos] str[pos+count]) 一段 +template +basic_string& +basic_string::append(const basic_string& str, + size_type pos, size_type count) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - count, + "basic_string's size too big"); + if (count == 0) { + return *this; + } + if (cap_ - size_ < count) { + reallocate(count); + } + char_traits::copy(buffer_ + size_, str.buffer_ + pos, count); + size_ += count; + return *this; +} + +// 在末尾添加 [s, s+count) 一段 +template +basic_string& +basic_string::append(const_pointer s, size_type count) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - count, + "basic_string's size too big"); + if (cap_ - size_ < count) { + reallocate(count); + } + char_traits::copy(buffer_ + size_, s, count); + size_ += count; + return *this; +} + +// 删除 pos 处的元素 +template +typename basic_string::iterator +basic_string::erase(const_iterator pos) { + MYSTL_DEBUG(pos != end()); + iterator r = const_cast(pos); + char_traits::move(r, pos + 1, end() - pos - 1); + --size_; + return r; +} + +// 删除 [first, last) 的元素 +template +typename basic_string::iterator +basic_string::erase(const_iterator first, + const_iterator last) { + if (first == begin() && last == end()) { + clear(); + return end(); + } + const size_type n = end() - last; + iterator r = const_cast(first); + char_traits::move(r, last, n); + size_ -= (last - first); + return r; +} + +// 重置容器大小 +template +void basic_string::resize(size_type count, + value_type ch) { + if (count < size_) { + erase(buffer_ + count, buffer_ + size_); + } + else { + append(count - size_, ch); + } +} + +// 比较两个 basic_string,小于返回 -1,大于返回 1,等于返回 0 +template +int basic_string::compare( + const basic_string& other) const { + return compare_cstr(buffer_, size_, other.buffer_, other.size_); +} + +// 从 pos1 下标开始的 count1 个字符跟另一个 basic_string 比较 +template +int basic_string::compare( + size_type pos1, size_type count1, const basic_string& other) const { + auto n1 = mystl::min(count1, size_ - pos1); + return compare_cstr(buffer_ + pos1, n1, other.buffer_, other.size_); +} + +// 从 pos1 下标开始的 count1 个字符跟另一个 basic_string 下标 pos2 开始的 +// count2 个字符比较 +template +int basic_string::compare(size_type pos1, + size_type count1, + const basic_string& other, + size_type pos2, + size_type count2) const { + auto n1 = mystl::min(count1, size_ - pos1); + auto n2 = mystl::min(count2, other.size_ - pos2); + return compare_cstr(buffer_, n1, other.buffer_, n2); +} + +// 跟一个字符串比较 +template +int basic_string::compare(const_pointer s) const { + auto n2 = char_traits::length(s); + return compare_cstr(buffer_, size_, s, n2); +} + +// 从下标 pos1 开始的 count1 个字符跟另一个字符串比较 +template +int basic_string::compare(size_type pos1, + size_type count1, + const_pointer s) const { + auto n1 = mystl::min(count1, size_ - pos1); + auto n2 = char_traits::length(s); + return compare_cstr(buffer_, n1, s, n2); +} + +// 从下标 pos1 开始的 count1 个字符跟另一个字符串的前 count2 个字符比较 +template +int basic_string::compare(size_type pos1, + size_type count1, + const_pointer s, + size_type count2) const { + auto n1 = mystl::min(count1, size_ - pos1); + return compare_cstr(buffer_, n1, s, count2); +} + +// 反转 basic_string +template +void basic_string::reverse() noexcept { + for (auto i = begin(), j = end(); i < j;) { + mystl::iter_swap(i++, --j); + } +} + +// 交换两个 basic_string +template +void basic_string::swap(basic_string& rhs) noexcept { + if (this != &rhs) { + mystl::swap(buffer_, rhs.buffer_); + mystl::swap(size_, rhs.size_); + mystl::swap(cap_, rhs.cap_); + } +} + +// 从下标 pos 开始查找字符为 ch 的元素,若找到返回其下标,否则返回 npos +template +typename basic_string::size_type +basic_string::find(value_type ch, + size_type pos) const noexcept { + for (auto i = pos; i < size_; ++i) { + if (*(buffer_ + i) == ch) { + return i; + } + } + return npos; +} + +// 从下标 pos 开始查找字符串 str,若找到返回起始位置的下标,否则返回 npos +template +typename basic_string::size_type +basic_string::find(const_pointer str, + size_type pos) const noexcept { + const auto len = char_traits::length(str); + if (len == 0) { + return pos; + } + if (size_ - pos < len) { + return npos; + } + const auto left = size_ - len; + for (auto i = pos; i <= left; ++i) { + if (*(buffer_ + i) == *str) { + size_type j = 1; + for (; j < len; ++j) { + if (*(buffer_ + i + j) != *(str + j)) { + break; + } + } + if (j == len) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找字符串 str 的前 count +// 个字符,若找到返回起始位置的下标,否则返回 npos +template +typename basic_string::size_type +basic_string::find(const_pointer str, size_type pos, + size_type count) const noexcept { + if (count == 0) { + return pos; + } + if (size_ - pos < count) { + return npos; + } + const auto left = size_ - count; + for (auto i = pos; i <= left; ++i) { + if (*(buffer_ + i) == *str) { + size_type j = 1; + for (; j < count; ++j) { + if (*(buffer_ + i + j) != *(str + j)) { + break; + } + } + if (j == count) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找字符串 str,若找到返回起始位置的下标,否则返回 npos +template +typename basic_string::size_type +basic_string::find(const basic_string& str, + size_type pos) const noexcept { + const size_type count = str.size_; + if (count == 0) { + return pos; + } + if (size_ - pos < count) { + return npos; + } + const auto left = size_ - count; + for (auto i = pos; i <= left; ++i) { + if (*(buffer_ + i) == str.front()) { + size_type j = 1; + for (; j < count; ++j) { + if (*(buffer_ + i + j) != str[j]) { + break; + } + } + if (j == count) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始反向查找值为 ch 的元素,与 find 类似 +template +typename basic_string::size_type +basic_string::rfind(value_type ch, + size_type pos) const noexcept { + if (pos >= size_) { + pos = size_ - 1; + } + for (auto i = pos; i != 0; --i) { + if (*(buffer_ + i) == ch) { + return i; + } + } + return front() == ch ? 0 : npos; +} + +// 从下标 pos 开始反向查找字符串 str,与 find 类似 +template +typename basic_string::size_type +basic_string::rfind(const_pointer str, + size_type pos) const noexcept { + if (pos >= size_) { + pos = size_ - 1; + } + const size_type len = char_traits::length(str); + switch (len) { + case 0: + return pos; + case 1: { + for (auto i = pos; i != 0; --i) { + if (*(buffer_ + i) == *str) { + return i; + } + } + return front() == *str ? 0 : npos; + } + default: { // len >= 2 + for (auto i = pos; i >= len - 1; --i) { + if (*(buffer_ + i) == *(str + len - 1)) { + size_type j = 1; + for (; j < len; ++j) { + if (*(buffer_ + i - j) != *(str + len - j - 1)) { + break; + } + } + if (j == len) { + return i - len + 1; + } + } + } + break; + } + } + return npos; +} + +// 从下标 pos 开始反向查找字符串 str 前 count 个字符,与 find 类似 +template +typename basic_string::size_type +basic_string::rfind(const_pointer str, size_type pos, + size_type count) const noexcept { + if (count == 0) { + return pos; + } + if (pos >= size_) { + pos = size_ - 1; + } + if (pos < count - 1) { + return npos; + } + for (auto i = pos; i >= count - 1; --i) { + if (*(buffer_ + i) == *(str + count - 1)) { + size_type j = 1; + for (; j < count; ++j) { + if (*(buffer_ + i - j) != *(str + count - j - 1)) { + break; + } + } + if (j == count) { + return i - count + 1; + } + } + } + return npos; +} + +// 从下标 pos 开始反向查找字符串 str,与 find 类似 +template +typename basic_string::size_type +basic_string::rfind(const basic_string& str, + size_type pos) const noexcept { + const size_type count = str.size_; + if (pos >= size_) { + pos = size_ - 1; + } + if (count == 0) { + return pos; + } + if (pos < count - 1) { + return npos; + } + for (auto i = pos; i >= count - 1; --i) { + if (*(buffer_ + i) == str[count - 1]) { + size_type j = 1; + for (; j < count; ++j) { + if (*(buffer_ + i - j) != str[count - j - 1]) { + break; + } + } + if (j == count) { + return i - count + 1; + } + } + } + return npos; +} + +// 从下标 pos 开始查找 ch 出现的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_of( + value_type ch, size_type pos) const noexcept { + for (auto i = pos; i < size_; ++i) { + if (*(buffer_ + i) == ch) { + return i; + } + } + return npos; +} + +// 从下标 pos 开始查找字符串 s 其中的一个字符出现的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_of( + const_pointer s, size_type pos) const noexcept { + const size_type len = char_traits::length(s); + for (auto i = pos; i < size_; ++i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < len; ++j) { + if (ch == *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找字符串 s +template +typename basic_string::size_type +basic_string::find_first_of( + const_pointer s, size_type pos, size_type count) const noexcept { + for (auto i = pos; i < size_; ++i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < count; ++j) { + if (ch == *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找字符串 str 其中一个字符出现的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_of( + const basic_string& str, size_type pos) const noexcept { + for (auto i = pos; i < size_; ++i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < str.size_; ++j) { + if (ch == str[j]) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与 ch 不相等的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_not_of( + value_type ch, size_type pos) const noexcept { + for (auto i = pos; i < size_; ++i) { + if (*(buffer_ + i) != ch) { + return i; + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 s 其中一个字符不相等的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_not_of( + const_pointer s, size_type pos) const noexcept { + const size_type len = char_traits::length(s); + for (auto i = pos; i < size_; ++i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < len; ++j) { + if (ch != *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 s 前 count 个字符中不相等的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_not_of( + const_pointer s, size_type pos, size_type count) const noexcept { + for (auto i = pos; i < size_; ++i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < count; ++j) { + if (ch != *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 str 的字符中不相等的第一个位置 +template +typename basic_string::size_type +basic_string::find_first_not_of( + const basic_string& str, size_type pos) const noexcept { + for (auto i = pos; i < size_; ++i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < str.size_; ++j) { + if (ch != str[j]) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与 ch 相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_of(value_type ch, + size_type pos) const noexcept { + for (auto i = size_ - 1; i >= pos; --i) { + if (*(buffer_ + i) == ch) { + return i; + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 s 其中一个字符相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_of(const_pointer s, + size_type pos) const noexcept { + const size_type len = char_traits::length(s); + for (auto i = size_ - 1; i >= pos; --i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < len; ++j) { + if (ch == *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 s 前 count 个字符中相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_of( + const_pointer s, size_type pos, size_type count) const noexcept { + for (auto i = size_ - 1; i >= pos; --i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < count; ++j) { + if (ch == *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 str 字符中相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_of(const basic_string& str, + size_type pos) const noexcept { + for (auto i = size_ - 1; i >= pos; --i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < str.size_; ++j) { + if (ch == str[j]) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与 ch 字符不相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_not_of( + value_type ch, size_type pos) const noexcept { + for (auto i = size_ - 1; i >= pos; --i) { + if (*(buffer_ + i) != ch) { + return i; + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 s 的字符中不相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_not_of( + const_pointer s, size_type pos) const noexcept { + const size_type len = char_traits::length(s); + for (auto i = size_ - 1; i >= pos; --i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < len; ++j) { + if (ch != *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 s 前 count 个字符中不相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_not_of( + const_pointer s, size_type pos, size_type count) const noexcept { + for (auto i = size_ - 1; i >= pos; --i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < count; ++j) { + if (ch != *(s + j)) { + return i; + } + } + } + return npos; +} + +// 从下标 pos 开始查找与字符串 str 字符中不相等的最后一个位置 +template +typename basic_string::size_type +basic_string::find_last_not_of( + const basic_string& str, size_type pos) const noexcept { + for (auto i = size_ - 1; i >= pos; --i) { + value_type ch = *(buffer_ + i); + for (size_type j = 0; j < str.size_; ++j) { + if (ch != str[j]) { + return i; + } + } + } + return npos; +} + +// 返回从下标 pos 开始字符为 ch 的元素出现的次数 +template +typename basic_string::size_type +basic_string::count(value_type ch, + size_type pos) const noexcept { + size_type n = 0; + for (auto i = pos; i < size_; ++i) { + if (*(buffer_ + i) == ch) { + ++n; + } + } + return n; +} + +/*****************************************************************************************/ +// helper function + +// 尝试初始化一段 buffer,若分配失败则忽略,不会抛出异常 +template +void basic_string::try_init() noexcept { + try { + buffer_ + = data_allocator::allocate(static_cast(STRING_INIT_SIZE)); + size_ = 0; + cap_ = 0; + } catch (...) { + buffer_ = nullptr; + size_ = 0; + cap_ = 0; + // no throw + } +} + +// fill_init 函数 +template +void basic_string::fill_init(size_type n, value_type ch) { + const auto init_size + = mystl::max(static_cast(STRING_INIT_SIZE), n + 1); + buffer_ = data_allocator::allocate(init_size); + char_traits::fill(buffer_, ch, n); + size_ = n; + cap_ = init_size; +} + +// copy_init 函数 +template +template +void basic_string::copy_init(Iter first, Iter last, + mystl::input_iterator_tag) { + size_type n = mystl::distance(first, last); + const auto init_size + = mystl::max(static_cast(STRING_INIT_SIZE), n + 1); + try { + buffer_ = data_allocator::allocate(init_size); + size_ = n; + cap_ = init_size; + } catch (...) { + buffer_ = nullptr; + size_ = 0; + cap_ = 0; + throw; + } + for (; n > 0; --n, ++first) { + append(*first); + } +} + +template +template +void basic_string::copy_init( + Iter first, Iter last, mystl::forward_iterator_tag) { + const size_type n = mystl::distance(first, last); + const auto init_size + = mystl::max(static_cast(STRING_INIT_SIZE), n + 1); + try { + buffer_ = data_allocator::allocate(init_size); + size_ = n; + cap_ = init_size; + mystl::uninitialized_copy(first, last, buffer_); + } catch (...) { + buffer_ = nullptr; + size_ = 0; + cap_ = 0; + throw; + } +} + +// init_from 函数 +template +void basic_string::init_from(const_pointer src, + size_type pos, + size_type count) { + const auto init_size + = mystl::max(static_cast(STRING_INIT_SIZE), count + 1); + buffer_ = data_allocator::allocate(init_size); + char_traits::copy(buffer_, src + pos, count); + size_ = count; + cap_ = init_size; +} + +// destroy_buffer 函数 +template +void basic_string::destroy_buffer() { + if (buffer_ != nullptr) { + data_allocator::deallocate(buffer_, cap_); + buffer_ = nullptr; + size_ = 0; + cap_ = 0; + } +} + +// to_raw_pointer 函数 +template +typename basic_string::const_pointer +basic_string::to_raw_pointer() const { + *(buffer_ + size_) = value_type(); + return buffer_; +} + +// reinsert 函数 +template +void basic_string::reinsert(size_type size) { + auto new_buffer = data_allocator::allocate(size); + try { + char_traits::move(new_buffer, buffer_, size); + } catch (...) { + data_allocator::deallocate(new_buffer); + } + buffer_ = new_buffer; + size_ = size; + cap_ = size; +} + +// append_range,末尾追加一段 [first, last) 内的字符 +template +template +basic_string& +basic_string::append_range(Iter first, Iter last) { + const size_type n = mystl::distance(first, last); + THROW_LENGTH_ERROR_IF(size_ > max_size() - n, + "basic_string's size too big"); + if (cap_ - size_ < n) { + reallocate(n); + } + mystl::uninitialized_copy_n(first, n, buffer_ + size_); + size_ += n; + return *this; +} + +template +int basic_string::compare_cstr(const_pointer s1, + size_type n1, + const_pointer s2, + size_type n2) const { + auto rlen = mystl::min(n1, n2); + auto res = char_traits::compare(s1, s2, rlen); + if (res != 0) { + return res; + } + if (n1 < n2) { + return -1; + } + if (n1 > n2) { + return 1; + } + return 0; +} + +// 把 first 开始的 count1 个字符替换成 str 开始的 count2 个字符 +template +basic_string& +basic_string::replace_cstr(const_iterator first, + size_type count1, + const_pointer str, + size_type count2) { + if (static_cast(cend() - first) < count1) { + count1 = cend() - first; + } + if (count1 < count2) { + const size_type add = count2 - count1; + THROW_LENGTH_ERROR_IF(size_ > max_size() - add, + "basic_string's size too big"); + if (size_ > cap_ - add) { + reallocate(add); + } + pointer r = const_cast(first); + char_traits::move(r + count2, first + count1, end() - (first + count1)); + char_traits::copy(r, str, count2); + size_ += add; + } + else { + pointer r = const_cast(first); + char_traits::move(r + count2, first + count1, end() - (first + count1)); + char_traits::copy(r, str, count2); + size_ -= (count1 - count2); + } + return *this; +} + +// 把 first 开始的 count1 个字符替换成 count2 个 ch 字符 +template +basic_string& +basic_string::replace_fill(const_iterator first, + size_type count1, + size_type count2, + value_type ch) { + if (static_cast(cend() - first) < count1) { + count1 = cend() - first; + } + if (count1 < count2) { + const size_type add = count2 - count1; + THROW_LENGTH_ERROR_IF(size_ > max_size() - add, + "basic_string's size too big"); + if (size_ > cap_ - add) { + reallocate(add); + } + pointer r = const_cast(first); + char_traits::move(r + count2, first + count1, end() - (first + count1)); + char_traits::fill(r, ch, count2); + size_ += add; + } + else { + pointer r = const_cast(first); + char_traits::move(r + count2, first + count1, end() - (first + count1)); + char_traits::fill(r, ch, count2); + size_ -= (count1 - count2); + } + return *this; +} + +// 把 [first, last) 的字符替换成 [first2, last2) +template +template +basic_string& +basic_string::replace_copy(const_iterator first, + const_iterator last, + Iter first2, Iter last2) { + size_type len1 = last - first; + size_type len2 = last2 - first2; + if (len1 < len2) { + const size_type add = len2 - len1; + THROW_LENGTH_ERROR_IF(size_ > max_size() - add, + "basic_string's size too big"); + if (size_ > cap_ - add) { + reallocate(add); + } + pointer r = const_cast(first); + char_traits::move(r + len2, first + len1, end() - (first + len1)); + char_traits::copy(r, first2, len2); + size_ += add; + } + else { + pointer r = const_cast(first); + char_traits::move(r + len2, first + len1, end() - (first + len1)); + char_traits::copy(r, first2, len2); + size_ -= (len1 - len2); + } + return *this; +} + +// reallocate 函数 +template +void basic_string::reallocate(size_type need) { + const auto new_cap = mystl::max(cap_ + need, cap_ + (cap_ >> 1)); + auto new_buffer = data_allocator::allocate(new_cap); + char_traits::move(new_buffer, buffer_, size_); + data_allocator::deallocate(buffer_); + buffer_ = new_buffer; + cap_ = new_cap; +} + +// reallocate_and_fill 函数 +template +typename basic_string::iterator +basic_string::reallocate_and_fill(iterator pos, + size_type n, + value_type ch) { + const auto r = pos - buffer_; + const auto old_cap = cap_; + const auto new_cap = mystl::max(old_cap + n, old_cap + (old_cap >> 1)); + auto new_buffer = data_allocator::allocate(new_cap); + auto e1 = char_traits::move(new_buffer, buffer_, r) + r; + auto e2 = char_traits::fill(e1, ch, n) + n; + char_traits::move(e2, buffer_ + r, size_ - r); + data_allocator::deallocate(buffer_, old_cap); + buffer_ = new_buffer; + size_ += n; + cap_ = new_cap; + return buffer_ + r; +} + +// reallocate_and_copy 函数 +template +typename basic_string::iterator +basic_string::reallocate_and_copy(iterator pos, + const_iterator first, + const_iterator last) { + const auto r = pos - buffer_; + const auto old_cap = cap_; + const size_type n = mystl::distance(first, last); + const auto new_cap = mystl::max(old_cap + n, old_cap + (old_cap >> 1)); + auto new_buffer = data_allocator::allocate(new_cap); + auto e1 = char_traits::move(new_buffer, buffer_, r) + r; + auto e2 = mystl::uninitialized_copy_n(first, n, e1) + n; + char_traits::move(e2, buffer_ + r, size_ - r); + data_allocator::deallocate(buffer_, old_cap); + buffer_ = new_buffer; + size_ += n; + cap_ = new_cap; + return buffer_ + r; +} + +/*****************************************************************************************/ +// 重载全局操作符 + +// 重载 operator+ +template +basic_string +operator+(const basic_string& lhs, + const basic_string& rhs) { + basic_string tmp(lhs); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(const CharType* lhs, const basic_string& rhs) { + basic_string tmp(lhs); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(CharType ch, const basic_string& rhs) { + basic_string tmp(1, ch); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(const basic_string& lhs, const CharType* rhs) { + basic_string tmp(lhs); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(const basic_string& lhs, CharType ch) { + basic_string tmp(lhs); + tmp.append(1, ch); + return tmp; +} + +template +basic_string +operator+(basic_string&& lhs, + const basic_string& rhs) { + basic_string tmp(mystl::move(lhs)); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(const basic_string& lhs, + basic_string&& rhs) { + basic_string tmp(mystl::move(rhs)); + tmp.insert(tmp.begin(), lhs.begin(), lhs.end()); + return tmp; +} + +template +basic_string +operator+(basic_string&& lhs, + basic_string&& rhs) { + basic_string tmp(mystl::move(lhs)); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(const CharType* lhs, basic_string&& rhs) { + basic_string tmp(mystl::move(rhs)); + tmp.insert(tmp.begin(), lhs, lhs + char_traits::length(lhs)); + return tmp; +} + +template +basic_string +operator+(CharType ch, basic_string&& rhs) { + basic_string tmp(mystl::move(rhs)); + tmp.insert(tmp.begin(), ch); + return tmp; +} + +template +basic_string +operator+(basic_string&& lhs, const CharType* rhs) { + basic_string tmp(mystl::move(lhs)); + tmp.append(rhs); + return tmp; +} + +template +basic_string +operator+(basic_string&& lhs, CharType ch) { + basic_string tmp(mystl::move(lhs)); + tmp.append(1, ch); + return tmp; +} + +// 重载比较操作符 +template +bool operator==(const basic_string& lhs, + const basic_string& rhs) { + return lhs.size() == rhs.size() && lhs.compare(rhs) == 0; +} + +template +bool operator!=(const basic_string& lhs, + const basic_string& rhs) { + return lhs.size() != rhs.size() || lhs.compare(rhs) != 0; +} + +template +bool operator<(const basic_string& lhs, + const basic_string& rhs) { + return lhs.compare(rhs) < 0; +} + +template +bool operator<=(const basic_string& lhs, + const basic_string& rhs) { + return lhs.compare(rhs) <= 0; +} + +template +bool operator>(const basic_string& lhs, + const basic_string& rhs) { + return lhs.compare(rhs) > 0; +} + +template +bool operator>=(const basic_string& lhs, + const basic_string& rhs) { + return lhs.compare(rhs) >= 0; +} + +// 重载 mystl 的 swap +template +void swap(basic_string& lhs, + basic_string& rhs) noexcept { + lhs.swap(rhs); +} + +// 特化 mystl::hash +template +struct hash> { + size_t operator()(const basic_string& str) { + return bitwise_hash((const unsigned char*)str.c_str(), + str.size() * sizeof(CharType)); + } +}; + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_BASIC_STRING */ diff --git a/src/libcxx/include/cassert b/src/libcxx/include/cassert new file mode 100644 index 000000000..f73a8ae33 --- /dev/null +++ b/src/libcxx/include/cassert @@ -0,0 +1,31 @@ + +/** + * @file cassert + * @brief assert 实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * Based on https://wiki.osdev.org/Raspberry_Pi_Bare_Bones + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CASSERT +#define SIMPLEKERNEL_CASSERT + +#ifdef __cplusplus +extern "C" { +#endif + +#include "assert.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CASSERT */ diff --git a/src/libcxx/include/cfloat b/src/libcxx/include/cfloat new file mode 100644 index 000000000..4004a0d29 --- /dev/null +++ b/src/libcxx/include/cfloat @@ -0,0 +1,30 @@ + +/** + * @file cfloat + * @brief float 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CFLOAT +#define SIMPLEKERNEL_CFLOAT + +#ifdef __cplusplus +extern "C" { +#endif + +#include "float.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CFLOAT */ diff --git a/src/libcxx/include/climits b/src/libcxx/include/climits new file mode 100644 index 000000000..469c11efc --- /dev/null +++ b/src/libcxx/include/climits @@ -0,0 +1,30 @@ + +/** + * @file climits + * @brief limits 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CLIMITS +#define SIMPLEKERNEL_CLIMITS + +#ifdef __cplusplus +extern "C" { +#endif + +#include "limits.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CLIMITS */ diff --git a/src/libcxx/include/cmath b/src/libcxx/include/cmath new file mode 100644 index 000000000..28ba254a3 --- /dev/null +++ b/src/libcxx/include/cmath @@ -0,0 +1,30 @@ + +/** + * @file cmath + * @brief math 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CMATH +#define SIMPLEKERNEL_CMATH + +#ifdef __cplusplus +extern "C" { +#endif + +#include "math.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CMATH */ diff --git a/src/libcxx/include/construct b/src/libcxx/include/construct new file mode 100644 index 000000000..611f56db4 --- /dev/null +++ b/src/libcxx/include/construct @@ -0,0 +1,85 @@ + +/** + * @file construct + * @brief stl construct 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_CONSTRUCT +#define SIMPLEKERNEL_CONSTRUCT + +// 这个头文件包含两个函数 construct,destroy +// construct : 负责对象的构造 +// destroy : 负责对象的析构 + +#include "iterator" +#include "new" +#include "type_traits" + +namespace mystl { + +// construct 构造对象 + +template +void construct(Ty* ptr) { + ::new ((void*)ptr) Ty(); +} + +template +void construct(Ty1* ptr, const Ty2& value) { + ::new ((void*)ptr) Ty1(value); +} + +template +void construct(Ty* ptr, Args&&... args) { + ::new ((void*)ptr) Ty(mystl::forward(args)...); +} + +// destroy 将对象析构 + +template +void destroy_one(Ty*, std::true_type) { +} + +template +void destroy_one(Ty* pointer, std::false_type) { + if (pointer != nullptr) { + pointer->~Ty(); + } +} + +template +void destroy_cat(ForwardIter, ForwardIter, std::true_type) { +} + +template +void destroy(Ty* pointer) { + destroy_one(pointer, std::is_trivially_destructible {}); +} + +template +void destroy_cat(ForwardIter first, ForwardIter last, std::false_type) { + for (; first != last; ++first) { + destroy(&*first); + } +} + +template +void destroy(ForwardIter first, ForwardIter last) { + destroy_cat(first, last, + std::is_trivially_destructible< + typename iterator_traits::value_type> {}); +} +}; // namespace mystl + +#endif /* SIMPLEKERNEL_CONSTRUCT */ diff --git a/src/libcxx/include/cstdarg b/src/libcxx/include/cstdarg new file mode 100644 index 000000000..113f4ce75 --- /dev/null +++ b/src/libcxx/include/cstdarg @@ -0,0 +1,30 @@ + +/** + * @file cstdarg + * @brief stdarg 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTDARG +#define SIMPLEKERNEL_CSTDARG + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdarg.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CSTDARG */ diff --git a/src/libcxx/include/cstdbool b/src/libcxx/include/cstdbool new file mode 100644 index 000000000..887976188 --- /dev/null +++ b/src/libcxx/include/cstdbool @@ -0,0 +1,30 @@ + +/** + * @file cstdbool + * @brief stdbool 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTDBOOL +#define SIMPLEKERNEL_CSTDBOOL + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdbool.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CSTDBOOL */ diff --git a/src/libcxx/include/cstddef b/src/libcxx/include/cstddef new file mode 100644 index 000000000..2c44e953f --- /dev/null +++ b/src/libcxx/include/cstddef @@ -0,0 +1,30 @@ + +/** + * @file cstddef + * @brief stddef 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTDDEF +#define SIMPLEKERNEL_CSTDDEF + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stddef.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CSTDDEF */ diff --git a/src/libcxx/include/cstdint b/src/libcxx/include/cstdint new file mode 100644 index 000000000..8ea2ad60d --- /dev/null +++ b/src/libcxx/include/cstdint @@ -0,0 +1,31 @@ + +/** + * @file cstdint + * @brief stdint 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * Based on GNU C Lib + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTDINT +#define SIMPLEKERNEL_CSTDINT + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdint.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CSTDINT */ diff --git a/src/libcxx/include/cstdio b/src/libcxx/include/cstdio new file mode 100644 index 000000000..ae5fc5f4e --- /dev/null +++ b/src/libcxx/include/cstdio @@ -0,0 +1,31 @@ + +/** + * @file cstdio + * @brief stdio 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * Based on https://github.com/mpaland/printf + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTDIO +#define SIMPLEKERNEL_CSTDIO + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdio.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CSTDIO */ diff --git a/src/libcxx/include/cstdlib b/src/libcxx/include/cstdlib new file mode 100644 index 000000000..24fd88274 --- /dev/null +++ b/src/libcxx/include/cstdlib @@ -0,0 +1,30 @@ + +/** + * @file cstdlib + * @brief stdlib 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTDLIB +#define SIMPLEKERNEL_CSTDLIB + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdlib.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CSTDLIB */ diff --git a/src/libcxx/include/cstring b/src/libcxx/include/cstring new file mode 100644 index 000000000..4f702c729 --- /dev/null +++ b/src/libcxx/include/cstring @@ -0,0 +1,125 @@ + +/** + * @file cstring + * @brief string 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CSTRING +#define SIMPLEKERNEL_CSTRING + +// -*- C++ -*- forwarding header. + +// Copyright (C) 1997-2017 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/** @file cstring + * This is a Standard C++ Library file. You should @c \#include this file + * in your programs, rather than any of the @a *.h implementation files. + * + * This is the C++ version of the Standard C Library header @c string.h, + * and its contents are (mostly) the same as that header, but are all + * contained in the namespace @c std (except for names which are defined + * as macros in C). + */ + +// +// ISO C++ 14882: 20.4.6 C library +// + +#include + +// Get rid of those macros defined in in lieu of real functions. +#undef memchr +#undef memcmp +#undef memcpy +#undef memmove +#undef memset +#undef strcat +#undef strchr +#undef strcmp +#undef strcoll +#undef strcpy +#undef strcspn +#undef strerror +#undef strlen +#undef strncat +#undef strncmp +#undef strncpy +#undef strpbrk +#undef strrchr +#undef strspn +#undef strstr +#undef strtok +#undef strxfrm + +inline void* memchr(void* __s, int __c, size_t __n) { + return __builtin_memchr(__s, __c, __n); +} + +inline char* strchr(char* __s, int __n) { + return __builtin_strchr(__s, __n); +} + +inline char* strpbrk(char* __s1, const char* __s2) { + return __builtin_strpbrk(__s1, __s2); +} + +inline char* strrchr(char* __s, int __n) { + return __builtin_strrchr(__s, __n); +} + +inline char* strstr(char* __s1, const char* __s2) { + return __builtin_strstr(__s1, __s2); +} + +namespace std { + +using ::memchr; +using ::memcmp; +using ::memcpy; +using ::memmove; +using ::memset; +using ::strcat; +using ::strchr; +using ::strcmp; +using ::strcpy; +using ::strlen; +using ::strncmp; +using ::strncpy; +using ::strpbrk; +using ::strrchr; +using ::strstr; + +}; // namespace std + +#endif /* SIMPLEKERNEL_CSTRING */ diff --git a/src/libcxx/include/ctype b/src/libcxx/include/ctype new file mode 100644 index 000000000..1b4ff308d --- /dev/null +++ b/src/libcxx/include/ctype @@ -0,0 +1,30 @@ + +/** + * @file ctype + * @brief ctype 定义 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#ifndef SIMPLEKERNEL_CTYPE +#define SIMPLEKERNEL_CTYPE + +#ifdef __cplusplus +extern "C" { +#endif + +#include "ctype.h" + +#ifdef __cplusplus +} +#endif + +#endif /* SIMPLEKERNEL_CTYPE */ diff --git a/src/libcxx/include/cxxabi.h b/src/libcxx/include/cxxabi.h new file mode 100644 index 000000000..9241da552 --- /dev/null +++ b/src/libcxx/include/cxxabi.h @@ -0,0 +1,92 @@ + +/** + * @file cxxabi.h + * @brief C++ abi 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://wiki.osdev.org/C%2B%2B + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_CXXABI_H +#define SIMPLEKERNEL_CXXABI_H + +#ifdef __cplusplus +extern "C" { +#endif +// TODO: 纯虚函数支持 + +// c++ 初始化 +void cpp_init(void); + +int __cxa_atexit(void (*f)(void*), void* objptr, void* dso); +void __cxa_finalize(void* f); + +int __aeabi_atexit(void (*f)(void*), void* objptr, void* dso); +void __cxa_finalize(void* f); + +#if UINT32_MAX == UINTPTR_MAX +# define STACK_CHK_GUARD 0xe2dee396 +#else +# define STACK_CHK_GUARD 0x595e9fbd94fda766 +#endif + +#ifdef __cplusplus +}; +#endif + +namespace std { +class type_info { +private: + const char* tname; + +public: + virtual ~type_info(void); + + type_info(const type_info&); + + explicit type_info(const char*); + + const char* name(void) const; + + bool operator==(const type_info&) const; + + bool operator!=(const type_info&) const; +}; +} // namespace std + +namespace __cxxabiv1 { + +#define ADD_CXX_TYPEINFO_HEADER(t) \ + class t : public std::type_info { \ + private: \ + \ + protected: \ + \ + public: \ + explicit t(const char*); \ + virtual ~t(void); \ + } + +ADD_CXX_TYPEINFO_HEADER(__fundamental_type_info); +ADD_CXX_TYPEINFO_HEADER(__array_type_info); +ADD_CXX_TYPEINFO_HEADER(__function_type_info); +ADD_CXX_TYPEINFO_HEADER(__enum_type_info); +ADD_CXX_TYPEINFO_HEADER(__pbase_type_info); +ADD_CXX_TYPEINFO_HEADER(__pointer_type_info); +ADD_CXX_TYPEINFO_HEADER(__pointer_to_member_type_info); +ADD_CXX_TYPEINFO_HEADER(__class_type_info); +ADD_CXX_TYPEINFO_HEADER(__si_class_type_info); +ADD_CXX_TYPEINFO_HEADER(__vmi_class_type_info); + +#undef ADD_CXX_TYPEINFO_HEADER +} // namespace __cxxabiv1 + +#endif /* SIMPLEKERNEL_CXXABI_H */ diff --git a/src/libcxx/include/deque b/src/libcxx/include/deque new file mode 100644 index 000000000..0e4e4a985 --- /dev/null +++ b/src/libcxx/include/deque @@ -0,0 +1,1366 @@ + +/** + * @file deque + * @brief stl deque 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_DEQUE +#define SIMPLEKERNEL_DEQUE + +// 这个头文件包含了一个模板类 deque +// deque: 双端队列 + +// notes: +// +// 异常保证: +// std::deque +// 满足基本异常保证,部分函数无异常保证,并对以下等函数做强异常安全保证: +// * emplace_front +// * emplace_back +// * emplace +// * push_front +// * push_back +// * insert + +#include "exceptdef" +#include "initializer_list" +#include "iterator" +#include "memory" +#include "util" + +namespace mystl { + +#ifdef max +# pragma message("#undefing marco max") +# undef max +#endif // max + +#ifdef min +# pragma message("#undefing marco min") +# undef min +#endif // min + +// deque map 初始化的大小 +#ifndef DEQUE_MAP_INIT_SIZE +# define DEQUE_MAP_INIT_SIZE 8 +#endif + +template +struct deque_buf_size { + static constexpr size_t value = sizeof(T) < 256 ? 4096 / sizeof(T) : 16; +}; + +// deque 的迭代器设计 +template +struct deque_iterator : public iterator { + typedef deque_iterator iterator; + typedef deque_iterator const_iterator; + typedef deque_iterator self; + + typedef T value_type; + typedef Ptr pointer; + typedef Ref reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef T* value_pointer; + typedef T** map_pointer; + + static const size_type buffer_size = deque_buf_size::value; + + // 迭代器所含成员数据 + value_pointer cur; // 指向所在缓冲区的当前元素 + value_pointer first; // 指向所在缓冲区的头部 + value_pointer last; // 指向所在缓冲区的尾部 + map_pointer node; // 缓冲区所在节点 + + // 构造、复制、移动函数 + deque_iterator() noexcept + : cur(nullptr), first(nullptr), last(nullptr), node(nullptr) { + } + + deque_iterator(value_pointer v, map_pointer n) + : cur(v), first(*n), last(*n + buffer_size), node(n) { + } + + deque_iterator(const iterator& rhs) + : cur(rhs.cur), first(rhs.first), last(rhs.last), node(rhs.node) { + } + + deque_iterator(iterator&& rhs) noexcept + : cur(rhs.cur), first(rhs.first), last(rhs.last), node(rhs.node) { + rhs.cur = nullptr; + rhs.first = nullptr; + rhs.last = nullptr; + rhs.node = nullptr; + } + + deque_iterator(const const_iterator& rhs) + : cur(rhs.cur), first(rhs.first), last(rhs.last), node(rhs.node) { + } + + self& operator=(const iterator& rhs) { + if (this != &rhs) { + cur = rhs.cur; + first = rhs.first; + last = rhs.last; + node = rhs.node; + } + return *this; + } + + // 转到另一个缓冲区 + void set_node(map_pointer new_node) { + node = new_node; + first = *new_node; + last = first + buffer_size; + } + + // 重载运算符 + reference operator*() const { + return *cur; + } + + pointer operator->() const { + return cur; + } + + difference_type operator-(const self& x) const { + return static_cast(buffer_size) * (node - x.node) + + (cur - first) - (x.cur - x.first); + } + + self& operator++() { + ++cur; + if (cur == last) { // 如果到达缓冲区的尾 + set_node(node + 1); + cur = first; + } + return *this; + } + + self operator++(int) { + self tmp = *this; + ++*this; + return tmp; + } + + self& operator--() { + if (cur == first) { // 如果到达缓冲区的头 + set_node(node - 1); + cur = last; + } + --cur; + return *this; + } + + self operator--(int) { + self tmp = *this; + --*this; + return tmp; + } + + self& operator+=(difference_type n) { + const auto offset = n + (cur - first); + if (offset >= 0 + && offset < static_cast( + buffer_size)) { // 仍在当前缓冲区 + cur += n; + } + else { // 要跳到其他的缓冲区 + const auto node_offset + = offset > 0 + ? offset / static_cast(buffer_size) + : -static_cast((-offset - 1) / buffer_size) + - 1; + set_node(node + node_offset); + cur = first + + (offset + - node_offset * static_cast(buffer_size)); + } + return *this; + } + + self operator+(difference_type n) const { + self tmp = *this; + return tmp += n; + } + + self& operator-=(difference_type n) { + return *this += -n; + } + + self operator-(difference_type n) const { + self tmp = *this; + return tmp -= n; + } + + reference operator[](difference_type n) const { + return *(*this + n); + } + + // 重载比较操作符 + bool operator==(const self& rhs) const { + return cur == rhs.cur; + } + + bool operator<(const self& rhs) const { + return node == rhs.node ? (cur < rhs.cur) : (node < rhs.node); + } + + bool operator!=(const self& rhs) const { + return !(*this == rhs); + } + + bool operator>(const self& rhs) const { + return rhs < *this; + } + + bool operator<=(const self& rhs) const { + return !(rhs < *this); + } + + bool operator>=(const self& rhs) const { + return !(*this < rhs); + } +}; + +// 模板类 deque +// 模板参数代表数据类型 +template +class deque { +public: + // deque 的型别定义 + typedef mystl::allocator allocator_type; + typedef mystl::allocator data_allocator; + typedef mystl::allocator map_allocator; + + typedef typename allocator_type::value_type value_type; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + typedef pointer* map_pointer; + typedef const_pointer* const_map_pointer; + + typedef deque_iterator iterator; + typedef deque_iterator const_iterator; + typedef mystl::reverse_iterator reverse_iterator; + typedef mystl::reverse_iterator const_reverse_iterator; + + allocator_type get_allocator() { + return allocator_type(); + } + + static const size_type buffer_size = deque_buf_size::value; + +private: + // 用以下四个数据来表现一个 deque + iterator begin_; // 指向第一个节点 + iterator end_; // 指向最后一个结点 + map_pointer + map_; // 指向一块 map,map 中的每个元素都是一个指针,指向一个缓冲区 + size_type map_size_; // map 内指针的数目 + +public: + // 构造、复制、移动、析构函数 + + deque() { + fill_init(0, value_type()); + } + + explicit deque(size_type n) { + fill_init(n, value_type()); + } + + deque(size_type n, const value_type& value) { + fill_init(n, value); + } + + template ::value, int>::type + = 0> + deque(IIter first, IIter last) { + copy_init(first, last, iterator_category(first)); + } + + deque(std::initializer_list ilist) { + copy_init(ilist.begin(), ilist.end(), mystl::forward_iterator_tag()); + } + + deque(const deque& rhs) { + copy_init(rhs.begin(), rhs.end(), mystl::forward_iterator_tag()); + } + + deque(deque&& rhs) noexcept + : begin_(mystl::move(rhs.begin_)), + end_(mystl::move(rhs.end_)), + map_(rhs.map_), + map_size_(rhs.map_size_) { + rhs.map_ = nullptr; + rhs.map_size_ = 0; + } + + deque& operator=(const deque& rhs); + deque& operator=(deque&& rhs); + + deque& operator=(std::initializer_list ilist) { + deque tmp(ilist); + swap(tmp); + return *this; + } + + ~deque() { + if (map_ != nullptr) { + clear(); + data_allocator::deallocate(*begin_.node, buffer_size); + *begin_.node = nullptr; + map_allocator::deallocate(map_, map_size_); + map_ = nullptr; + } + } + +public: + // 迭代器相关操作 + + iterator begin() noexcept { + return begin_; + } + + const_iterator begin() const noexcept { + return begin_; + } + + iterator end() noexcept { + return end_; + } + + const_iterator end() const noexcept { + return end_; + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关操作 + + bool empty() const noexcept { + return begin() == end(); + } + + size_type size() const noexcept { + return end_ - begin_; + } + + size_type max_size() const noexcept { + return static_cast(-1); + } + + void resize(size_type new_size) { + resize(new_size, value_type()); + } + + void resize(size_type new_size, const value_type& value); + void shrink_to_fit() noexcept; + + // 访问元素相关操作 + reference operator[](size_type n) { + MYSTL_DEBUG(n < size()); + return begin_[n]; + } + + const_reference operator[](size_type n) const { + MYSTL_DEBUG(n < size()); + return begin_[n]; + } + + reference at(size_type n) { + THROW_OUT_OF_RANGE_IF(!(n < size()), + "deque::at() subscript out of range"); + return (*this)[n]; + } + + const_reference at(size_type n) const { + THROW_OUT_OF_RANGE_IF(!(n < size()), + "deque::at() subscript out of range"); + return (*this)[n]; + } + + reference front() { + MYSTL_DEBUG(!empty()); + return *begin(); + } + + const_reference front() const { + MYSTL_DEBUG(!empty()); + return *begin(); + } + + reference back() { + MYSTL_DEBUG(!empty()); + return *(end() - 1); + } + + const_reference back() const { + MYSTL_DEBUG(!empty()); + return *(end() - 1); + } + + // 修改容器相关操作 + + // assign + + void assign(size_type n, const value_type& value) { + fill_assign(n, value); + } + + template ::value, int>::type + = 0> + void assign(IIter first, IIter last) { + copy_assign(first, last, iterator_category(first)); + } + + void assign(std::initializer_list ilist) { + copy_assign(ilist.begin(), ilist.end(), mystl::forward_iterator_tag {}); + } + + // emplace_front / emplace_back / emplace + + template + void emplace_front(Args&&... args); + template + void emplace_back(Args&&... args); + template + iterator emplace(iterator pos, Args&&... args); + + // push_front / push_back + + void push_front(const value_type& value); + void push_back(const value_type& value); + + void push_front(value_type&& value) { + emplace_front(mystl::move(value)); + } + + void push_back(value_type&& value) { + emplace_back(mystl::move(value)); + } + + // pop_back / pop_front + + void pop_front(); + void pop_back(); + + // insert + + iterator insert(iterator position, const value_type& value); + iterator insert(iterator position, value_type&& value); + void insert(iterator position, size_type n, const value_type& value); + + template ::value, int>::type + = 0> + void insert(iterator position, IIter first, IIter last) { + insert_dispatch(position, first, last, iterator_category(first)); + } + + // erase /clear + + iterator erase(iterator position); + iterator erase(iterator first, iterator last); + void clear(); + + // swap + + void swap(deque& rhs) noexcept; + +private: + // helper functions + + // create node / destroy node + map_pointer create_map(size_type size); + void create_buffer(map_pointer nstart, map_pointer nfinish); + void destroy_buffer(map_pointer nstart, map_pointer nfinish); + + // initialize + void map_init(size_type nelem); + void fill_init(size_type n, const value_type& value); + template + void copy_init(IIter, IIter, input_iterator_tag); + template + void copy_init(FIter, FIter, forward_iterator_tag); + + // assign + void fill_assign(size_type n, const value_type& value); + template + void copy_assign(IIter first, IIter last, input_iterator_tag); + template + void copy_assign(FIter first, FIter last, forward_iterator_tag); + + // insert + template + iterator insert_aux(iterator position, Args&&... args); + void fill_insert(iterator position, size_type n, const value_type& x); + template + void copy_insert(iterator, FIter, FIter, size_type); + template + void insert_dispatch(iterator, IIter, IIter, input_iterator_tag); + template + void insert_dispatch(iterator, FIter, FIter, forward_iterator_tag); + + // reallocate + void require_capacity(size_type n, bool front); + void reallocate_map_at_front(size_type need); + void reallocate_map_at_back(size_type need); +}; + +/*****************************************************************************************/ + +// 复制赋值运算符 +template +deque& deque::operator=(const deque& rhs) { + if (this != &rhs) { + const auto len = size(); + if (len >= rhs.size()) { + erase(mystl::copy(rhs.begin_, rhs.end_, begin_), end_); + } + else { + iterator mid = rhs.begin() + static_cast(len); + mystl::copy(rhs.begin_, mid, begin_); + insert(end_, mid, rhs.end_); + } + } + return *this; +} + +// 移动赋值运算符 +template +deque& deque::operator=(deque&& rhs) { + clear(); + begin_ = mystl::move(rhs.begin_); + end_ = mystl::move(rhs.end_); + map_ = rhs.map_; + map_size_ = rhs.map_size_; + rhs.map_ = nullptr; + rhs.map_size_ = 0; + return *this; +} + +// 重置容器大小 +template +void deque::resize(size_type new_size, const value_type& value) { + const auto len = size(); + if (new_size < len) { + erase(begin_ + new_size, end_); + } + else { + insert(end_, new_size - len, value); + } +} + +// 减小容器容量 +template +void deque::shrink_to_fit() noexcept { + // 至少会留下头部缓冲区 + for (auto cur = map_; cur < begin_.node; ++cur) { + data_allocator::deallocate(*cur, buffer_size); + *cur = nullptr; + } + for (auto cur = end_.node + 1; cur < map_ + map_size_; ++cur) { + data_allocator::deallocate(*cur, buffer_size); + *cur = nullptr; + } +} + +// 在头部就地构建元素 +template +template +void deque::emplace_front(Args&&... args) { + if (begin_.cur != begin_.first) { + data_allocator::construct(begin_.cur - 1, + mystl::forward(args)...); + --begin_.cur; + } + else { + require_capacity(1, true); + try { + --begin_; + data_allocator::construct(begin_.cur, + mystl::forward(args)...); + } catch (...) { + ++begin_; + throw; + } + } +} + +// 在尾部就地构建元素 +template +template +void deque::emplace_back(Args&&... args) { + if (end_.cur != end_.last - 1) { + data_allocator::construct(end_.cur, mystl::forward(args)...); + ++end_.cur; + } + else { + require_capacity(1, false); + data_allocator::construct(end_.cur, mystl::forward(args)...); + ++end_; + } +} + +// 在 pos 位置就地构建元素 +template +template +typename deque::iterator deque::emplace(iterator pos, Args&&... args) { + if (pos.cur == begin_.cur) { + emplace_front(mystl::forward(args)...); + return begin_; + } + else if (pos.cur == end_.cur) { + emplace_back(mystl::forward(args)...); + return end_ - 1; + } + return insert_aux(pos, mystl::forward(args)...); +} + +// 在头部插入元素 +template +void deque::push_front(const value_type& value) { + if (begin_.cur != begin_.first) { + data_allocator::construct(begin_.cur - 1, value); + --begin_.cur; + } + else { + require_capacity(1, true); + try { + --begin_; + data_allocator::construct(begin_.cur, value); + } catch (...) { + ++begin_; + throw; + } + } +} + +// 在尾部插入元素 +template +void deque::push_back(const value_type& value) { + if (end_.cur != end_.last - 1) { + data_allocator::construct(end_.cur, value); + ++end_.cur; + } + else { + require_capacity(1, false); + data_allocator::construct(end_.cur, value); + ++end_; + } +} + +// 弹出头部元素 +template +void deque::pop_front() { + MYSTL_DEBUG(!empty()); + if (begin_.cur != begin_.last - 1) { + data_allocator::destroy(begin_.cur); + ++begin_.cur; + } + else { + data_allocator::destroy(begin_.cur); + ++begin_; + destroy_buffer(begin_.node - 1, begin_.node - 1); + } +} + +// 弹出尾部元素 +template +void deque::pop_back() { + MYSTL_DEBUG(!empty()); + if (end_.cur != end_.first) { + --end_.cur; + data_allocator::destroy(end_.cur); + } + else { + --end_; + data_allocator::destroy(end_.cur); + destroy_buffer(end_.node + 1, end_.node + 1); + } +} + +// 在 position 处插入元素 +template +typename deque::iterator +deque::insert(iterator position, const value_type& value) { + if (position.cur == begin_.cur) { + push_front(value); + return begin_; + } + else if (position.cur == end_.cur) { + push_back(value); + auto tmp = end_; + --tmp; + return tmp; + } + else { + return insert_aux(position, value); + } +} + +template +typename deque::iterator +deque::insert(iterator position, value_type&& value) { + if (position.cur == begin_.cur) { + emplace_front(mystl::move(value)); + return begin_; + } + else if (position.cur == end_.cur) { + emplace_back(mystl::move(value)); + auto tmp = end_; + --tmp; + return tmp; + } + else { + return insert_aux(position, mystl::move(value)); + } +} + +// 在 position 位置插入 n 个元素 +template +void deque::insert(iterator position, size_type n, const value_type& value) { + if (position.cur == begin_.cur) { + require_capacity(n, true); + auto new_begin = begin_ - n; + mystl::uninitialized_fill_n(new_begin, n, value); + begin_ = new_begin; + } + else if (position.cur == end_.cur) { + require_capacity(n, false); + auto new_end = end_ + n; + mystl::uninitialized_fill_n(end_, n, value); + end_ = new_end; + } + else { + fill_insert(position, n, value); + } +} + +// 删除 position 处的元素 +template +typename deque::iterator deque::erase(iterator position) { + auto next = position; + ++next; + const size_type elems_before = position - begin_; + if (elems_before < (size() / 2)) { + mystl::copy_backward(begin_, position, next); + pop_front(); + } + else { + mystl::copy(next, end_, position); + pop_back(); + } + return begin_ + elems_before; +} + +// 删除[first, last)上的元素 +template +typename deque::iterator deque::erase(iterator first, iterator last) { + if (first == begin_ && last == end_) { + clear(); + return end_; + } + else { + const size_type len = last - first; + const size_type elems_before = first - begin_; + if (elems_before < ((size() - len) / 2)) { + mystl::copy_backward(begin_, first, last); + auto new_begin = begin_ + len; + data_allocator::destroy(begin_.cur, new_begin.cur); + begin_ = new_begin; + } + else { + mystl::copy(last, end_, first); + auto new_end = end_ - len; + data_allocator::destroy(new_end.cur, end_.cur); + end_ = new_end; + } + return begin_ + elems_before; + } +} + +// 清空 deque +template +void deque::clear() { + // clear 会保留头部的缓冲区 + for (map_pointer cur = begin_.node + 1; cur < end_.node; ++cur) { + data_allocator::destroy(*cur, *cur + buffer_size); + } + if (begin_.node != end_.node) { // 有两个以上的缓冲区 + mystl::destroy(begin_.cur, begin_.last); + mystl::destroy(end_.first, end_.cur); + } + else { + mystl::destroy(begin_.cur, end_.cur); + } + shrink_to_fit(); + end_ = begin_; +} + +// 交换两个 deque +template +void deque::swap(deque& rhs) noexcept { + if (this != &rhs) { + mystl::swap(begin_, rhs.begin_); + mystl::swap(end_, rhs.end_); + mystl::swap(map_, rhs.map_); + mystl::swap(map_size_, rhs.map_size_); + } +} + +/*****************************************************************************************/ +// helper function + +template +typename deque::map_pointer deque::create_map(size_type size) { + map_pointer mp = nullptr; + mp = map_allocator::allocate(size); + for (size_type i = 0; i < size; ++i) { + *(mp + i) = nullptr; + } + return mp; +} + +// create_buffer 函数 +template +void deque::create_buffer(map_pointer nstart, map_pointer nfinish) { + map_pointer cur; + try { + for (cur = nstart; cur <= nfinish; ++cur) { + *cur = data_allocator::allocate(buffer_size); + } + } catch (...) { + while (cur != nstart) { + --cur; + data_allocator::deallocate(*cur, buffer_size); + *cur = nullptr; + } + throw; + } +} + +// destroy_buffer 函数 +template +void deque::destroy_buffer(map_pointer nstart, map_pointer nfinish) { + for (map_pointer n = nstart; n <= nfinish; ++n) { + data_allocator::deallocate(*n, buffer_size); + *n = nullptr; + } +} + +// map_init 函数 +template +void deque::map_init(size_type nElem) { + const size_type nNode = nElem / buffer_size + 1; // 需要分配的缓冲区个数 + map_size_ + = mystl::max(static_cast(DEQUE_MAP_INIT_SIZE), nNode + 2); + try { + map_ = create_map(map_size_); + } catch (...) { + map_ = nullptr; + map_size_ = 0; + throw; + } + + // 让 nstart 和 nfinish 都指向 map_ 最中央的区域,方便向头尾扩充 + map_pointer nstart = map_ + (map_size_ - nNode) / 2; + map_pointer nfinish = nstart + nNode - 1; + try { + create_buffer(nstart, nfinish); + } catch (...) { + map_allocator::deallocate(map_, map_size_); + map_ = nullptr; + map_size_ = 0; + throw; + } + begin_.set_node(nstart); + end_.set_node(nfinish); + begin_.cur = begin_.first; + end_.cur = end_.first + (nElem % buffer_size); +} + +// fill_init 函数 +template +void deque::fill_init(size_type n, const value_type& value) { + map_init(n); + if (n != 0) { + for (auto cur = begin_.node; cur < end_.node; ++cur) { + mystl::uninitialized_fill(*cur, *cur + buffer_size, value); + } + mystl::uninitialized_fill(end_.first, end_.cur, value); + } +} + +// copy_init 函数 +template +template +void deque::copy_init(IIter first, IIter last, input_iterator_tag) { + const size_type n = mystl::distance(first, last); + map_init(n); + for (; first != last; ++first) { + emplace_back(*first); + } +} + +template +template +void deque::copy_init(FIter first, FIter last, forward_iterator_tag) { + const size_type n = mystl::distance(first, last); + map_init(n); + for (auto cur = begin_.node; cur < end_.node; ++cur) { + auto next = first; + mystl::advance(next, buffer_size); + mystl::uninitialized_copy(first, next, *cur); + first = next; + } + mystl::uninitialized_copy(first, last, end_.first); +} + +// fill_assign 函数 +template +void deque::fill_assign(size_type n, const value_type& value) { + if (n > size()) { + mystl::fill(begin(), end(), value); + insert(end(), n - size(), value); + } + else { + erase(begin() + n, end()); + mystl::fill(begin(), end(), value); + } +} + +// copy_assign 函数 +template +template +void deque::copy_assign(IIter first, IIter last, input_iterator_tag) { + auto first1 = begin(); + auto last1 = end(); + for (; first != last && first1 != last1; ++first, ++first1) { + *first1 = *first; + } + if (first1 != last1) { + erase(first1, last1); + } + else { + insert_dispatch(end_, first, last, input_iterator_tag {}); + } +} + +template +template +void deque::copy_assign(FIter first, FIter last, forward_iterator_tag) { + const size_type len1 = size(); + const size_type len2 = mystl::distance(first, last); + if (len1 < len2) { + auto next = first; + mystl::advance(next, len1); + mystl::copy(first, next, begin_); + insert_dispatch(end_, next, last, forward_iterator_tag {}); + } + else { + erase(mystl::copy(first, last, begin_), end_); + } +} + +// insert_aux 函数 +template +template +typename deque::iterator +deque::insert_aux(iterator position, Args&&... args) { + const size_type elems_before = position - begin_; + value_type value_copy = value_type(mystl::forward(args)...); + if (elems_before < (size() / 2)) { // 在前半段插入 + emplace_front(front()); + auto front1 = begin_; + ++front1; + auto front2 = front1; + ++front2; + position = begin_ + elems_before; + auto pos = position; + ++pos; + mystl::copy(front2, pos, front1); + } + else { // 在后半段插入 + emplace_back(back()); + auto back1 = end_; + --back1; + auto back2 = back1; + --back2; + position = begin_ + elems_before; + mystl::copy_backward(position, back2, back1); + } + *position = mystl::move(value_copy); + return position; +} + +// fill_insert 函数 +template +void deque::fill_insert(iterator position, size_type n, + const value_type& value) { + const size_type elems_before = position - begin_; + const size_type len = size(); + auto value_copy = value; + if (elems_before < (len / 2)) { + require_capacity(n, true); + // 原来的迭代器可能会失效 + auto old_begin = begin_; + auto new_begin = begin_ - n; + position = begin_ + elems_before; + try { + if (elems_before >= n) { + auto begin_n = begin_ + n; + mystl::uninitialized_copy(begin_, begin_n, new_begin); + begin_ = new_begin; + mystl::copy(begin_n, position, old_begin); + mystl::fill(position - n, position, value_copy); + } + else { + mystl::uninitialized_fill(mystl::uninitialized_copy(begin_, + position, + new_begin), + begin_, value_copy); + begin_ = new_begin; + mystl::fill(old_begin, position, value_copy); + } + } catch (...) { + if (new_begin.node != begin_.node) { + destroy_buffer(new_begin.node, begin_.node - 1); + } + throw; + } + } + else { + require_capacity(n, false); + // 原来的迭代器可能会失效 + auto old_end = end_; + auto new_end = end_ + n; + const size_type elems_after = len - elems_before; + position = end_ - elems_after; + try { + if (elems_after > n) { + auto end_n = end_ - n; + mystl::uninitialized_copy(end_n, end_, end_); + end_ = new_end; + mystl::copy_backward(position, end_n, old_end); + mystl::fill(position, position + n, value_copy); + } + else { + mystl::uninitialized_fill(end_, position + n, value_copy); + mystl::uninitialized_copy(position, end_, position + n); + end_ = new_end; + mystl::fill(position, old_end, value_copy); + } + } catch (...) { + if (new_end.node != end_.node) { + destroy_buffer(end_.node + 1, new_end.node); + } + throw; + } + } +} + +// copy_insert +template +template +void deque::copy_insert(iterator position, FIter first, FIter last, + size_type n) { + const size_type elems_before = position - begin_; + auto len = size(); + if (elems_before < (len / 2)) { + require_capacity(n, true); + // 原来的迭代器可能会失效 + auto old_begin = begin_; + auto new_begin = begin_ - n; + position = begin_ + elems_before; + try { + if (elems_before >= n) { + auto begin_n = begin_ + n; + mystl::uninitialized_copy(begin_, begin_n, new_begin); + begin_ = new_begin; + mystl::copy(begin_n, position, old_begin); + mystl::copy(first, last, position - n); + } + else { + auto mid = first; + mystl::advance(mid, n - elems_before); + mystl::uninitialized_copy(first, mid, + mystl::uninitialized_copy(begin_, + position, + new_begin)); + begin_ = new_begin; + mystl::copy(mid, last, old_begin); + } + } catch (...) { + if (new_begin.node != begin_.node) { + destroy_buffer(new_begin.node, begin_.node - 1); + } + throw; + } + } + else { + require_capacity(n, false); + // 原来的迭代器可能会失效 + auto old_end = end_; + auto new_end = end_ + n; + const auto elems_after = len - elems_before; + position = end_ - elems_after; + try { + if (elems_after > n) { + auto end_n = end_ - n; + mystl::uninitialized_copy(end_n, end_, end_); + end_ = new_end; + mystl::copy_backward(position, end_n, old_end); + mystl::copy(first, last, position); + } + else { + auto mid = first; + mystl::advance(mid, elems_after); + mystl::uninitialized_copy(position, end_, + mystl::uninitialized_copy(mid, last, + end_)); + end_ = new_end; + mystl::copy(first, mid, position); + } + } catch (...) { + if (new_end.node != end_.node) { + destroy_buffer(end_.node + 1, new_end.node); + } + throw; + } + } +} + +// insert_dispatch 函数 +template +template +void deque::insert_dispatch(iterator position, IIter first, IIter last, + input_iterator_tag) { + if (last <= first) { + return; + } + const size_type n = mystl::distance(first, last); + const size_type elems_before = position - begin_; + if (elems_before < (size() / 2)) { + require_capacity(n, true); + } + else { + require_capacity(n, false); + } + position = begin_ + elems_before; + auto cur = --last; + for (size_type i = 0; i < n; ++i, --cur) { + insert(position, *cur); + } +} + +template +template +void deque::insert_dispatch(iterator position, FIter first, FIter last, + forward_iterator_tag) { + if (last <= first) { + return; + } + const size_type n = mystl::distance(first, last); + if (position.cur == begin_.cur) { + require_capacity(n, true); + auto new_begin = begin_ - n; + try { + mystl::uninitialized_copy(first, last, new_begin); + begin_ = new_begin; + } catch (...) { + if (new_begin.node != begin_.node) { + destroy_buffer(new_begin.node, begin_.node - 1); + } + throw; + } + } + else if (position.cur == end_.cur) { + require_capacity(n, false); + auto new_end = end_ + n; + try { + mystl::uninitialized_copy(first, last, end_); + end_ = new_end; + } catch (...) { + if (new_end.node != end_.node) { + destroy_buffer(end_.node + 1, new_end.node); + } + throw; + } + } + else { + copy_insert(position, first, last, n); + } +} + +// require_capacity 函数 +template +void deque::require_capacity(size_type n, bool front) { + if (front && (static_cast(begin_.cur - begin_.first) < n)) { + const size_type need_buffer + = (n - (begin_.cur - begin_.first)) / buffer_size + 1; + if (need_buffer > static_cast(begin_.node - map_)) { + reallocate_map_at_front(need_buffer); + return; + } + create_buffer(begin_.node - need_buffer, begin_.node - 1); + } + else if (!front && (static_cast(end_.last - end_.cur - 1) < n)) { + const size_type need_buffer + = (n - (end_.last - end_.cur - 1)) / buffer_size + 1; + if (need_buffer + > static_cast((map_ + map_size_) - end_.node - 1)) { + reallocate_map_at_back(need_buffer); + return; + } + create_buffer(end_.node + 1, end_.node + need_buffer); + } +} + +// reallocate_map_at_front 函数 +template +void deque::reallocate_map_at_front(size_type need_buffer) { + const size_type new_map_size + = mystl::max(map_size_ << 1, + map_size_ + need_buffer + DEQUE_MAP_INIT_SIZE); + map_pointer new_map = create_map(new_map_size); + const size_type old_buffer = end_.node - begin_.node + 1; + const size_type new_buffer = old_buffer + need_buffer; + + // 另新的 map 中的指针指向原来的 buffer,并开辟新的 buffer + auto begin = new_map + (new_map_size - new_buffer) / 2; + auto mid = begin + need_buffer; + auto end = mid + old_buffer; + create_buffer(begin, mid - 1); + for (auto begin1 = mid, begin2 = begin_.node; begin1 != end; + ++begin1, ++begin2) { + *begin1 = *begin2; + } + + // 更新数据 + map_allocator::deallocate(map_, map_size_); + map_ = new_map; + map_size_ = new_map_size; + begin_ = iterator(*mid + (begin_.cur - begin_.first), mid); + end_ = iterator(*(end - 1) + (end_.cur - end_.first), end - 1); +} + +// reallocate_map_at_back 函数 +template +void deque::reallocate_map_at_back(size_type need_buffer) { + const size_type new_map_size + = mystl::max(map_size_ << 1, + map_size_ + need_buffer + DEQUE_MAP_INIT_SIZE); + map_pointer new_map = create_map(new_map_size); + const size_type old_buffer = end_.node - begin_.node + 1; + const size_type new_buffer = old_buffer + need_buffer; + + // 另新的 map 中的指针指向原来的 buffer,并开辟新的 buffer + auto begin = new_map + ((new_map_size - new_buffer) / 2); + auto mid = begin + old_buffer; + auto end = mid + need_buffer; + for (auto begin1 = begin, begin2 = begin_.node; begin1 != mid; + ++begin1, ++begin2) { + *begin1 = *begin2; + } + create_buffer(mid, end - 1); + + // 更新数据 + map_allocator::deallocate(map_, map_size_); + map_ = new_map; + map_size_ = new_map_size; + begin_ = iterator(*begin + (begin_.cur - begin_.first), begin); + end_ = iterator(*(mid - 1) + (end_.cur - end_.first), mid - 1); +} + +// 重载比较操作符 +template +bool operator==(const deque& lhs, const deque& rhs) { + return lhs.size() == rhs.size() + && mystl::equal(lhs.begin(), lhs.end(), rhs.begin()); +} + +template +bool operator<(const deque& lhs, const deque& rhs) { + return mystl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), + rhs.end()); +} + +template +bool operator!=(const deque& lhs, const deque& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const deque& lhs, const deque& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const deque& lhs, const deque& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const deque& lhs, const deque& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(deque& lhs, deque& rhs) { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_DEQUE */ diff --git a/src/libcxx/include/exceptdef b/src/libcxx/include/exceptdef new file mode 100644 index 000000000..b6d18e133 --- /dev/null +++ b/src/libcxx/include/exceptdef @@ -0,0 +1,40 @@ + +/** + * @file exceptdef + * @brief stl exceptdef 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_EXCEPTDEF +#define SIMPLEKERNEL_EXCEPTDEF + +// #include + +#include "assert.h" + +namespace mystl { + +#define MYSTL_DEBUG(expr) assert(expr) + +#define THROW_LENGTH_ERROR_IF(expr, what) assert(!(expr)) +// if ((expr)) throw std::length_error(what) + +#define THROW_OUT_OF_RANGE_IF(expr, what) assert(!(expr)) +// if ((expr)) throw std::out_of_range(what) + +#define THROW_RUNTIME_ERROR_IF(expr, what) assert(!(expr)) +// if ((expr)) throw std::runtime_error(what) + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_EXCEPTDEF */ diff --git a/src/libcxx/include/functional b/src/libcxx/include/functional new file mode 100644 index 000000000..0aaac15f8 --- /dev/null +++ b/src/libcxx/include/functional @@ -0,0 +1,316 @@ + +/** + * @file functional + * @brief stl functional 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_FUNCTIONAL +#define SIMPLEKERNEL_FUNCTIONAL + +// 这个头文件包含了 std 的函数对象与哈希函数 + +#include "stddef.h" + +namespace mystl { + +// 定义一元函数的参数型别和返回值型别 +template +struct unarg_function { + typedef Arg argument_type; + typedef Result result_type; +}; + +// 定义二元函数的参数型别的返回值型别 +template +struct binary_function { + typedef Arg1 first_argument_type; + typedef Arg2 second_argument_type; + typedef Result result_type; +}; + +// 函数对象:加法 +template +struct plus : public binary_function { + T operator()(const T& x, const T& y) const { + return x + y; + } +}; + +// 函数对象:减法 +template +struct minus : public binary_function { + T operator()(const T& x, const T& y) const { + return x - y; + } +}; + +// 函数对象:乘法 +template +struct multiplies : public binary_function { + T operator()(const T& x, const T& y) const { + return x * y; + } +}; + +// 函数对象:除法 +template +struct divides : public binary_function { + T operator()(const T& x, const T& y) const { + return x / y; + } +}; + +// 函数对象:模取 +template +struct modulus : public binary_function { + T operator()(const T& x, const T& y) const { + return x % y; + } +}; + +// 函数对象:否定 +template +struct negate : public unarg_function { + T operator()(const T& x) const { + return -x; + } +}; + +// 加法的证同元素 +template +T identity_element(plus) { + return T(0); +} + +// 乘法的证同元素 +template +T identity_element(multiplies) { + return T(1); +} + +// 函数对象:等于 +template +struct equal_to : public binary_function { + bool operator()(const T& x, const T& y) const { + return x == y; + } +}; + +// 函数对象:不等于 +template +struct not_equal_to : public binary_function { + bool operator()(const T& x, const T& y) const { + return x != y; + } +}; + +// 函数对象:大于 +template +struct greater : public binary_function { + bool operator()(const T& x, const T& y) const { + return x > y; + } +}; + +// 函数对象:小于 +template +struct less : public binary_function { + bool operator()(const T& x, const T& y) const { + return x < y; + } +}; + +// 函数对象:大于等于 +template +struct greater_equal : public binary_function { + bool operator()(const T& x, const T& y) const { + return x >= y; + } +}; + +// 函数对象:小于等于 +template +struct less_equal : public binary_function { + bool operator()(const T& x, const T& y) const { + return x <= y; + } +}; + +// 函数对象:逻辑与 +template +struct logical_and : public binary_function { + bool operator()(const T& x, const T& y) const { + return x && y; + } +}; + +// 函数对象:逻辑或 +template +struct logical_or : public binary_function { + bool operator()(const T& x, const T& y) const { + return x || y; + } +}; + +// 函数对象:逻辑非 +template +struct logical_not : public unarg_function { + bool operator()(const T& x) const { + return !x; + } +}; + +// 证同函数:不会改变元素,返回本身 +template +struct identity : public unarg_function { + const T& operator()(const T& x) const { + return x; + } +}; + +// 选择函数:接受一个 pair,返回第一个元素 +template +struct selectfirst : public unarg_function { + const typename Pair::first_type& operator()(const Pair& x) const { + return x.first; + } +}; + +// 选择函数:接受一个 pair,返回第二个元素 +template +struct selectsecond : public unarg_function { + const typename Pair::second_type& operator()(const Pair& x) const { + return x.second; + } +}; + +// 投射函数:返回第一参数 +template +struct projectfirst : public binary_function { + Arg1 operator()(const Arg1& x, const Arg2&) const { + return x; + } +}; + +// 投射函数:返回第二参数 +template +struct projectsecond : public binary_function { + Arg2 operator()(const Arg1&, const Arg2& y) const { + return y; + } +}; + +/*****************************************************************************************/ +// 哈希函数对象 + +// 对于大部分类型,hash function 什么都不做 +template +struct hash { }; + +// 针对指针的偏特化版本 +template +struct hash { + size_t operator()(T* p) const noexcept { + return reinterpret_cast(p); + } +}; + +// 对于整型类型,只是返回原值 +#define MYSTL_TRIVIAL_HASH_FCN(Type) \ + template <> \ + struct hash { \ + size_t operator()(Type val) const noexcept { \ + return static_cast(val); \ + } \ + }; + +MYSTL_TRIVIAL_HASH_FCN(bool) + +MYSTL_TRIVIAL_HASH_FCN(char) + +MYSTL_TRIVIAL_HASH_FCN(signed char) + +MYSTL_TRIVIAL_HASH_FCN(unsigned char) + +MYSTL_TRIVIAL_HASH_FCN(wchar_t) + +MYSTL_TRIVIAL_HASH_FCN(char16_t) + +MYSTL_TRIVIAL_HASH_FCN(char32_t) + +MYSTL_TRIVIAL_HASH_FCN(short) + +MYSTL_TRIVIAL_HASH_FCN(unsigned short) + +MYSTL_TRIVIAL_HASH_FCN(int) + +MYSTL_TRIVIAL_HASH_FCN(unsigned int) + +MYSTL_TRIVIAL_HASH_FCN(long) + +MYSTL_TRIVIAL_HASH_FCN(unsigned long) + +MYSTL_TRIVIAL_HASH_FCN(long long) + +MYSTL_TRIVIAL_HASH_FCN(unsigned long long) + +#undef MYSTL_TRIVIAL_HASH_FCN + +// 对于浮点数,逐位哈希 +inline size_t bitwise_hash(const unsigned char* first, size_t count) { +#if (_MSC_VER && _WIN64) || ((__GNUC__ || __clang__) && __SIZEOF_POINTER__ == 8) + const size_t fnv_offset = 14695981039346656037ull; + const size_t fnv_prime = 1099511628211ull; +#else + const size_t fnv_offset = 2166136261u; + const size_t fnv_prime = 16777619u; +#endif + size_t result = fnv_offset; + for (size_t i = 0; i < count; ++i) { + result ^= (size_t)first[i]; + result *= fnv_prime; + } + return result; +} + +template <> +struct hash { + size_t operator()(const float& val) { + return val == 0.0f + ? 0 + : bitwise_hash((const unsigned char*)&val, sizeof(float)); + } +}; + +template <> +struct hash { + size_t operator()(const double& val) { + return val == 0.0f + ? 0 + : bitwise_hash((const unsigned char*)&val, sizeof(double)); + } +}; + +template <> +struct hash { + size_t operator()(const long double& val) { + return val == 0.0f + ? 0 + : bitwise_hash((const unsigned char*)&val, sizeof(long double)); + } +}; + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_FUNCTIONAL */ diff --git a/src/libcxx/include/hashtable b/src/libcxx/include/hashtable new file mode 100644 index 000000000..d4e5e9843 --- /dev/null +++ b/src/libcxx/include/hashtable @@ -0,0 +1,1655 @@ + +/** + * @file hashtable + * @brief stl hashtable 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_HASHTABLE +#define SIMPLEKERNEL_HASHTABLE + +// 这个头文件包含了一个模板类 hashtable +// hashtable : 哈希表,使用开链法处理冲突 + +#include "algo" +#include "exceptdef" +#include "functional" +#include "initializer_list" +#include "memory" +#include "util" +#include "vector" + +namespace mystl { + +// hashtable 的节点定义 +template +struct hashtable_node { + hashtable_node* next; // 指向下一个节点 + T value; // 储存实值 + + hashtable_node() = default; + + hashtable_node(const T& n) : next(nullptr), value(n) { + } + + hashtable_node(const hashtable_node& node) + : next(node.next), value(node.value) { + } + + hashtable_node(hashtable_node&& node) + : next(node.next), value(mystl::move(node.value)) { + node.next = nullptr; + } +}; + +// value traits +template +struct ht_value_traits_imp { + typedef T key_type; + typedef T mapped_type; + typedef T value_type; + + template + static const key_type& get_key(const Ty& value) { + return value; + } + + template + static const value_type& get_value(const Ty& value) { + return value; + } +}; + +template +struct ht_value_traits_imp { + typedef typename std::remove_cv::type key_type; + typedef typename T::second_type mapped_type; + typedef T value_type; + + template + static const key_type& get_key(const Ty& value) { + return value.first; + } + + template + static const value_type& get_value(const Ty& value) { + return value; + } +}; + +template +struct ht_value_traits { + static constexpr bool is_map = mystl::is_pair::value; + + typedef ht_value_traits_imp value_traits_type; + + typedef typename value_traits_type::key_type key_type; + typedef typename value_traits_type::mapped_type mapped_type; + typedef typename value_traits_type::value_type value_type; + + template + static const key_type& get_key(const Ty& value) { + return value_traits_type::get_key(value); + } + + template + static const value_type& get_value(const Ty& value) { + return value_traits_type::get_value(value); + } +}; + +// forward declaration + +template +class hashtable; + +template +struct ht_iterator; + +template +struct ht_const_iterator; + +template +struct ht_local_iterator; + +template +struct ht_const_local_iterator; + +// ht_iterator + +template +struct ht_iterator_base + : public mystl::iterator { + typedef mystl::hashtable hashtable; + typedef ht_iterator_base base; + typedef mystl::ht_iterator iterator; + typedef mystl::ht_const_iterator const_iterator; + typedef hashtable_node* node_ptr; + typedef hashtable* contain_ptr; + typedef const node_ptr const_node_ptr; + typedef const contain_ptr const_contain_ptr; + + typedef size_t size_type; + typedef ptrdiff_t difference_type; + + node_ptr node; // 迭代器当前所指节点 + contain_ptr ht; // 保持与容器的连结 + + ht_iterator_base() = default; + + bool operator==(const base& rhs) const { + return node == rhs.node; + } + + bool operator!=(const base& rhs) const { + return node != rhs.node; + } +}; + +template +struct ht_iterator : public ht_iterator_base { + typedef ht_iterator_base base; + typedef typename base::hashtable hashtable; + typedef typename base::iterator iterator; + typedef typename base::const_iterator const_iterator; + typedef typename base::node_ptr node_ptr; + typedef typename base::contain_ptr contain_ptr; + + typedef ht_value_traits value_traits; + typedef T value_type; + typedef value_type* pointer; + typedef value_type& reference; + + using base::ht; + using base::node; + + ht_iterator() = default; + + ht_iterator(node_ptr n, contain_ptr t) { + node = n; + ht = t; + } + + ht_iterator(const iterator& rhs) { + node = rhs.node; + ht = rhs.ht; + } + + ht_iterator(const const_iterator& rhs) { + node = rhs.node; + ht = rhs.ht; + } + + iterator& operator=(const iterator& rhs) { + if (this != &rhs) { + node = rhs.node; + ht = rhs.ht; + } + return *this; + } + + iterator& operator=(const const_iterator& rhs) { + if (this != &rhs) { + node = rhs.node; + ht = rhs.ht; + } + return *this; + } + + // 重载操作符 + reference operator*() const { + return node->value; + } + + pointer operator->() const { + return &(operator*()); + } + + iterator& operator++() { + MYSTL_DEBUG(node != nullptr); + const node_ptr old = node; + node = node->next; + if (node + == nullptr) { // 如果下一个位置为空,跳到下一个 bucket 的起始处 + auto index = ht->hash(value_traits::get_key(old->value)); + while (!node && ++index < ht->bucket_size_) { + node = ht->buckets_[index]; + } + } + return *this; + } + + iterator operator++(int) { + iterator tmp = *this; + ++*this; + return tmp; + } +}; + +template +struct ht_const_iterator : public ht_iterator_base { + typedef ht_iterator_base base; + typedef typename base::hashtable hashtable; + typedef typename base::iterator iterator; + typedef typename base::const_iterator const_iterator; + typedef typename base::const_node_ptr node_ptr; + typedef typename base::const_contain_ptr contain_ptr; + + typedef ht_value_traits value_traits; + typedef T value_type; + typedef const value_type* pointer; + typedef const value_type& reference; + + using base::ht; + using base::node; + + ht_const_iterator() = default; + + ht_const_iterator(node_ptr n, contain_ptr t) { + node = n; + ht = t; + } + + ht_const_iterator(const iterator& rhs) { + node = rhs.node; + ht = rhs.ht; + } + + ht_const_iterator(const const_iterator& rhs) { + node = rhs.node; + ht = rhs.ht; + } + + const_iterator& operator=(const iterator& rhs) { + if (this != &rhs) { + node = rhs.node; + ht = rhs.ht; + } + return *this; + } + + const_iterator& operator=(const const_iterator& rhs) { + if (this != &rhs) { + node = rhs.node; + ht = rhs.ht; + } + return *this; + } + + // 重载操作符 + reference operator*() const { + return node->value; + } + + pointer operator->() const { + return &(operator*()); + } + + const_iterator& operator++() { + MYSTL_DEBUG(node != nullptr); + const node_ptr old = node; + node = node->next; + if (node + == nullptr) { // 如果下一个位置为空,跳到下一个 bucket 的起始处 + auto index = ht->hash(value_traits::get_key(old->value)); + while (!node && ++index < ht->bucket_size_) { + node = ht->buckets_[index]; + } + } + return *this; + } + + const_iterator operator++(int) { + const_iterator tmp = *this; + ++*this; + return tmp; + } +}; + +// local iterator +template +struct ht_local_iterator + : public mystl::iterator { + typedef T value_type; + typedef value_type* pointer; + typedef value_type& reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef hashtable_node* node_ptr; + + typedef ht_local_iterator self; + typedef ht_local_iterator local_iterator; + typedef ht_const_local_iterator const_local_iterator; + node_ptr node; + + ht_local_iterator(node_ptr n) : node(n) { + } + + ht_local_iterator(const local_iterator& rhs) : node(rhs.node) { + } + + ht_local_iterator(const const_local_iterator& rhs) : node(rhs.node) { + } + + reference operator*() const { + return node->value; + } + + pointer operator->() const { + return &(operator*()); + } + + self& operator++() { + MYSTL_DEBUG(node != nullptr); + node = node->next; + return *this; + } + + self operator++(int) { + self tmp(*this); + ++*this; + return tmp; + } + + bool operator==(const self& other) const { + return node == other.node; + } + + bool operator!=(const self& other) const { + return node != other.node; + } +}; + +template +struct ht_const_local_iterator + : public mystl::iterator { + typedef T value_type; + typedef const value_type* pointer; + typedef const value_type& reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef const hashtable_node* node_ptr; + + typedef ht_const_local_iterator self; + typedef ht_local_iterator local_iterator; + typedef ht_const_local_iterator const_local_iterator; + + node_ptr node; + + ht_const_local_iterator(node_ptr n) : node(n) { + } + + ht_const_local_iterator(const local_iterator& rhs) : node(rhs.node) { + } + + ht_const_local_iterator(const const_local_iterator& rhs) : node(rhs.node) { + } + + reference operator*() const { + return node->value; + } + + pointer operator->() const { + return &(operator*()); + } + + self& operator++() { + MYSTL_DEBUG(node != nullptr); + node = node->next; + return *this; + } + + self operator++(int) { + self tmp(*this); + ++*this; + return tmp; + } + + bool operator==(const self& other) const { + return node == other.node; + } + + bool operator!=(const self& other) const { + return node != other.node; + } +}; + +// bucket 使用的大小 + +#if (_MSC_VER && _WIN64) || ((__GNUC__ || __clang__) && __SIZEOF_POINTER__ == 8) +# define SYSTEM_64 1 +#else +# define SYSTEM_32 1 +#endif + +#ifdef SYSTEM_64 + +# define PRIME_NUM 99 + +// 1. start with p = 101 +// 2. p = next_prime(p * 1.7) +// 3. if p < (2 << 63), go to step 2, otherwise, go to step 4 +// 4. end with p = prev_prime(2 << 63 - 1) +static constexpr size_t ht_prime_list[] = { 101ull, + 173ull, + 263ull, + 397ull, + 599ull, + 907ull, + 1361ull, + 2053ull, + 3083ull, + 4637ull, + 6959ull, + 10453ull, + 15683ull, + 23531ull, + 35311ull, + 52967ull, + 79451ull, + 119179ull, + 178781ull, + 268189ull, + 402299ull, + 603457ull, + 905189ull, + 1357787ull, + 2036687ull, + 3055043ull, + 4582577ull, + 6873871ull, + 10310819ull, + 15466229ull, + 23199347ull, + 34799021ull, + 52198537ull, + 78297827ull, + 117446801ull, + 176170229ull, + 264255353ull, + 396383041ull, + 594574583ull, + 891861923ull, + 1337792887ull, + 2006689337ull, + 3010034021ull, + 4515051137ull, + 6772576709ull, + 10158865069ull, + 15238297621ull, + 22857446471ull, + 34286169707ull, + 51429254599ull, + 77143881917ull, + 115715822899ull, + 173573734363ull, + 260360601547ull, + 390540902329ull, + 585811353559ull, + 878717030339ull, + 1318075545511ull, + 1977113318311ull, + 2965669977497ull, + 4448504966249ull, + 6672757449409ull, + 10009136174239ull, + 15013704261371ull, + 22520556392057ull, + 33780834588157ull, + 50671251882247ull, + 76006877823377ull, + 114010316735089ull, + 171015475102649ull, + 256523212653977ull, + 384784818980971ull, + 577177228471507ull, + 865765842707309ull, + 1298648764060979ull, + 1947973146091477ull, + 2921959719137273ull, + 4382939578705967ull, + 6574409368058969ull, + 9861614052088471ull, + 14792421078132871ull, + 22188631617199337ull, + 33282947425799017ull, + 49924421138698549ull, + 74886631708047827ull, + 112329947562071807ull, + 168494921343107851ull, + 252742382014661767ull, + 379113573021992729ull, + 568670359532989111ull, + 853005539299483657ull, + 1279508308949225477ull, + 1919262463423838231ull, + 2878893695135757317ull, + 4318340542703636011ull, + 6477510814055453699ull, + 9716266221083181299ull, + 14574399331624771603ull, + 18446744073709551557ull }; + +#else + +# define PRIME_NUM 44 + +// 1. start with p = 101 +// 2. p = next_prime(p * 1.7) +// 3. if p < (2 << 31), go to step 2, otherwise, go to step 4 +// 4. end with p = prev_prime(2 << 31 - 1) +static constexpr size_t ht_prime_list[] = { + 101u, 173u, 263u, 397u, 599u, 907u, + 1361u, 2053u, 3083u, 4637u, 6959u, 10453u, + 15683u, 23531u, 35311u, 52967u, 79451u, 119179u, + 178781u, 268189u, 402299u, 603457u, 905189u, 1357787u, + 2036687u, 3055043u, 4582577u, 6873871u, 10310819u, 15466229u, + 23199347u, 34799021u, 52198537u, 78297827u, 117446801u, 176170229u, + 264255353u, 396383041u, 594574583u, 891861923u, 1337792887u, 2006689337u, + 3010034021u, 4294967291u, +}; + +#endif + +// 找出最接近并大于等于 n 的那个质数 +inline size_t ht_next_prime(size_t n) { + const size_t* first = ht_prime_list; + const size_t* last = ht_prime_list + PRIME_NUM; + const size_t* pos = mystl::lower_bound(first, last, n); + return pos == last ? *(last - 1) : *pos; +} + +// 模板类 hashtable +// 参数一代表数据类型,参数二代表哈希函数,参数三代表键值相等的比较函数 +template +class hashtable { + friend struct mystl::ht_iterator; + friend struct mystl::ht_const_iterator; + +public: + // hashtable 的型别定义 + typedef ht_value_traits value_traits; + typedef typename value_traits::key_type key_type; + typedef typename value_traits::mapped_type mapped_type; + typedef typename value_traits::value_type value_type; + typedef Hash hasher; + typedef KeyEqual key_equal; + + typedef hashtable_node node_type; + typedef node_type* node_ptr; + typedef mystl::vector bucket_type; + + typedef mystl::allocator allocator_type; + typedef mystl::allocator data_allocator; + typedef mystl::allocator node_allocator; + + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + + typedef mystl::ht_iterator iterator; + typedef mystl::ht_const_iterator const_iterator; + typedef mystl::ht_local_iterator local_iterator; + typedef mystl::ht_const_local_iterator const_local_iterator; + + allocator_type get_allocator() const { + return allocator_type(); + } + +private: + // 用以下六个参数来表现 hashtable + bucket_type buckets_; + size_type bucket_size_; + size_type size_; + float mlf_; + hasher hash_; + key_equal equal_; + +private: + bool is_equal(const key_type& key1, const key_type& key2) { + return equal_(key1, key2); + } + + bool is_equal(const key_type& key1, const key_type& key2) const { + return equal_(key1, key2); + } + + const_iterator M_cit(node_ptr node) const noexcept { + return const_iterator(node, const_cast(this)); + } + + iterator M_begin() noexcept { + for (size_type n = 0; n < bucket_size_; ++n) { + if (buckets_[n]) { // 找到第一个有节点的位置就返回 + return iterator(buckets_[n], this); + } + } + return iterator(nullptr, this); + } + + const_iterator M_begin() const noexcept { + for (size_type n = 0; n < bucket_size_; ++n) { + if (buckets_[n]) { // 找到第一个有节点的位置就返回 + return M_cit(buckets_[n]); + } + } + return M_cit(nullptr); + } + +public: + // 构造、复制、移动、析构函数 + explicit hashtable(size_type bucket_count, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : size_(0), mlf_(1.0f), hash_(hash), equal_(equal) { + init(bucket_count); + } + + template ::value, int>::type + = 0> + hashtable(Iter first, Iter last, size_type bucket_count, + const Hash& hash = Hash(), const KeyEqual& equal = KeyEqual()) + : size_(mystl::distance(first, last)), + mlf_(1.0f), + hash_(hash), + equal_(equal) { + init(mystl::max(bucket_count, + static_cast(mystl::distance(first, last)))); + } + + hashtable(const hashtable& rhs) : hash_(rhs.hash_), equal_(rhs.equal_) { + copy_init(rhs); + } + + hashtable(hashtable&& rhs) noexcept + : bucket_size_(rhs.bucket_size_), + size_(rhs.size_), + mlf_(rhs.mlf_), + hash_(rhs.hash_), + equal_(rhs.equal_) { + buckets_ = mystl::move(rhs.buckets_); + rhs.bucket_size_ = 0; + rhs.size_ = 0; + rhs.mlf_ = 0.0f; + } + + hashtable& operator=(const hashtable& rhs); + hashtable& operator=(hashtable&& rhs) noexcept; + + ~hashtable() { + clear(); + } + + // 迭代器相关操作 + iterator begin() noexcept { + return M_begin(); + } + + const_iterator begin() const noexcept { + return M_begin(); + } + + iterator end() noexcept { + return iterator(nullptr, this); + } + + const_iterator end() const noexcept { + return M_cit(nullptr); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + // 容量相关操作 + bool empty() const noexcept { + return size_ == 0; + } + + size_type size() const noexcept { + return size_; + } + + size_type max_size() const noexcept { + return static_cast(-1); + } + + // 修改容器相关操作 + + // emplace / empalce_hint + + template + iterator emplace_multi(Args&&... args); + + template + pair emplace_unique(Args&&... args); + + // [note]: hint 对于 hash_table 其实没有意义,因为即使提供了 + // hint,也要做一次 hash, 来确保 hash_table 的性质,所以选择忽略它 + template + iterator emplace_multi_use_hint(const_iterator /*hint*/, Args&&... args) { + return emplace_multi(mystl::forward(args)...); + } + + template + iterator emplace_unique_use_hint(const_iterator /*hint*/, Args&&... args) { + return emplace_unique(mystl::forward(args)...).first; + } + + // insert + + iterator insert_multi_noresize(const value_type& value); + pair insert_unique_noresize(const value_type& value); + + iterator insert_multi(const value_type& value) { + rehash_if_need(1); + return insert_multi_noresize(value); + } + + iterator insert_multi(value_type&& value) { + return emplace_multi(mystl::move(value)); + } + + pair insert_unique(const value_type& value) { + rehash_if_need(1); + return insert_unique_noresize(value); + } + + pair insert_unique(value_type&& value) { + return emplace_unique(mystl::move(value)); + } + + // [note]: 同 emplace_hint + iterator + insert_multi_use_hint(const_iterator /*hint*/, const value_type& value) { + return insert_multi(value); + } + + iterator + insert_multi_use_hint(const_iterator /*hint*/, value_type&& value) { + return emplace_multi(mystl::move(value)); + } + + iterator + insert_unique_use_hint(const_iterator /*hint*/, const value_type& value) { + return insert_unique(value).first; + } + + iterator + insert_unique_use_hint(const_iterator /*hint*/, value_type&& value) { + return emplace_unique(mystl::move(value)); + } + + template + void insert_multi(InputIter first, InputIter last) { + copy_insert_multi(first, last, iterator_category(first)); + } + + template + void insert_unique(InputIter first, InputIter last) { + copy_insert_unique(first, last, iterator_category(first)); + } + + // erase / clear + + void erase(const_iterator position); + void erase(const_iterator first, const_iterator last); + + size_type erase_multi(const key_type& key); + size_type erase_unique(const key_type& key); + + void clear(); + + void swap(hashtable& rhs) noexcept; + + // 查找相关操作 + + size_type count(const key_type& key) const; + + iterator find(const key_type& key); + const_iterator find(const key_type& key) const; + + pair equal_range_multi(const key_type& key); + pair + equal_range_multi(const key_type& key) const; + + pair equal_range_unique(const key_type& key); + pair + equal_range_unique(const key_type& key) const; + + // bucket interface + + local_iterator begin(size_type n) noexcept { + MYSTL_DEBUG(n < size_); + return buckets_[n]; + } + + const_local_iterator begin(size_type n) const noexcept { + MYSTL_DEBUG(n < size_); + return buckets_[n]; + } + + const_local_iterator cbegin(size_type n) const noexcept { + MYSTL_DEBUG(n < size_); + return buckets_[n]; + } + + local_iterator end(size_type n) noexcept { + MYSTL_DEBUG(n < size_); + return nullptr; + } + + const_local_iterator end(size_type n) const noexcept { + MYSTL_DEBUG(n < size_); + return nullptr; + } + + const_local_iterator cend(size_type n) const noexcept { + MYSTL_DEBUG(n < size_); + return nullptr; + } + + size_type bucket_count() const noexcept { + return bucket_size_; + } + + size_type max_bucket_count() const noexcept { + return ht_prime_list[PRIME_NUM - 1]; + } + + size_type bucket_size(size_type n) const noexcept; + + size_type bucket(const key_type& key) const { + return hash(key); + } + + // hash policy + + float load_factor() const noexcept { + return bucket_size_ != 0 ? (float)size_ / bucket_size_ : 0.0f; + } + + float max_load_factor() const noexcept { + return mlf_; + } + + void max_load_factor(float ml) { + THROW_OUT_OF_RANGE_IF(ml != ml || ml < 0, "invalid hash load factor"); + mlf_ = ml; + } + + void rehash(size_type count); + + void reserve(size_type count) { + rehash(static_cast((float)count / max_load_factor() + 0.5f)); + } + + hasher hash_fcn() const { + return hash_; + } + + key_equal key_eq() const { + return equal_; + } + +private: + // hashtable 成员函数 + + // init + void init(size_type n); + void copy_init(const hashtable& ht); + + // node + template + node_ptr create_node(Args&&... args); + void destroy_node(node_ptr n); + + // hash + size_type next_size(size_type n) const; + size_type hash(const key_type& key, size_type n) const; + size_type hash(const key_type& key) const; + void rehash_if_need(size_type n); + + // insert + template + void copy_insert_multi(InputIter first, InputIter last, + mystl::input_iterator_tag); + template + void copy_insert_multi(ForwardIter first, ForwardIter last, + mystl::forward_iterator_tag); + template + void copy_insert_unique(InputIter first, InputIter last, + mystl::input_iterator_tag); + template + void copy_insert_unique(ForwardIter first, ForwardIter last, + mystl::forward_iterator_tag); + + // insert node + pair insert_node_unique(node_ptr np); + iterator insert_node_multi(node_ptr np); + + // bucket operator + void replace_bucket(size_type bucket_count); + void erase_bucket(size_type n, node_ptr first, node_ptr last); + void erase_bucket(size_type n, node_ptr last); + + // comparision + bool equal_to_multi(const hashtable& other); + bool equal_to_unique(const hashtable& other); +}; + +/*****************************************************************************************/ + +// 复制赋值运算符 +template +hashtable& +hashtable::operator=(const hashtable& rhs) { + if (this != &rhs) { + hashtable tmp(rhs); + swap(tmp); + } + return *this; +} + +// 移动赋值运算符 +template +hashtable& +hashtable::operator=(hashtable&& rhs) noexcept { + hashtable tmp(mystl::move(rhs)); + swap(tmp); + return *this; +} + +// 就地构造元素,键值允许重复 +// 强异常安全保证 +template +template +typename hashtable::iterator +hashtable::emplace_multi(Args&&... args) { + auto np = create_node(mystl::forward(args)...); + try { + if ((float)(size_ + 1) > (float)bucket_size_ * max_load_factor()) { + rehash(size_ + 1); + } + } catch (...) { + destroy_node(np); + throw; + } + return insert_node_multi(np); +} + +// 就地构造元素,键值允许重复 +// 强异常安全保证 +template +template +pair::iterator, bool> +hashtable::emplace_unique(Args&&... args) { + auto np = create_node(mystl::forward(args)...); + try { + if ((float)(size_ + 1) > (float)bucket_size_ * max_load_factor()) { + rehash(size_ + 1); + } + } catch (...) { + destroy_node(np); + throw; + } + return insert_node_unique(np); +} + +// 在不需要重建表格的情况下插入新节点,键值不允许重复 +template +pair::iterator, bool> +hashtable::insert_unique_noresize(const value_type& value) { + const auto n = hash(value_traits::get_key(value)); + auto first = buckets_[n]; + for (auto cur = first; cur; cur = cur->next) { + if (is_equal(value_traits::get_key(cur->value), + value_traits::get_key(value))) { + return mystl::make_pair(iterator(cur, this), false); + } + } + // 让新节点成为链表的第一个节点 + auto tmp = create_node(value); + tmp->next = first; + buckets_[n] = tmp; + ++size_; + return mystl::make_pair(iterator(tmp, this), true); +} + +// 在不需要重建表格的情况下插入新节点,键值允许重复 +template +typename hashtable::iterator +hashtable::insert_multi_noresize(const value_type& value) { + const auto n = hash(value_traits::get_key(value)); + auto first = buckets_[n]; + auto tmp = create_node(value); + for (auto cur = first; cur; cur = cur->next) { + if ( + is_equal( + value_traits::get_key(cur->value), + value_traits::get_key( + value))) { // 如果链表中存在相同键值的节点就马上插入,然后返回 + tmp->next = cur->next; + cur->next = tmp; + ++size_; + return iterator(tmp, this); + } + } + // 否则插入在链表头部 + tmp->next = first; + buckets_[n] = tmp; + ++size_; + return iterator(tmp, this); +} + +// 删除迭代器所指的节点 +template +void hashtable::erase(const_iterator position) { + auto p = position.node; + if (p) { + const auto n = hash(value_traits::get_key(p->value)); + auto cur = buckets_[n]; + if (cur == p) { // p 位于链表头部 + buckets_[n] = cur->next; + destroy_node(cur); + --size_; + } + else { + auto next = cur->next; + while (next) { + if (next == p) { + cur->next = next->next; + destroy_node(next); + --size_; + break; + } + else { + cur = next; + next = cur->next; + } + } + } + } +} + +// 删除[first, last)内的节点 +template +void hashtable::erase(const_iterator first, + const_iterator last) { + if (first.node == last.node) { + return; + } + auto first_bucket = first.node + ? hash(value_traits::get_key(first.node->value)) + : bucket_size_; + auto last_bucket = last.node ? hash(value_traits::get_key(last.node->value)) + : bucket_size_; + if (first_bucket == last_bucket) { // 如果在 bucket 在同一个位置 + erase_bucket(first_bucket, first.node, last.node); + } + else { + erase_bucket(first_bucket, first.node, nullptr); + for (auto n = first_bucket + 1; n < last_bucket; ++n) { + if (buckets_[n] != nullptr) { + erase_bucket(n, nullptr); + } + } + if (last_bucket != bucket_size_) { + erase_bucket(last_bucket, last.node); + } + } +} + +// 删除键值为 key 的节点 +template +typename hashtable::size_type +hashtable::erase_multi(const key_type& key) { + auto p = equal_range_multi(key); + if (p.first.node != nullptr) { + erase(p.first, p.second); + return mystl::distance(p.first, p.second); + } + return 0; +} + +template +typename hashtable::size_type +hashtable::erase_unique(const key_type& key) { + const auto n = hash(key); + auto first = buckets_[n]; + if (first) { + if (is_equal(value_traits::get_key(first->value), key)) { + buckets_[n] = first->next; + destroy_node(first); + --size_; + return 1; + } + else { + auto next = first->next; + while (next) { + if (is_equal(value_traits::get_key(next->value), key)) { + first->next = next->next; + destroy_node(next); + --size_; + return 1; + } + first = next; + next = first->next; + } + } + } + return 0; +} + +// 清空 hashtable +template +void hashtable::clear() { + if (size_ != 0) { + for (size_type i = 0; i < bucket_size_; ++i) { + node_ptr cur = buckets_[i]; + while (cur != nullptr) { + node_ptr next = cur->next; + destroy_node(cur); + cur = next; + } + buckets_[i] = nullptr; + } + size_ = 0; + } +} + +// 在某个 bucket 节点的个数 +template +typename hashtable::size_type +hashtable::bucket_size(size_type n) const noexcept { + size_type result = 0; + for (auto cur = buckets_[n]; cur; cur = cur->next) { + ++result; + } + return result; +} + +// 重新对元素进行一遍哈希,插入到新的位置 +template +void hashtable::rehash(size_type count) { + auto n = ht_next_prime(count); + if (n > bucket_size_) { + replace_bucket(n); + } + else { + if ((float)size_ / (float)n < max_load_factor() - 0.25f + && (float)n < (float)bucket_size_ * 0.75) // worth rehash + { + replace_bucket(n); + } + } +} + +// 查找键值为 key 的节点,返回其迭代器 +template +typename hashtable::iterator +hashtable::find(const key_type& key) { + const auto n = hash(key); + node_ptr first = buckets_[n]; + for (; first && !is_equal(value_traits::get_key(first->value), key); + first = first->next) { + } + return iterator(first, this); +} + +template +typename hashtable::const_iterator +hashtable::find(const key_type& key) const { + const auto n = hash(key); + node_ptr first = buckets_[n]; + for (; first && !is_equal(value_traits::get_key(first->value), key); + first = first->next) { + } + return M_cit(first); +} + +// 查找键值为 key 出现的次数 +template +typename hashtable::size_type +hashtable::count(const key_type& key) const { + const auto n = hash(key); + size_type result = 0; + for (node_ptr cur = buckets_[n]; cur; cur = cur->next) { + if (is_equal(value_traits::get_key(cur->value), key)) { + ++result; + } + } + return result; +} + +// 查找与键值 key 相等的区间,返回一个 pair,指向相等区间的首尾 +template +pair::iterator, + typename hashtable::iterator> +hashtable::equal_range_multi(const key_type& key) { + const auto n = hash(key); + for (node_ptr first = buckets_[n]; first; first = first->next) { + if (is_equal(value_traits::get_key(first->value), + key)) { // 如果出现相等的键值 + for (node_ptr second = first->next; second; second = second->next) { + if (!is_equal(value_traits::get_key(second->value), key)) { + return mystl::make_pair(iterator(first, this), + iterator(second, this)); + } + } + for (auto m = n + 1; m < bucket_size_; + ++m) { // 整个链表都相等,查找下一个链表出现的位置 + if (buckets_[m]) { + return mystl::make_pair(iterator(first, this), + iterator(buckets_[m], this)); + } + } + return mystl::make_pair(iterator(first, this), end()); + } + } + return mystl::make_pair(end(), end()); +} + +template +pair::const_iterator, + typename hashtable::const_iterator> +hashtable::equal_range_multi(const key_type& key) const { + const auto n = hash(key); + for (node_ptr first = buckets_[n]; first; first = first->next) { + if (is_equal(value_traits::get_key(first->value), key)) { + for (node_ptr second = first->next; second; second = second->next) { + if (!is_equal(value_traits::get_key(second->value), key)) { + return mystl::make_pair(M_cit(first), M_cit(second)); + } + } + for (auto m = n + 1; m < bucket_size_; + ++m) { // 整个链表都相等,查找下一个链表出现的位置 + if (buckets_[m]) { + return mystl::make_pair(M_cit(first), M_cit(buckets_[m])); + } + } + return mystl::make_pair(M_cit(first), cend()); + } + } + return mystl::make_pair(cend(), cend()); +} + +template +pair::iterator, + typename hashtable::iterator> +hashtable::equal_range_unique(const key_type& key) { + const auto n = hash(key); + for (node_ptr first = buckets_[n]; first; first = first->next) { + if (is_equal(value_traits::get_key(first->value), key)) { + if (first->next) { + return mystl::make_pair(iterator(first, this), + iterator(first->next, this)); + } + for (auto m = n + 1; m < bucket_size_; + ++m) { // 整个链表都相等,查找下一个链表出现的位置 + if (buckets_[m]) { + return mystl::make_pair(iterator(first, this), + iterator(buckets_[m], this)); + } + } + return mystl::make_pair(iterator(first, this), end()); + } + } + return mystl::make_pair(end(), end()); +} + +template +pair::const_iterator, + typename hashtable::const_iterator> +hashtable::equal_range_unique(const key_type& key) const { + const auto n = hash(key); + for (node_ptr first = buckets_[n]; first; first = first->next) { + if (is_equal(value_traits::get_key(first->value), key)) { + if (first->next) { + return mystl::make_pair(M_cit(first), M_cit(first->next)); + } + for (auto m = n + 1; m < bucket_size_; + ++m) { // 整个链表都相等,查找下一个链表出现的位置 + if (buckets_[m]) { + return mystl::make_pair(M_cit(first), M_cit(buckets_[m])); + } + } + return mystl::make_pair(M_cit(first), cend()); + } + } + return mystl::make_pair(cend(), cend()); +} + +// 交换 hashtable +template +void hashtable::swap(hashtable& rhs) noexcept { + if (this != &rhs) { + buckets_.swap(rhs.buckets_); + mystl::swap(bucket_size_, rhs.bucket_size_); + mystl::swap(size_, rhs.size_); + mystl::swap(mlf_, rhs.mlf_); + mystl::swap(hash_, rhs.hash_); + mystl::swap(equal_, rhs.equal_); + } +} + +/****************************************************************************************/ +// helper function + +// init 函数 +template +void hashtable::init(size_type n) { + const auto bucket_nums = next_size(n); + try { + buckets_.reserve(bucket_nums); + buckets_.assign(bucket_nums, nullptr); + } catch (...) { + bucket_size_ = 0; + size_ = 0; + throw; + } + bucket_size_ = buckets_.size(); +} + +// copy_init 函数 +template +void hashtable::copy_init(const hashtable& ht) { + bucket_size_ = 0; + buckets_.reserve(ht.bucket_size_); + buckets_.assign(ht.bucket_size_, nullptr); + try { + for (size_type i = 0; i < ht.bucket_size_; ++i) { + node_ptr cur = ht.buckets_[i]; + if (cur) { // 如果某 bucket 存在链表 + auto copy = create_node(cur->value); + buckets_[i] = copy; + for (auto next = cur->next; next; + cur = next, next = cur->next) { // 复制链表 + copy->next = create_node(next->value); + copy = copy->next; + } + copy->next = nullptr; + } + } + bucket_size_ = ht.bucket_size_; + mlf_ = ht.mlf_; + size_ = ht.size_; + } catch (...) { + clear(); + } +} + +// create_node 函数 +template +template +typename hashtable::node_ptr +hashtable::create_node(Args&&... args) { + node_ptr tmp = node_allocator::allocate(1); + try { + data_allocator::construct(mystl::address_of(tmp->value), + mystl::forward(args)...); + tmp->next = nullptr; + } catch (...) { + node_allocator::deallocate(tmp); + throw; + } + return tmp; +} + +// destroy_node 函数 +template +void hashtable::destroy_node(node_ptr node) { + data_allocator::destroy(mystl::address_of(node->value)); + node_allocator::deallocate(node); + node = nullptr; +} + +// next_size 函数 +template +typename hashtable::size_type +hashtable::next_size(size_type n) const { + return ht_next_prime(n); +} + +// hash 函数 +template +typename hashtable::size_type +hashtable::hash(const key_type& key, size_type n) const { + return hash_(key) % n; +} + +template +typename hashtable::size_type +hashtable::hash(const key_type& key) const { + return hash_(key) % bucket_size_; +} + +// rehash_if_need 函数 +template +void hashtable::rehash_if_need(size_type n) { + if (static_cast(size_ + n) + > (float)bucket_size_ * max_load_factor()) { + rehash(size_ + n); + } +} + +// copy_insert +template +template +void hashtable::copy_insert_multi( + InputIter first, InputIter last, mystl::input_iterator_tag) { + rehash_if_need(mystl::distance(first, last)); + for (; first != last; ++first) { + insert_multi_noresize(*first); + } +} + +template +template +void hashtable::copy_insert_multi( + ForwardIter first, ForwardIter last, mystl::forward_iterator_tag) { + size_type n = mystl::distance(first, last); + rehash_if_need(n); + for (; n > 0; --n, ++first) { + insert_multi_noresize(*first); + } +} + +template +template +void hashtable::copy_insert_unique( + InputIter first, InputIter last, mystl::input_iterator_tag) { + rehash_if_need(mystl::distance(first, last)); + for (; first != last; ++first) { + insert_unique_noresize(*first); + } +} + +template +template +void hashtable::copy_insert_unique( + ForwardIter first, ForwardIter last, mystl::forward_iterator_tag) { + size_type n = mystl::distance(first, last); + rehash_if_need(n); + for (; n > 0; --n, ++first) { + insert_unique_noresize(*first); + } +} + +// insert_node 函数 +template +typename hashtable::iterator +hashtable::insert_node_multi(node_ptr np) { + const auto n = hash(value_traits::get_key(np->value)); + auto cur = buckets_[n]; + if (cur == nullptr) { + buckets_[n] = np; + ++size_; + return iterator(np, this); + } + for (; cur; cur = cur->next) { + if (is_equal(value_traits::get_key(cur->value), + value_traits::get_key(np->value))) { + np->next = cur->next; + cur->next = np; + ++size_; + return iterator(np, this); + } + } + np->next = buckets_[n]; + buckets_[n] = np; + ++size_; + return iterator(np, this); +} + +// insert_node_unique 函数 +template +pair::iterator, bool> +hashtable::insert_node_unique(node_ptr np) { + const auto n = hash(value_traits::get_key(np->value)); + auto cur = buckets_[n]; + if (cur == nullptr) { + buckets_[n] = np; + ++size_; + return mystl::make_pair(iterator(np, this), true); + } + for (; cur; cur = cur->next) { + if (is_equal(value_traits::get_key(cur->value), + value_traits::get_key(np->value))) { + return mystl::make_pair(iterator(cur, this), false); + } + } + np->next = buckets_[n]; + buckets_[n] = np; + ++size_; + return mystl::make_pair(iterator(np, this), true); +} + +// replace_bucket 函数 +template +void hashtable::replace_bucket(size_type bucket_count) { + bucket_type bucket(bucket_count); + if (size_ != 0) { + for (size_type i = 0; i < bucket_size_; ++i) { + for (auto first = buckets_[i]; first; first = first->next) { + auto tmp = create_node(first->value); + const auto n + = hash(value_traits::get_key(first->value), bucket_count); + auto f = bucket[n]; + bool is_inserted = false; + for (auto cur = f; cur; cur = cur->next) { + if (is_equal(value_traits::get_key(cur->value), + value_traits::get_key(first->value))) { + tmp->next = cur->next; + cur->next = tmp; + is_inserted = true; + break; + } + } + if (!is_inserted) { + tmp->next = f; + bucket[n] = tmp; + } + } + } + } + buckets_.swap(bucket); + bucket_size_ = buckets_.size(); +} + +// erase_bucket 函数 +// 在第 n 个 bucket 内,删除 [first, last) 的节点 +template +void hashtable::erase_bucket(size_type n, node_ptr first, + node_ptr last) { + auto cur = buckets_[n]; + if (cur == first) { + erase_bucket(n, last); + } + else { + node_ptr next = cur->next; + for (; next != first; cur = next, next = cur->next) { + } + while (next != last) { + cur->next = next->next; + destroy_node(next); + next = cur->next; + --size_; + } + } +} + +// erase_bucket 函数 +// 在第 n 个 bucket 内,删除 [buckets_[n], last) 的节点 +template +void hashtable::erase_bucket(size_type n, node_ptr last) { + auto cur = buckets_[n]; + while (cur != last) { + auto next = cur->next; + destroy_node(cur); + cur = next; + --size_; + } + buckets_[n] = last; +} + +// equal_to 函数 +template +bool hashtable::equal_to_multi(const hashtable& other) { + if (size_ != other.size_) { + return false; + } + for (auto f = begin(), l = end(); f != l;) { + auto p1 = equal_range_multi(value_traits::get_key(*f)); + auto p2 = other.equal_range_multi(value_traits::get_key(*f)); + if (mystl::distance(p1.first, p1.last) + != mystl::distance(p2.first, p2.last) + || !mystl::is_permutation(p1.first, p2.last, p2.first, p2.last)) { + return false; + } + f = p1.last; + } + return true; +} + +template +bool hashtable::equal_to_unique(const hashtable& other) { + if (size_ != other.size_) { + return false; + } + for (auto f = begin(), l = end(); f != l; ++f) { + auto res = other.find(value_traits::get_key(*f)); + if (res.node == nullptr || *res != *f) { + return false; + } + } + return true; +} + +// 重载 mystl 的 swap +template +void swap(hashtable& lhs, + hashtable& rhs) noexcept { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_HASHTABLE */ diff --git a/src/libcxx/include/heap_algo b/src/libcxx/include/heap_algo new file mode 100644 index 000000000..ed9bdbb1c --- /dev/null +++ b/src/libcxx/include/heap_algo @@ -0,0 +1,233 @@ + +/** + * @file heap_algo + * @brief stl heap_algo 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_HEAP_ALGO +#define SIMPLEKERNEL_HEAP_ALGO + +// 这个头文件包含 heap 的四个算法 : push_heap, pop_heap, sort_heap, make_heap + +#include "iterator" + +namespace mystl { + +/*****************************************************************************************/ +// push_heap +// 该函数接受两个迭代器,表示一个 heap +// 容器的首尾,并且新元素已经插入到底部容器的最尾端,调整 heap +/*****************************************************************************************/ +template +void push_heap_aux(RandomIter first, Distance holeIndex, Distance topIndex, + T value) { + auto parent = (holeIndex - 1) / 2; + while (holeIndex > topIndex && *(first + parent) < value) { + // 使用 operator<,所以 heap 为 max-heap + *(first + holeIndex) = *(first + parent); + holeIndex = parent; + parent = (holeIndex - 1) / 2; + } + *(first + holeIndex) = value; +} + +template +void push_heap_d(RandomIter first, RandomIter last, Distance*) { + mystl::push_heap_aux(first, (last - first) - 1, static_cast(0), + *(last - 1)); +} + +template +void push_heap(RandomIter first, + RandomIter last) { // 新元素应该已置于底部容器的最尾端 + mystl::push_heap_d(first, last, distance_type(first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +void push_heap_aux(RandomIter first, Distance holeIndex, Distance topIndex, + T value, Compared comp) { + auto parent = (holeIndex - 1) / 2; + while (holeIndex > topIndex && comp(*(first + parent), value)) { + *(first + holeIndex) = *(first + parent); + holeIndex = parent; + parent = (holeIndex - 1) / 2; + } + *(first + holeIndex) = value; +} + +template +void push_heap_d(RandomIter first, RandomIter last, Distance*, Compared comp) { + mystl::push_heap_aux(first, (last - first) - 1, static_cast(0), + *(last - 1), comp); +} + +template +void push_heap(RandomIter first, RandomIter last, Compared comp) { + mystl::push_heap_d(first, last, distance_type(first), comp); +} + +/*****************************************************************************************/ +// pop_heap +// 该函数接受两个迭代器,表示 heap 容器的首尾,将 heap +// 的根节点取出放到容器尾部,调整 heap +/*****************************************************************************************/ +template +void adjust_heap(RandomIter first, Distance holeIndex, Distance len, T value) { + // 先进行下溯(percolate down)过程 + auto topIndex = holeIndex; + auto rchild = 2 * holeIndex + 2; + while (rchild < len) { + if (*(first + rchild) < *(first + rchild - 1)) { + --rchild; + } + *(first + holeIndex) = *(first + rchild); + holeIndex = rchild; + rchild = 2 * (rchild + 1); + } + if (rchild == len) { // 如果没有右子节点 + *(first + holeIndex) = *(first + (rchild - 1)); + holeIndex = rchild - 1; + } + // 再执行一次上溯(percolate up)过程 + mystl::push_heap_aux(first, holeIndex, topIndex, value); +} + +template +void pop_heap_aux(RandomIter first, RandomIter last, RandomIter result, T value, + Distance*) { + // 先将首值调至尾节点,然后调整[first, last - 1)使之重新成为一个 + // max-heap + *result = *first; + mystl::adjust_heap(first, static_cast(0), last - first, value); +} + +template +void pop_heap(RandomIter first, RandomIter last) { + mystl::pop_heap_aux(first, last - 1, last - 1, *(last - 1), + distance_type(first)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +void adjust_heap(RandomIter first, Distance holeIndex, Distance len, T value, + Compared comp) { + // 先进行下溯(percolate down)过程 + auto topIndex = holeIndex; + auto rchild = 2 * holeIndex + 2; + while (rchild < len) { + if (comp(*(first + rchild), *(first + rchild - 1))) { + --rchild; + } + *(first + holeIndex) = *(first + rchild); + holeIndex = rchild; + rchild = 2 * (rchild + 1); + } + if (rchild == len) { + *(first + holeIndex) = *(first + (rchild - 1)); + holeIndex = rchild - 1; + } + // 再执行一次上溯(percolate up)过程 + mystl::push_heap_aux(first, holeIndex, topIndex, value, comp); +} + +template +void pop_heap_aux(RandomIter first, RandomIter last, RandomIter result, T value, + Distance*, Compared comp) { + *result = *first; // 先将尾指设置成首值,即尾指为欲求结果 + mystl::adjust_heap(first, static_cast(0), last - first, value, + comp); +} + +template +void pop_heap(RandomIter first, RandomIter last, Compared comp) { + mystl::pop_heap_aux(first, last - 1, last - 1, *(last - 1), + distance_type(first), comp); +} + +/*****************************************************************************************/ +// sort_heap +// 该函数接受两个迭代器,表示 heap 容器的首尾,不断执行 pop_heap +// 操作,直到首尾最多相差1 +/*****************************************************************************************/ +template +void sort_heap(RandomIter first, RandomIter last) { + // 每执行一次 + // pop_heap,最大的元素都被放到尾部,直到容器最多只有一个元素,完成排序 + while (last - first > 1) { + mystl::pop_heap(first, last--); + } +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +void sort_heap(RandomIter first, RandomIter last, Compared comp) { + while (last - first > 1) { + mystl::pop_heap(first, last--, comp); + } +} + +/*****************************************************************************************/ +// make_heap +// 该函数接受两个迭代器,表示 heap 容器的首尾,把容器内的数据变为一个 heap +/*****************************************************************************************/ +template +void make_heap_aux(RandomIter first, RandomIter last, Distance*) { + if (last - first < 2) { + return; + } + auto len = last - first; + auto holeIndex = (len - 2) / 2; + while (true) { + // 重排以 holeIndex 为首的子树 + mystl::adjust_heap(first, holeIndex, len, *(first + holeIndex)); + if (holeIndex == 0) { + return; + } + holeIndex--; + } +} + +template +void make_heap(RandomIter first, RandomIter last) { + mystl::make_heap_aux(first, last, distance_type(first)); + ; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +void make_heap_aux(RandomIter first, RandomIter last, Distance*, + Compared comp) { + if (last - first < 2) { + return; + } + auto len = last - first; + auto holeIndex = (len - 2) / 2; + while (true) { + // 重排以 holeIndex 为首的子树 + mystl::adjust_heap(first, holeIndex, len, *(first + holeIndex), comp); + if (holeIndex == 0) { + return; + } + holeIndex--; + } +} + +template +void make_heap(RandomIter first, RandomIter last, Compared comp) { + mystl::make_heap_aux(first, last, distance_type(first), comp); +} +}; // namespace mystl + +#endif /* SIMPLEKERNEL_HEAP_ALGO */ diff --git a/src/libcxx/include/initializer_list b/src/libcxx/include/initializer_list new file mode 100644 index 000000000..f6306ca51 --- /dev/null +++ b/src/libcxx/include/initializer_list @@ -0,0 +1,91 @@ + +/** + * @file initializer_list + * @brief stl initializer_list 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +/** @file initializer_list + * This is a Standard C++ Library header. + */ + +#ifndef SIMPLEKERNEL_INITIALIZER_LIST +#define SIMPLEKERNEL_INITIALIZER_LIST + +#include "cstddef" + +namespace std { +/// initializer_list +template +class initializer_list { +public: + typedef _E value_type; + typedef const _E& reference; + typedef const _E& const_reference; + typedef size_t size_type; + typedef const _E* iterator; + typedef const _E* const_iterator; + +private: + iterator _M_array; + size_type _M_len; + + // The compiler can call a private constructor. + constexpr initializer_list(const_iterator __a, size_type __l) + : _M_array(__a), _M_len(__l) { + } + +public: + constexpr initializer_list() noexcept : _M_array(0), _M_len(0) { + } + + // Number of elements. + constexpr size_type size() const noexcept { + return _M_len; + } + + // First element. + constexpr const_iterator begin() const noexcept { + return _M_array; + } + + // One past the last element. + constexpr const_iterator end() const noexcept { + return begin() + size(); + } +}; + +/** + * @brief Return an iterator pointing to the first element of + * the initializer_list. + * @param __ils Initializer list. + * @relates initializer_list + */ +template +constexpr const _Tp* begin(initializer_list<_Tp> __ils) noexcept { + return __ils.begin(); +} + +/** + * @brief Return an iterator pointing to one past the last element + * of the initializer_list. + * @param __ils Initializer list. + * @relates initializer_list + */ +template +constexpr const _Tp* end(initializer_list<_Tp> __ils) noexcept { + return __ils.end(); +} +}; // namespace std + +#endif /* SIMPLEKERNEL_INITIALIZER_LIST */ diff --git a/src/libcxx/include/iostream b/src/libcxx/include/iostream new file mode 100755 index 000000000..9a8172947 --- /dev/null +++ b/src/libcxx/include/iostream @@ -0,0 +1,53 @@ + +/** + * @file iostream + * @brief C++ 输入输出 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/MRNIU/MiniCRT + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_IOSTREAM +#define SIMPLEKERNEL_IOSTREAM + +#include "cstdint" + +namespace std { +class ostream { +private: + +protected: + ostream(const ostream& lhs); + +public: + enum openmode : uint8_t { + in = 1, + out = 2, + binary = 4, + trunc = 8, + }; + + ostream(void); + ~ostream(void); + ostream& operator<<(char c); + ostream& operator<<(int n); + ostream& operator<<(const char* lhs); + ostream& operator<<(ostream& (*)(ostream&)); +}; + +inline ostream& endl(ostream& lhs) { + return lhs << '\n'; +} + +static ostream cout; +}; // namespace std + +#endif /* SIMPLEKERNEL_IOSTREAM */ diff --git a/src/libcxx/include/iterator b/src/libcxx/include/iterator new file mode 100644 index 000000000..e26df2118 --- /dev/null +++ b/src/libcxx/include/iterator @@ -0,0 +1,377 @@ + +/** + * @file iterator + * @brief stl iterator 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_ITERATOR +#define SIMPLEKERNEL_ITERATOR + +// 这个头文件用于迭代器设计,包含了一些模板结构体与全局函数, + +#include "stddef.h" +#include "type_traits.h" + +namespace mystl { + +// 五种迭代器类型 +struct input_iterator_tag { }; + +struct output_iterator_tag { }; + +struct forward_iterator_tag : public input_iterator_tag { }; + +struct bidirectional_iterator_tag : public forward_iterator_tag { }; + +struct random_access_iterator_tag : public bidirectional_iterator_tag { }; + +// iterator 模板 +template +struct iterator { + typedef Category iterator_category; + typedef T value_type; + typedef Pointer pointer; + typedef Reference reference; + typedef Distance difference_type; +}; + +// iterator traits + +template +struct has_iterator_cat { +private: + struct two { + char a; + char b; + }; + template + static two test(...); + template + static char test(typename U::iterator_category* = 0); + +public: + static const bool value = sizeof(test(0)) == sizeof(char); +}; + +template +struct iterator_traits_impl { }; + +template +struct iterator_traits_impl { + typedef typename Iterator::iterator_category iterator_category; + typedef typename Iterator::value_type value_type; + typedef typename Iterator::pointer pointer; + typedef typename Iterator::reference reference; + typedef typename Iterator::difference_type difference_type; +}; + +template +struct iterator_traits_helper { }; + +template +struct iterator_traits_helper + : public iterator_traits_impl< + Iterator, std::is_convertible::value + || std::is_convertible::value> { }; + +// 萃取迭代器的特性 +template +struct iterator_traits + : public iterator_traits_helper::value> { }; + +// 针对原生指针的偏特化版本 +template +struct iterator_traits { + typedef random_access_iterator_tag iterator_category; + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef ptrdiff_t difference_type; +}; + +template +struct iterator_traits { + typedef random_access_iterator_tag iterator_category; + typedef T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef ptrdiff_t difference_type; +}; + +template >::value> +struct has_iterator_cat_of + : public m_bool_constant::iterator_category, U>::value> { }; + +// 萃取某种迭代器 +template +struct has_iterator_cat_of : public m_false_type { }; + +template +struct is_input_iterator + : public has_iterator_cat_of { }; + +template +struct is_output_iterator + : public has_iterator_cat_of { }; + +template +struct is_forward_iterator + : public has_iterator_cat_of { }; + +template +struct is_bidirectional_iterator + : public has_iterator_cat_of { }; + +template +struct is_random_access_iterator + : public has_iterator_cat_of { }; + +template +struct is_iterator + : public m_bool_constant::value + || is_output_iterator::value> { }; + +// 萃取某个迭代器的 category +template +typename iterator_traits::iterator_category +iterator_category(const Iterator&) { + typedef typename iterator_traits::iterator_category Category; + return Category(); +} + +// 萃取某个迭代器的 distance_type +template +typename iterator_traits::difference_type* +distance_type(const Iterator&) { + return static_cast::difference_type*>(0); +} + +// 萃取某个迭代器的 value_type +template +typename iterator_traits::value_type* value_type(const Iterator&) { + return static_cast::value_type*>(0); +} + +// 以下函数用于计算迭代器间的距离 + +// distance 的 input_iterator_tag 的版本 +template +typename iterator_traits::difference_type +distance_dispatch(InputIterator first, InputIterator last, input_iterator_tag) { + typename iterator_traits::difference_type n = 0; + while (first != last) { + ++first; + ++n; + } + return n; +} + +// distance 的 random_access_iterator_tag 的版本 +template +typename iterator_traits::difference_type +distance_dispatch(RandomIter first, RandomIter last, + random_access_iterator_tag) { + return last - first; +} + +template +typename iterator_traits::difference_type +distance(InputIterator first, InputIterator last) { + return distance_dispatch(first, last, iterator_category(first)); +} + +// 以下函数用于让迭代器前进 n 个距离 + +// advance 的 input_iterator_tag 的版本 +template +void advance_dispatch(InputIterator& i, Distance n, input_iterator_tag) { + while (n--) { + ++i; + } +} + +// advance 的 bidirectional_iterator_tag 的版本 +template +void advance_dispatch(BidirectionalIterator& i, Distance n, + bidirectional_iterator_tag) { + if (n >= 0) { + while (n--) { + ++i; + } + } + else { + while (n++) { + --i; + } + } +} + +// advance 的 random_access_iterator_tag 的版本 +template +void advance_dispatch(RandomIter& i, Distance n, random_access_iterator_tag) { + i += n; +} + +template +void advance(InputIterator& i, Distance n) { + advance_dispatch(i, n, iterator_category(i)); +} + +/*****************************************************************************************/ + +// 模板类 : reverse_iterator +// 代表反向迭代器,使前进为后退,后退为前进 +template +class reverse_iterator { +private: + Iterator current; // 记录对应的正向迭代器 + +public: + // 反向迭代器的五种相应型别 + typedef + typename iterator_traits::iterator_category iterator_category; + typedef typename iterator_traits::value_type value_type; + typedef typename iterator_traits::difference_type difference_type; + typedef typename iterator_traits::pointer pointer; + typedef typename iterator_traits::reference reference; + + typedef Iterator iterator_type; + typedef reverse_iterator self; + +public: + // 构造函数 + reverse_iterator() { + } + + explicit reverse_iterator(iterator_type i) : current(i) { + } + + reverse_iterator(const self& rhs) : current(rhs.current) { + } + +public: + // 取出对应的正向迭代器 + iterator_type base() const { + return current; + } + + // 重载操作符 + reference operator*() const { // 实际对应正向迭代器的前一个位置 + auto tmp = current; + return *--tmp; + } + + pointer operator->() const { + return &(operator*()); + } + + // 前进(++)变为后退(--) + self& operator++() { + --current; + return *this; + } + + self operator++(int) { + self tmp = *this; + --current; + return tmp; + } + + // 后退(--)变为前进(++) + self& operator--() { + ++current; + return *this; + } + + self operator--(int) { + self tmp = *this; + ++current; + return tmp; + } + + self& operator+=(difference_type n) { + current -= n; + return *this; + } + + self operator+(difference_type n) const { + return self(current - n); + } + + self& operator-=(difference_type n) { + current += n; + return *this; + } + + self operator-(difference_type n) const { + return self(current + n); + } + + reference operator[](difference_type n) const { + return *(*this + n); + } +}; + +// 重载 operator- +template +typename reverse_iterator::difference_type +operator-(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return rhs.base() - lhs.base(); +} + +// 重载比较操作符 +template +bool operator==(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return lhs.base() == rhs.base(); +} + +template +bool operator<(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return rhs.base() < lhs.base(); +} + +template +bool operator!=(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const reverse_iterator& lhs, + const reverse_iterator& rhs) { + return !(lhs < rhs); +} +}; // namespace mystl + +#endif /* SIMPLEKERNEL_ITERATOR */ diff --git a/src/libcxx/include/list b/src/libcxx/include/list new file mode 100644 index 000000000..a19e085c6 --- /dev/null +++ b/src/libcxx/include/list @@ -0,0 +1,1182 @@ + +/** + * @file list + * @brief stl list 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_LIST +#define SIMPLEKERNEL_LIST + +// 这个头文件包含了一个模板类 list +// list : 双向链表 + +// notes: +// +// 异常保证: +// std::list +// 满足基本异常保证,部分函数无异常保证,并对以下等函数做强异常安全保证: +// * emplace_front +// * emplace_back +// * emplace +// * push_front +// * push_back +// * insert + +#include "exceptdef" +#include "functional" +#include "initializer_list" +#include "iterator" +#include "memory" +#include "util" + +namespace mystl { + +template +struct list_node_base; +template +struct list_node; + +template +struct node_traits { + typedef list_node_base* base_ptr; + typedef list_node* node_ptr; +}; + +// list 的节点结构 + +template +struct list_node_base { + typedef typename node_traits::base_ptr base_ptr; + typedef typename node_traits::node_ptr node_ptr; + + base_ptr prev; // 前一节点 + base_ptr next; // 下一节点 + + list_node_base() = default; + + node_ptr as_node() { + return static_cast(self()); + } + + void unlink() { + prev = next = self(); + } + + base_ptr self() { + return static_cast(&*this); + } +}; + +template +struct list_node : public list_node_base { + typedef typename node_traits::base_ptr base_ptr; + typedef typename node_traits::node_ptr node_ptr; + + T value; // 数据域 + + list_node() = default; + + list_node(const T& v) : value(v) { + } + + list_node(T&& v) : value(mystl::move(v)) { + } + + base_ptr as_base() { + return static_cast(&*this); + } + + node_ptr self() { + return static_cast(&*this); + } +}; + +// list 的迭代器设计 +template +struct list_iterator + : public mystl::iterator { + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef typename node_traits::base_ptr base_ptr; + typedef typename node_traits::node_ptr node_ptr; + typedef list_iterator self; + + base_ptr node_; // 指向当前节点 + + // 构造函数 + list_iterator() = default; + + list_iterator(base_ptr x) : node_(x) { + } + + list_iterator(node_ptr x) : node_(x->as_base()) { + } + + list_iterator(const list_iterator& rhs) : node_(rhs.node_) { + } + + // 重载操作符 + reference operator*() const { + return node_->as_node()->value; + } + + pointer operator->() const { + return &(operator*()); + } + + self& operator++() { + MYSTL_DEBUG(node_ != nullptr); + node_ = node_->next; + return *this; + } + + self operator++(int) { + self tmp = *this; + ++*this; + return tmp; + } + + self& operator--() { + MYSTL_DEBUG(node_ != nullptr); + node_ = node_->prev; + return *this; + } + + self operator--(int) { + self tmp = *this; + --*this; + return tmp; + } + + // 重载比较操作符 + bool operator==(const self& rhs) const { + return node_ == rhs.node_; + } + + bool operator!=(const self& rhs) const { + return node_ != rhs.node_; + } +}; + +template +struct list_const_iterator : public iterator { + typedef T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef typename node_traits::base_ptr base_ptr; + typedef typename node_traits::node_ptr node_ptr; + typedef list_const_iterator self; + + base_ptr node_; + + list_const_iterator() = default; + + list_const_iterator(base_ptr x) : node_(x) { + } + + list_const_iterator(node_ptr x) : node_(x->as_base()) { + } + + list_const_iterator(const list_iterator& rhs) : node_(rhs.node_) { + } + + list_const_iterator(const list_const_iterator& rhs) : node_(rhs.node_) { + } + + reference operator*() const { + return node_->as_node()->value; + } + + pointer operator->() const { + return &(operator*()); + } + + self& operator++() { + MYSTL_DEBUG(node_ != nullptr); + node_ = node_->next; + return *this; + } + + self operator++(int) { + self tmp = *this; + ++*this; + return tmp; + } + + self& operator--() { + MYSTL_DEBUG(node_ != nullptr); + node_ = node_->prev; + return *this; + } + + self operator--(int) { + self tmp = *this; + --*this; + return tmp; + } + + // 重载比较操作符 + bool operator==(const self& rhs) const { + return node_ == rhs.node_; + } + + bool operator!=(const self& rhs) const { + return node_ != rhs.node_; + } +}; + +// 模板类: list +// 模板参数 T 代表数据类型 +template +class list { +public: + // list 的嵌套型别定义 + typedef mystl::allocator allocator_type; + typedef mystl::allocator data_allocator; + typedef mystl::allocator> base_allocator; + typedef mystl::allocator> node_allocator; + + typedef typename allocator_type::value_type value_type; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + + typedef list_iterator iterator; + typedef list_const_iterator const_iterator; + typedef mystl::reverse_iterator reverse_iterator; + typedef mystl::reverse_iterator const_reverse_iterator; + + typedef typename node_traits::base_ptr base_ptr; + typedef typename node_traits::node_ptr node_ptr; + + allocator_type get_allocator() { + return node_allocator(); + } + +private: + base_ptr node_; // 指向末尾节点 + size_type size_; // 大小 + +public: + // 构造、复制、移动、析构函数 + list() { + fill_init(0, value_type()); + } + + explicit list(size_type n) { + fill_init(n, value_type()); + } + + list(size_type n, const T& value) { + fill_init(n, value); + } + + template ::value, int>::type + = 0> + list(Iter first, Iter last) { + copy_init(first, last); + } + + list(std::initializer_list ilist) { + copy_init(ilist.begin(), ilist.end()); + } + + list(const list& rhs) { + copy_init(rhs.cbegin(), rhs.cend()); + } + + list(list&& rhs) noexcept : node_(rhs.node_), size_(rhs.size_) { + rhs.node_ = nullptr; + rhs.size_ = 0; + } + + list& operator=(const list& rhs) { + if (this != &rhs) { + assign(rhs.begin(), rhs.end()); + } + return *this; + } + + list& operator=(list&& rhs) noexcept { + clear(); + splice(end(), rhs); + return *this; + } + + list& operator=(std::initializer_list ilist) { + list tmp(ilist.begin(), ilist.end()); + swap(tmp); + return *this; + } + + ~list() { + if (node_) { + clear(); + base_allocator::deallocate(node_); + node_ = nullptr; + size_ = 0; + } + } + +public: + // 迭代器相关操作 + iterator begin() noexcept { + return node_->next; + } + + const_iterator begin() const noexcept { + return node_->next; + } + + iterator end() noexcept { + return node_; + } + + const_iterator end() const noexcept { + return node_; + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关操作 + bool empty() const noexcept { + return node_->next == node_; + } + + size_type size() const noexcept { + return size_; + } + + size_type max_size() const noexcept { + return static_cast(-1); + } + + // 访问元素相关操作 + reference front() { + MYSTL_DEBUG(!empty()); + return *begin(); + } + + const_reference front() const { + MYSTL_DEBUG(!empty()); + return *begin(); + } + + reference back() { + MYSTL_DEBUG(!empty()); + return *(--end()); + } + + const_reference back() const { + MYSTL_DEBUG(!empty()); + return *(--end()); + } + + // 调整容器相关操作 + + // assign + + void assign(size_type n, const value_type& value) { + fill_assign(n, value); + } + + template ::value, int>::type + = 0> + void assign(Iter first, Iter last) { + copy_assign(first, last); + } + + void assign(std::initializer_list ilist) { + copy_assign(ilist.begin(), ilist.end()); + } + + // emplace_front / emplace_back / emplace + + template + void emplace_front(Args&&... args) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(mystl::forward(args)...); + link_nodes_at_front(link_node->as_base(), link_node->as_base()); + ++size_; + } + + template + void emplace_back(Args&&... args) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(mystl::forward(args)...); + link_nodes_at_back(link_node->as_base(), link_node->as_base()); + ++size_; + } + + template + iterator emplace(const_iterator pos, Args&&... args) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(mystl::forward(args)...); + link_nodes(pos.node_, link_node->as_base(), link_node->as_base()); + ++size_; + return iterator(link_node); + } + + // insert + + iterator insert(const_iterator pos, const value_type& value) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(value); + ++size_; + return link_iter_node(pos, link_node->as_base()); + } + + iterator insert(const_iterator pos, value_type&& value) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(mystl::move(value)); + ++size_; + return link_iter_node(pos, link_node->as_base()); + } + + iterator insert(const_iterator pos, size_type n, const value_type& value) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - n, "list's size too big"); + return fill_insert(pos, n, value); + } + + template ::value, int>::type + = 0> + iterator insert(const_iterator pos, Iter first, Iter last) { + size_type n = mystl::distance(first, last); + THROW_LENGTH_ERROR_IF(size_ > max_size() - n, "list's size too big"); + return copy_insert(pos, n, first); + } + + // push_front / push_back + + void push_front(const value_type& value) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(value); + link_nodes_at_front(link_node->as_base(), link_node->as_base()); + ++size_; + } + + void push_front(value_type&& value) { + emplace_front(mystl::move(value)); + } + + void push_back(const value_type& value) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + auto link_node = create_node(value); + link_nodes_at_back(link_node->as_base(), link_node->as_base()); + ++size_; + } + + void push_back(value_type&& value) { + emplace_back(mystl::move(value)); + } + + // pop_front / pop_back + + void pop_front() { + MYSTL_DEBUG(!empty()); + auto n = node_->next; + unlink_nodes(n, n); + destroy_node(n->as_node()); + --size_; + } + + void pop_back() { + MYSTL_DEBUG(!empty()); + auto n = node_->prev; + unlink_nodes(n, n); + destroy_node(n->as_node()); + --size_; + } + + // erase / clear + + iterator erase(const_iterator pos); + iterator erase(const_iterator first, const_iterator last); + + void clear(); + + // resize + + void resize(size_type new_size) { + resize(new_size, value_type()); + } + + void resize(size_type new_size, const value_type& value); + + void swap(list& rhs) noexcept { + mystl::swap(node_, rhs.node_); + mystl::swap(size_, rhs.size_); + } + + // list 相关操作 + + void splice(const_iterator pos, list& other); + void splice(const_iterator pos, list& other, const_iterator it); + void splice(const_iterator pos, list& other, const_iterator first, + const_iterator last); + + void remove(const value_type& value) { + remove_if([&](const value_type& v) { + return v == value; + }); + } + template + void remove_if(UnaryPredicate pred); + + void unique() { + unique(mystl::equal_to()); + } + template + void unique(BinaryPredicate pred); + + void merge(list& x) { + merge(x, mystl::less()); + } + template + void merge(list& x, Compare comp); + + void sort() { + list_sort(begin(), end(), size(), mystl::less()); + } + + template + void sort(Compared comp) { + list_sort(begin(), end(), size(), comp); + } + + void reverse(); + +private: + // helper functions + + // create / destroy node + template + node_ptr create_node(Args&&... agrs); + void destroy_node(node_ptr p); + + // initialize + void fill_init(size_type n, const value_type& value); + template + void copy_init(Iter first, Iter last); + + // link / unlink + iterator link_iter_node(const_iterator pos, base_ptr node); + void link_nodes(base_ptr p, base_ptr first, base_ptr last); + void link_nodes_at_front(base_ptr first, base_ptr last); + void link_nodes_at_back(base_ptr first, base_ptr last); + void unlink_nodes(base_ptr f, base_ptr l); + + // assign + void fill_assign(size_type n, const value_type& value); + template + void copy_assign(Iter first, Iter last); + + // insert + iterator + fill_insert(const_iterator pos, size_type n, const value_type& value); + template + iterator copy_insert(const_iterator pos, size_type n, Iter first); + + // sort + template + iterator + list_sort(iterator first, iterator last, size_type n, Compared comp); +}; + +/*****************************************************************************************/ + +// 删除 pos 处的元素 +template +typename list::iterator list::erase(const_iterator pos) { + MYSTL_DEBUG(pos != cend()); + auto n = pos.node_; + auto next = n->next; + unlink_nodes(n, n); + destroy_node(n->as_node()); + --size_; + return iterator(next); +} + +// 删除 [first, last) 内的元素 +template +typename list::iterator +list::erase(const_iterator first, const_iterator last) { + if (first != last) { + unlink_nodes(first.node_, last.node_->prev); + while (first != last) { + auto cur = first.node_; + ++first; + destroy_node(cur->as_node()); + --size_; + } + } + return iterator(last.node_); +} + +// 清空 list +template +void list::clear() { + if (size_ != 0) { + auto cur = node_->next; + for (base_ptr next = cur->next; cur != node_; + cur = next, next = cur->next) { + destroy_node(cur->as_node()); + } + node_->unlink(); + size_ = 0; + } +} + +// 重置容器大小 +template +void list::resize(size_type new_size, const value_type& value) { + auto i = begin(); + size_type len = 0; + while (i != end() && len < new_size) { + ++i; + ++len; + } + if (len == new_size) { + erase(i, node_); + } + else { + insert(node_, new_size - len, value); + } +} + +// 将 list x 接合于 pos 之前 +template +void list::splice(const_iterator pos, list& x) { + MYSTL_DEBUG(this != &x); + if (!x.empty()) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - x.size_, + "list's size too big"); + + auto f = x.node_->next; + auto l = x.node_->prev; + + x.unlink_nodes(f, l); + link_nodes(pos.node_, f, l); + + size_ += x.size_; + x.size_ = 0; + } +} + +// 将 it 所指的节点接合于 pos 之前 +template +void list::splice(const_iterator pos, list& x, const_iterator it) { + if (pos.node_ != it.node_ && pos.node_ != it.node_->next) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - 1, "list's size too big"); + + auto f = it.node_; + + x.unlink_nodes(f, f); + link_nodes(pos.node_, f, f); + + ++size_; + --x.size_; + } +} + +// 将 list x 的 [first, last) 内的节点接合于 pos 之前 +template +void list::splice(const_iterator pos, list& x, const_iterator first, + const_iterator last) { + if (first != last && this != &x) { + size_type n = mystl::distance(first, last); + THROW_LENGTH_ERROR_IF(size_ > max_size() - n, "list's size too big"); + auto f = first.node_; + auto l = last.node_->prev; + + x.unlink_nodes(f, l); + link_nodes(pos.node_, f, l); + + size_ += n; + x.size_ -= n; + } +} + +// 将另一元操作 pred 为 true 的所有元素移除 +template +template +void list::remove_if(UnaryPredicate pred) { + auto f = begin(); + auto l = end(); + for (auto next = f; f != l; f = next) { + ++next; + if (pred(*f)) { + erase(f); + } + } +} + +// 移除 list 中满足 pred 为 true 重复元素 +template +template +void list::unique(BinaryPredicate pred) { + auto i = begin(); + auto e = end(); + auto j = i; + ++j; + while (j != e) { + if (pred(*i, *j)) { + erase(j); + } + else { + i = j; + } + j = i; + ++j; + } +} + +// 与另一个 list 合并,按照 comp 为 true 的顺序 +template +template +void list::merge(list& x, Compare comp) { + if (this != &x) { + THROW_LENGTH_ERROR_IF(size_ > max_size() - x.size_, + "list's size too big"); + + auto f1 = begin(); + auto l1 = end(); + auto f2 = x.begin(); + auto l2 = x.end(); + + while (f1 != l1 && f2 != l2) { + if (comp(*f2, *f1)) { + // 使 comp 为 true 的一段区间 + auto next = f2; + ++next; + for (; next != l2 && comp(*next, *f1); ++next) + ; + auto f = f2.node_; + auto l = next.node_->prev; + f2 = next; + + // link node + x.unlink_nodes(f, l); + link_nodes(f1.node_, f, l); + ++f1; + } + else { + ++f1; + } + } + // 连接剩余部分 + if (f2 != l2) { + auto f = f2.node_; + auto l = l2.node_->prev; + x.unlink_nodes(f, l); + link_nodes(l1.node_, f, l); + } + + size_ += x.size_; + x.size_ = 0; + } +} + +// 将 list 反转 +template +void list::reverse() { + if (size_ <= 1) { + return; + } + auto i = begin(); + auto e = end(); + while (i.node_ != e.node_) { + mystl::swap(i.node_->prev, i.node_->next); + i.node_ = i.node_->prev; + } + mystl::swap(e.node_->prev, e.node_->next); +} + +/*****************************************************************************************/ +// helper function + +// 创建结点 +template +template +typename list::node_ptr list::create_node(Args&&... args) { + node_ptr p = node_allocator::allocate(1); + try { + data_allocator::construct(mystl::address_of(p->value), + mystl::forward(args)...); + p->prev = nullptr; + p->next = nullptr; + } catch (...) { + node_allocator::deallocate(p); + throw; + } + return p; +} + +// 销毁结点 +template +void list::destroy_node(node_ptr p) { + data_allocator::destroy(mystl::address_of(p->value)); + node_allocator::deallocate(p); +} + +// 用 n 个元素初始化容器 +template +void list::fill_init(size_type n, const value_type& value) { + node_ = base_allocator::allocate(1); + node_->unlink(); + size_ = n; + try { + for (; n > 0; --n) { + auto node = create_node(value); + link_nodes_at_back(node->as_base(), node->as_base()); + } + } catch (...) { + clear(); + base_allocator::deallocate(node_); + node_ = nullptr; + throw; + } +} + +// 以 [first, last) 初始化容器 +template +template +void list::copy_init(Iter first, Iter last) { + node_ = base_allocator::allocate(1); + node_->unlink(); + size_type n = mystl::distance(first, last); + size_ = n; + try { + for (; n > 0; --n, ++first) { + auto node = create_node(*first); + link_nodes_at_back(node->as_base(), node->as_base()); + } + } catch (...) { + clear(); + base_allocator::deallocate(node_); + node_ = nullptr; + throw; + } +} + +// 在 pos 处连接一个节点 +template +typename list::iterator +list::link_iter_node(const_iterator pos, base_ptr link_node) { + if (pos == node_->next) { + link_nodes_at_front(link_node, link_node); + } + else if (pos == node_) { + link_nodes_at_back(link_node, link_node); + } + else { + link_nodes(pos.node_, link_node, link_node); + } + return iterator(link_node); +} + +// 在 pos 处连接 [first, last] 的结点 +template +void list::link_nodes(base_ptr pos, base_ptr first, base_ptr last) { + pos->prev->next = first; + first->prev = pos->prev; + pos->prev = last; + last->next = pos; +} + +// 在头部连接 [first, last] 结点 +template +void list::link_nodes_at_front(base_ptr first, base_ptr last) { + first->prev = node_; + last->next = node_->next; + last->next->prev = last; + node_->next = first; +} + +// 在尾部连接 [first, last] 结点 +template +void list::link_nodes_at_back(base_ptr first, base_ptr last) { + last->next = node_; + first->prev = node_->prev; + first->prev->next = first; + node_->prev = last; +} + +// 容器与 [first, last] 结点断开连接 +template +void list::unlink_nodes(base_ptr first, base_ptr last) { + first->prev->next = last->next; + last->next->prev = first->prev; +} + +// 用 n 个元素为容器赋值 +template +void list::fill_assign(size_type n, const value_type& value) { + auto i = begin(); + auto e = end(); + for (; n > 0 && i != e; --n, ++i) { + *i = value; + } + if (n > 0) { + insert(e, n, value); + } + else { + erase(i, e); + } +} + +// 复制[f2, l2)为容器赋值 +template +template +void list::copy_assign(Iter f2, Iter l2) { + auto f1 = begin(); + auto l1 = end(); + for (; f1 != l1 && f2 != l2; ++f1, ++f2) { + *f1 = *f2; + } + if (f2 == l2) { + erase(f1, l1); + } + else { + insert(l1, f2, l2); + } +} + +// 在 pos 处插入 n 个元素 +template +typename list::iterator +list::fill_insert(const_iterator pos, size_type n, const value_type& value) { + iterator r(pos.node_); + if (n != 0) { + const auto add_size = n; + auto node = create_node(value); + node->prev = nullptr; + r = iterator(node); + iterator end = r; + try { + // 前面已经创建了一个节点,还需 n - 1 个 + for (--n; n > 0; --n, ++end) { + auto next = create_node(value); + end.node_->next = next->as_base(); // link node + next->prev = end.node_; + } + size_ += add_size; + } catch (...) { + auto enode = end.node_; + while (true) { + auto prev = enode->prev; + destroy_node(enode->as_node()); + if (prev == nullptr) { + break; + } + enode = prev; + } + throw; + } + link_nodes(pos.node_, r.node_, end.node_); + } + return r; +} + +// 在 pos 处插入 [first, last) 的元素 +template +template +typename list::iterator +list::copy_insert(const_iterator pos, size_type n, Iter first) { + iterator r(pos.node_); + if (n != 0) { + const auto add_size = n; + auto node = create_node(*first); + node->prev = nullptr; + r = iterator(node); + iterator end = r; + try { + for (--n, ++first; n > 0; --n, ++first, ++end) { + auto next = create_node(*first); + end.node_->next = next->as_base(); // link node + next->prev = end.node_; + } + size_ += add_size; + } catch (...) { + auto enode = end.node_; + while (true) { + auto prev = enode->prev; + destroy_node(enode->as_node()); + if (prev == nullptr) { + break; + } + enode = prev; + } + throw; + } + link_nodes(pos.node_, r.node_, end.node_); + } + return r; +} + +// 对 list 进行归并排序,返回一个迭代器指向区间最小元素的位置 +template +template +typename list::iterator +list::list_sort(iterator f1, iterator l2, size_type n, Compared comp) { + if (n < 2) { + return f1; + } + + if (n == 2) { + if (comp(*--l2, *f1)) { + auto ln = l2.node_; + unlink_nodes(ln, ln); + link_nodes(f1.node_, ln, ln); + return l2; + } + return f1; + } + + auto n2 = n / 2; + auto l1 = f1; + mystl::advance(l1, n2); + auto result = f1 = list_sort(f1, l1, n2, comp); // 前半段的最小位置 + auto f2 = l1 = list_sort(l1, l2, n - n2, comp); // 后半段的最小位置 + + // 把较小的一段区间移到前面 + if (comp(*f2, *f1)) { + auto m = f2; + ++m; + for (; m != l2 && comp(*m, *f1); ++m) + ; + auto f = f2.node_; + auto l = m.node_->prev; + result = f2; + l1 = f2 = m; + unlink_nodes(f, l); + m = f1; + ++m; + link_nodes(f1.node_, f, l); + f1 = m; + } + else { + ++f1; + } + + // 合并两段有序区间 + while (f1 != l1 && f2 != l2) { + if (comp(*f2, *f1)) { + auto m = f2; + ++m; + for (; m != l2 && comp(*m, *f1); ++m) + ; + auto f = f2.node_; + auto l = m.node_->prev; + if (l1 == f2) { + l1 = m; + } + f2 = m; + unlink_nodes(f, l); + m = f1; + ++m; + link_nodes(f1.node_, f, l); + f1 = m; + } + else { + ++f1; + } + } + return result; +} + +// 重载比较操作符 +template +bool operator==(const list& lhs, const list& rhs) { + auto f1 = lhs.cbegin(); + auto f2 = rhs.cbegin(); + auto l1 = lhs.cend(); + auto l2 = rhs.cend(); + for (; f1 != l1 && f2 != l2 && *f1 == *f2; ++f1, ++f2) + ; + return f1 == l1 && f2 == l2; +} + +template +bool operator<(const list& lhs, const list& rhs) { + return mystl::lexicographical_compare(lhs.cbegin(), lhs.cend(), + rhs.cbegin(), rhs.cend()); +} + +template +bool operator!=(const list& lhs, const list& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const list& lhs, const list& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const list& lhs, const list& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const list& lhs, const list& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(list& lhs, list& rhs) noexcept { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_LIST */ diff --git a/src/libcxx/include/map b/src/libcxx/include/map new file mode 100644 index 000000000..571f52b51 --- /dev/null +++ b/src/libcxx/include/map @@ -0,0 +1,694 @@ + +/** + * @file map + * @brief stl map 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_MAP +#define SIMPLEKERNEL_MAP + +// 这个头文件包含了两个模板类 map 和 multimap +// map : 映射,元素具有键值和实值,会根据键值大小自动排序,键值不允许重复 +// multimap : 映射,元素具有键值和实值,会根据键值大小自动排序,键值允许重复 + +// notes: +// +// 异常保证: +// std::map / std::multimap +// 满足基本异常保证,对以下等函数做强异常安全保证: +// * emplace +// * emplace_hint +// * insert + +#include "rb_tree" + +namespace mystl { + +// 模板类 map,键值不允许重复 +// 参数一代表键值类型,参数二代表实值类型,参数三代表键值的比较方式,缺省使用 +// mystl::less +template > +class map { +public: + // map 的嵌套型别定义 + typedef Key key_type; + typedef T mapped_type; + typedef mystl::pair value_type; + typedef Compare key_compare; + + // 定义一个 functor,用来进行元素比较 + class value_compare : public binary_function { + friend class map; + + private: + Compare comp; + + value_compare(Compare c) : comp(c) { + } + + public: + bool operator()(const value_type& lhs, const value_type& rhs) const { + return comp(lhs.first, rhs.first); // 比较键值的大小 + } + }; + +private: + // 以 mystl::rb_tree 作为底层机制 + typedef mystl::rb_tree base_type; + base_type tree_; + +public: + // 使用 rb_tree 的型别 + typedef typename base_type::node_type node_type; + typedef typename base_type::pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::reverse_iterator reverse_iterator; + typedef typename base_type::const_reverse_iterator const_reverse_iterator; + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::allocator_type allocator_type; + +public: + // 构造、复制、移动、赋值函数 + + map() = default; + + template + map(InputIterator first, InputIterator last) : tree_() { + tree_.insert_unique(first, last); + } + + map(std::initializer_list ilist) : tree_() { + tree_.insert_unique(ilist.begin(), ilist.end()); + } + + map(const map& rhs) : tree_(rhs.tree_) { + } + + map(map&& rhs) noexcept : tree_(mystl::move(rhs.tree_)) { + } + + map& operator=(const map& rhs) { + tree_ = rhs.tree_; + return *this; + } + + map& operator=(map&& rhs) { + tree_ = mystl::move(rhs.tree_); + return *this; + } + + map& operator=(std::initializer_list ilist) { + tree_.clear(); + tree_.insert_unique(ilist.begin(), ilist.end()); + return *this; + } + + // 相关接口 + + key_compare key_comp() const { + return tree_.key_comp(); + } + + value_compare value_comp() const { + return value_compare(tree_.key_comp()); + } + + allocator_type get_allocator() const { + return tree_.get_allocator(); + } + + // 迭代器相关 + + iterator begin() noexcept { + return tree_.begin(); + } + + const_iterator begin() const noexcept { + return tree_.begin(); + } + + iterator end() noexcept { + return tree_.end(); + } + + const_iterator end() const noexcept { + return tree_.end(); + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关 + bool empty() const noexcept { + return tree_.empty(); + } + + size_type size() const noexcept { + return tree_.size(); + } + + size_type max_size() const noexcept { + return tree_.max_size(); + } + + // 访问元素相关 + + // 若键值不存在,at 会抛出一个异常 + mapped_type& at(const key_type& key) { + iterator it = lower_bound(key); + // it->first >= key + THROW_OUT_OF_RANGE_IF(it == end() || key_comp()(it->first, key), + "map no such element exists"); + return it->second; + } + + const mapped_type& at(const key_type& key) const { + const_iterator it = lower_bound(key); + // it->first >= key + THROW_OUT_OF_RANGE_IF(it == end() || key_comp()(it->first, key), + "map no such element exists"); + return it->second; + } + + mapped_type& operator[](const key_type& key) { + iterator it = lower_bound(key); + // it->first >= key + if (it == end() || key_comp()(key, it->first)) { + it = emplace_hint(it, key, T {}); + } + return it->second; + } + + mapped_type& operator[](key_type&& key) { + iterator it = lower_bound(key); + // it->first >= key + if (it == end() || key_comp()(key, it->first)) { + it = emplace_hint(it, mystl::move(key), T {}); + } + return it->second; + } + + // 插入删除相关 + + template + pair emplace(Args&&... args) { + return tree_.emplace_unique(mystl::forward(args)...); + } + + template + iterator emplace_hint(iterator hint, Args&&... args) { + return tree_.emplace_unique_use_hint(hint, + mystl::forward(args)...); + } + + pair insert(const value_type& value) { + return tree_.insert_unique(value); + } + + pair insert(value_type&& value) { + return tree_.insert_unique(mystl::move(value)); + } + + iterator insert(iterator hint, const value_type& value) { + return tree_.insert_unique(hint, value); + } + + iterator insert(iterator hint, value_type&& value) { + return tree_.insert_unique(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + tree_.insert_unique(first, last); + } + + void erase(iterator position) { + tree_.erase(position); + } + + size_type erase(const key_type& key) { + return tree_.erase_unique(key); + } + + void erase(iterator first, iterator last) { + tree_.erase(first, last); + } + + void clear() { + tree_.clear(); + } + + // map 相关操作 + + iterator find(const key_type& key) { + return tree_.find(key); + } + + const_iterator find(const key_type& key) const { + return tree_.find(key); + } + + size_type count(const key_type& key) const { + return tree_.count_unique(key); + } + + iterator lower_bound(const key_type& key) { + return tree_.lower_bound(key); + } + + const_iterator lower_bound(const key_type& key) const { + return tree_.lower_bound(key); + } + + iterator upper_bound(const key_type& key) { + return tree_.upper_bound(key); + } + + const_iterator upper_bound(const key_type& key) const { + return tree_.upper_bound(key); + } + + pair equal_range(const key_type& key) { + return tree_.equal_range_unique(key); + } + + pair + equal_range(const key_type& key) const { + return tree_.equal_range_unique(key); + } + + void swap(map& rhs) noexcept { + tree_.swap(rhs.tree_); + } + +public: + friend bool operator==(const map& lhs, const map& rhs) { + return lhs.tree_ == rhs.tree_; + } + + friend bool operator<(const map& lhs, const map& rhs) { + return lhs.tree_ < rhs.tree_; + } +}; + +// 重载比较操作符 +template +bool operator==(const map& lhs, + const map& rhs) { + return lhs == rhs; +} + +template +bool operator<(const map& lhs, + const map& rhs) { + return lhs < rhs; +} + +template +bool operator!=(const map& lhs, + const map& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const map& lhs, + const map& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const map& lhs, + const map& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const map& lhs, + const map& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(map& lhs, map& rhs) noexcept { + lhs.swap(rhs); +} + +/*****************************************************************************************/ + +// 模板类 multimap,键值允许重复 +// 参数一代表键值类型,参数二代表实值类型,参数三代表键值的比较方式,缺省使用 +// mystl::less +template > +class multimap { +public: + // multimap 的型别定义 + typedef Key key_type; + typedef T mapped_type; + typedef mystl::pair value_type; + typedef Compare key_compare; + + // 定义一个 functor,用来进行元素比较 + class value_compare : public binary_function { + friend class multimap; + + private: + Compare comp; + + value_compare(Compare c) : comp(c) { + } + + public: + bool operator()(const value_type& lhs, const value_type& rhs) const { + return comp(lhs.first, rhs.first); + } + }; + +private: + // 用 mystl::rb_tree 作为底层机制 + typedef mystl::rb_tree base_type; + base_type tree_; + +public: + // 使用 rb_tree 的型别 + typedef typename base_type::node_type node_type; + typedef typename base_type::pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::reverse_iterator reverse_iterator; + typedef typename base_type::const_reverse_iterator const_reverse_iterator; + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::allocator_type allocator_type; + +public: + // 构造、复制、移动函数 + + multimap() = default; + + template + multimap(InputIterator first, InputIterator last) : tree_() { + tree_.insert_multi(first, last); + } + + multimap(std::initializer_list ilist) : tree_() { + tree_.insert_multi(ilist.begin(), ilist.end()); + } + + multimap(const multimap& rhs) : tree_(rhs.tree_) { + } + + multimap(multimap&& rhs) noexcept : tree_(mystl::move(rhs.tree_)) { + } + + multimap& operator=(const multimap& rhs) { + tree_ = rhs.tree_; + return *this; + } + + multimap& operator=(multimap&& rhs) { + tree_ = mystl::move(rhs.tree_); + return *this; + } + + multimap& operator=(std::initializer_list ilist) { + tree_.clear(); + tree_.insert_multi(ilist.begin(), ilist.end()); + return *this; + } + + // 相关接口 + + key_compare key_comp() const { + return tree_.key_comp(); + } + + value_compare value_comp() const { + return value_compare(tree_.key_comp()); + } + + allocator_type get_allocator() const { + return tree_.get_allocator(); + } + + // 迭代器相关 + + iterator begin() noexcept { + return tree_.begin(); + } + + const_iterator begin() const noexcept { + return tree_.begin(); + } + + iterator end() noexcept { + return tree_.end(); + } + + const_iterator end() const noexcept { + return tree_.end(); + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关 + bool empty() const noexcept { + return tree_.empty(); + } + + size_type size() const noexcept { + return tree_.size(); + } + + size_type max_size() const noexcept { + return tree_.max_size(); + } + + // 插入删除操作 + + template + iterator emplace(Args&&... args) { + return tree_.emplace_multi(mystl::forward(args)...); + } + + template + iterator emplace_hint(iterator hint, Args&&... args) { + return tree_.emplace_multi_use_hint(hint, + mystl::forward(args)...); + } + + iterator insert(const value_type& value) { + return tree_.insert_multi(value); + } + + iterator insert(value_type&& value) { + return tree_.insert_multi(mystl::move(value)); + } + + iterator insert(iterator hint, const value_type& value) { + return tree_.insert_multi(hint, value); + } + + iterator insert(iterator hint, value_type&& value) { + return tree_.insert_multi(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + tree_.insert_multi(first, last); + } + + void erase(iterator position) { + tree_.erase(position); + } + + size_type erase(const key_type& key) { + return tree_.erase_multi(key); + } + + void erase(iterator first, iterator last) { + tree_.erase(first, last); + } + + void clear() { + tree_.clear(); + } + + // multimap 相关操作 + + iterator find(const key_type& key) { + return tree_.find(key); + } + + const_iterator find(const key_type& key) const { + return tree_.find(key); + } + + size_type count(const key_type& key) const { + return tree_.count_multi(key); + } + + iterator lower_bound(const key_type& key) { + return tree_.lower_bound(key); + } + + const_iterator lower_bound(const key_type& key) const { + return tree_.lower_bound(key); + } + + iterator upper_bound(const key_type& key) { + return tree_.upper_bound(key); + } + + const_iterator upper_bound(const key_type& key) const { + return tree_.upper_bound(key); + } + + pair equal_range(const key_type& key) { + return tree_.equal_range_multi(key); + } + + pair + equal_range(const key_type& key) const { + return tree_.equal_range_multi(key); + } + + void swap(multimap& rhs) noexcept { + tree_.swap(rhs.tree_); + } + +public: + friend bool operator==(const multimap& lhs, const multimap& rhs) { + return lhs.tree_ == rhs.tree_; + } + + friend bool operator<(const multimap& lhs, const multimap& rhs) { + return lhs.tree_ < rhs.tree_; + } +}; + +// 重载比较操作符 +template +bool operator==(const multimap& lhs, + const multimap& rhs) { + return lhs == rhs; +} + +template +bool operator<(const multimap& lhs, + const multimap& rhs) { + return lhs < rhs; +} + +template +bool operator!=(const multimap& lhs, + const multimap& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const multimap& lhs, + const multimap& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const multimap& lhs, + const multimap& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const multimap& lhs, + const multimap& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(multimap& lhs, + multimap& rhs) noexcept { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_MAP */ diff --git a/src/libcxx/include/memory b/src/libcxx/include/memory new file mode 100644 index 000000000..059eb9e53 --- /dev/null +++ b/src/libcxx/include/memory @@ -0,0 +1,234 @@ + +/** + * @file memory + * @brief stl memory 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_MEMORY +#define SIMPLEKERNEL_MEMORY + +// 这个头文件负责更高级的动态内存管理 +// 包含一些基本函数、空间配置器、未初始化的储存空间管理,以及一个模板类 auto_ptr + +#include "algobase" +#include "allocator" +#include "construct" +#include "limits.h" +#include "stddef.h" +#include "stdlib.h" +#include "uninitialized" + +namespace mystl { + +// 获取对象地址 +template +constexpr Tp* address_of(Tp& value) noexcept { + return &value; +} + +// 获取 / 释放 临时缓冲区 + +template +pair get_buffer_helper(ptrdiff_t len, T*) { + if (len > static_cast(INT_MAX / sizeof(T))) { + len = INT_MAX / sizeof(T); + } + while (len > 0) { + T* tmp = static_cast(kmalloc(static_cast(len) * sizeof(T))); + if (tmp) { + return pair(tmp, len); + } + len /= 2; // 申请失败时减少 len 的大小 + } + return pair(nullptr, 0); +} + +template +pair get_temporary_buffer(ptrdiff_t len) { + return get_buffer_helper(len, static_cast(0)); +} + +template +pair get_temporary_buffer(ptrdiff_t len, T*) { + return get_buffer_helper(len, static_cast(0)); +} + +template +void release_temporary_buffer(T* ptr) { + kfree(ptr); +} + +// -------------------------------------------------------------------------------------- +// 类模板 : temporary_buffer +// 进行临时缓冲区的申请与释放 +template +class temporary_buffer { +private: + ptrdiff_t original_len; // 缓冲区申请的大小 + ptrdiff_t len; // 缓冲区实际的大小 + T* buffer; // 指向缓冲区的指针 + +public: + // 构造、析构函数 + temporary_buffer(ForwardIterator first, ForwardIterator last); + + ~temporary_buffer() { + mystl::destroy(buffer, buffer + len); + kfree(buffer); + } + +public: + ptrdiff_t size() const noexcept { + return len; + } + + ptrdiff_t requested_size() const noexcept { + return original_len; + } + + T* begin() noexcept { + return buffer; + } + + T* end() noexcept { + return buffer + len; + } + +private: + void allocate_buffer(); + + void initialize_buffer(const T&, std::true_type) { + } + + void initialize_buffer(const T& value, std::false_type) { + mystl::uninitialized_fill_n(buffer, len, value); + } + +private: + temporary_buffer(const temporary_buffer&); + void operator=(const temporary_buffer&); +}; + +// 构造函数 +template +temporary_buffer::temporary_buffer(ForwardIterator first, + ForwardIterator last) { + try { + len = mystl::distance(first, last); + allocate_buffer(); + if (len > 0) { + initialize_buffer(*first, + std::is_trivially_default_constructible()); + } + } catch (...) { + kfree(buffer); + buffer = nullptr; + len = 0; + } +} + +// allocate_buffer 函数 +template +void temporary_buffer::allocate_buffer() { + original_len = len; + if (len > static_cast(INT_MAX / sizeof(T))) { + len = INT_MAX / sizeof(T); + } + while (len > 0) { + buffer = static_cast(kmalloc(len * sizeof(T))); + if (buffer) { + break; + } + len /= 2; // 申请失败时减少申请空间大小 + } +} + +// -------------------------------------------------------------------------------------- +// 模板类: auto_ptr +// 一个具有严格对象所有权的小型智能指针 +template +class auto_ptr { +public: + typedef T elem_type; + +private: + T* m_ptr; // 实际指针 + +public: + // 构造、复制、析构函数 + explicit auto_ptr(T* p = nullptr) : m_ptr(p) { + } + + auto_ptr(auto_ptr& rhs) : m_ptr(rhs.release()) { + } + + template + auto_ptr(auto_ptr& rhs) : m_ptr(rhs.release()) { + } + + auto_ptr& operator=(auto_ptr& rhs) { + if (this != &rhs) { + delete m_ptr; + m_ptr = rhs.release(); + } + return *this; + } + + template + auto_ptr& operator=(auto_ptr& rhs) { + if (this->get() != rhs.get()) { + delete m_ptr; + m_ptr = rhs.release(); + } + return *this; + } + + ~auto_ptr() { + delete m_ptr; + } + +public: + // 重载 operator* 和 operator-> + T& operator*() const { + return *m_ptr; + } + + T* operator->() const { + return m_ptr; + } + + // 获得指针 + T* get() const { + return m_ptr; + } + + // 释放指针 + T* release() { + T* tmp = m_ptr; + m_ptr = nullptr; + return tmp; + } + + // 重置指针 + void reset(T* p = nullptr) { + if (m_ptr != p) { + delete m_ptr; + m_ptr = p; + } + } +}; + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_MEMORY */ diff --git a/src/libcxx/include/new b/src/libcxx/include/new new file mode 100644 index 000000000..f83f429b5 --- /dev/null +++ b/src/libcxx/include/new @@ -0,0 +1,54 @@ + +/** + * @file new + * @brief 内存分配 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_NEW +#define SIMPLEKERNEL_NEW + +#include "cstddef" + +namespace std { +enum class align_val_t : size_t { +}; +}; // namespace std + +void* operator new(size_t size); + +void* operator new(size_t, void* p) throw(); + +void* operator new[](size_t size); + +void* operator new[](size_t, void* p) throw(); + +void operator delete(void* p); + +void operator delete(void* p, size_t size); + +void operator delete(void*, void*) throw(); + +void operator delete[](void* p); + +void operator delete[](void* p, size_t size); + +void operator delete[](void*, void*) throw(); + +void* operator new(size_t, std::align_val_t); +void operator delete(void*, std::align_val_t); +void* operator new[](size_t, std::align_val_t); +void operator delete[](void*, std::align_val_t); +void operator delete(void*, size_t, std::align_val_t); +void operator delete[](void*, size_t, std::align_val_t); + +#endif /* SIMPLEKERNEL_NEW */ diff --git a/src/libcxx/include/numeric b/src/libcxx/include/numeric new file mode 100644 index 000000000..bf080df99 --- /dev/null +++ b/src/libcxx/include/numeric @@ -0,0 +1,164 @@ + +/** + * @file numeric + * @brief stl numeric 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_NUMERIC +#define SIMPLEKERNEL_NUMERIC + +// 这个头文件包含了 std 的数值算法 + +#include "iterator" + +namespace mystl { + +/*****************************************************************************************/ +// accumulate +// 版本1:以初值 init 对每个元素进行累加 +// 版本2:以初值 init 对每个元素进行二元操作 +/*****************************************************************************************/ +// 版本1 +template +T accumulate(InputIter first, InputIter last, T init) { + for (; first != last; ++first) { + init += *first; + } + return init; +} + +// 版本2 +template +T accumulate(InputIter first, InputIter last, T init, BinaryOp binary_op) { + for (; first != last; ++first) { + init = binary_op(init, *first); + } + return init; +} + +/*****************************************************************************************/ +// adjacent_difference +// 版本1:计算相邻元素的差值,结果保存到以 result 为起始的区间上 +// 版本2:自定义相邻元素的二元操作 +/*****************************************************************************************/ +// 版本1 +template +OutputIter +adjacent_difference(InputIter first, InputIter last, OutputIter result) { + if (first == last) { + return result; + } + *result = *first; // 记录第一个元素 + auto value = *first; + while (++first != last) { + auto tmp = *first; + *++result = tmp - value; + value = tmp; + } + return ++result; +} + +// 版本2 +template +OutputIter adjacent_difference(InputIter first, InputIter last, + OutputIter result, BinaryOp binary_op) { + if (first == last) { + return result; + } + *result = *first; // 记录第一个元素 + auto value = *first; + while (++first != last) { + auto tmp = *first; + *++result = binary_op(tmp, value); + value = tmp; + } + return ++result; +} + +/*****************************************************************************************/ +// inner_product +// 版本1:以 init 为初值,计算两个区间的内积 +// 版本2:自定义 operator+ 和 operator* +/*****************************************************************************************/ +// 版本1 +template +T inner_product(InputIter1 first1, InputIter1 last1, InputIter2 first2, + T init) { + for (; first1 != last1; ++first1, ++first2) { + init = init + (*first1 * *first2); + } + return init; +} + +// 版本2 +template +T inner_product(InputIter1 first1, InputIter1 last1, InputIter2 first2, T init, + BinaryOp1 binary_op1, BinaryOp2 binary_op2) { + for (; first1 != last1; ++first1, ++first2) { + init = binary_op1(init, binary_op2(*first1, *first2)); + } + return init; +} + +/*****************************************************************************************/ +// iota +// 填充[first, last),以 value 为初值开始递增 +/*****************************************************************************************/ +template +void iota(ForwardIter first, ForwardIter last, T value) { + while (first != last) { + *first++ = value; + ++value; + } +} + +/*****************************************************************************************/ +// partial_sum +// 版本1:计算局部累计求和,结果保存到以 result 为起始的区间上 +// 版本2:进行局部进行自定义二元操作 +/*****************************************************************************************/ +template +OutputIter partial_sum(InputIter first, InputIter last, OutputIter result) { + if (first == last) { + return result; + } + *result = *first; // 记录第一个元素 + auto value = *first; + while (++first != last) { + value = value + *first; + *++result = value; + } + return ++result; +} + +// 版本2 +template +OutputIter partial_sum(InputIter first, InputIter last, OutputIter result, + BinaryOp binary_op) { + if (first == last) { + return result; + } + *result = *first; // 记录第一个元素 + auto value = *first; + while (++first != last) { + value = binary_op(value, *first); + *++result = value; + } + return ++result; +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_NUMERIC */ diff --git a/src/libcxx/include/queue b/src/libcxx/include/queue new file mode 100644 index 000000000..0e22299e2 --- /dev/null +++ b/src/libcxx/include/queue @@ -0,0 +1,381 @@ + +/** + * @file queue + * @brief stl queue 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_QUEUE +#define SIMPLEKERNEL_QUEUE + +// 这个头文件包含了两个模板类 queue 和 priority_queue +// queue : 队列 +// priority_queue : 优先队列 + +#include "deque" +#include "functional" +#include "heap_algo" +#include "vector" + +namespace mystl { + +// 模板类 queue +// 参数一代表数据类型,参数二代表底层容器类型,缺省使用 mystl::deque +// 作为底层容器 +template > +class queue { +public: + typedef Container container_type; + // 使用底层容器的型别 + typedef typename Container::value_type value_type; + typedef typename Container::size_type size_type; + typedef typename Container::reference reference; + typedef typename Container::const_reference const_reference; + + static_assert(std::is_same::value, + "the value_type of Container should be same with T"); + +private: + container_type c_; // 用底层容器表现 queue + +public: + // 构造、复制、移动函数 + + queue() = default; + + explicit queue(size_type n) : c_(n) { + } + + queue(size_type n, const value_type& value) : c_(n, value) { + } + + template + queue(IIter first, IIter last) : c_(first, last) { + } + + queue(std::initializer_list ilist) : c_(ilist.begin(), ilist.end()) { + } + + queue(const Container& c) : c_(c) { + } + + queue(Container&& c) noexcept( + std::is_nothrow_move_constructible::value) + : c_(mystl::move(c)) { + } + + queue(const queue& rhs) : c_(rhs.c_) { + } + + queue(queue&& rhs) noexcept( + std::is_nothrow_move_constructible::value) + : c_(mystl::move(rhs.c_)) { + } + + queue& operator=(const queue& rhs) { + c_ = rhs.c_; + return *this; + } + + queue& operator=(queue&& rhs) noexcept( + std::is_nothrow_move_assignable::value) { + c_ = mystl::move(rhs.c_); + return *this; + } + + queue& operator=(std::initializer_list ilist) { + c_ = ilist; + return *this; + } + + ~queue() = default; + + // 访问元素相关操作 + reference front() { + return c_.front(); + } + + const_reference front() const { + return c_.front(); + } + + reference back() { + return c_.back(); + } + + const_reference back() const { + return c_.back(); + } + + // 容量相关操作 + bool empty() const noexcept { + return c_.empty(); + } + + size_type size() const noexcept { + return c_.size(); + } + + // 修改容器相关操作 + template + void emplace(Args&&... args) { + c_.emplace_back(mystl::forward(args)...); + } + + void push(const value_type& value) { + c_.push_back(value); + } + + void push(value_type&& value) { + c_.emplace_back(mystl::move(value)); + } + + void pop() { + c_.pop_front(); + } + + void clear() { + while (!empty()) { + pop(); + } + } + + void swap(queue& rhs) noexcept(noexcept(mystl::swap(c_, rhs.c_))) { + mystl::swap(c_, rhs.c_); + } + +public: + friend bool operator==(const queue& lhs, const queue& rhs) { + return lhs.c_ == rhs.c_; + } + + friend bool operator<(const queue& lhs, const queue& rhs) { + return lhs.c_ < rhs.c_; + } +}; + +// 重载比较操作符 +template +bool operator==(const queue& lhs, + const queue& rhs) { + return lhs == rhs; +} + +template +bool operator!=(const queue& lhs, + const queue& rhs) { + return !(lhs == rhs); +} + +template +bool operator<(const queue& lhs, const queue& rhs) { + return lhs < rhs; +} + +template +bool operator>(const queue& lhs, const queue& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const queue& lhs, + const queue& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const queue& lhs, + const queue& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(queue& lhs, + queue& rhs) noexcept(noexcept(lhs.swap(rhs))) { + lhs.swap(rhs); +} + +/*****************************************************************************************/ + +// 模板类 priority_queue +// 参数一代表数据类型,参数二代表容器类型,缺省使用 mystl::vector +// 作为底层容器 参数三代表比较权值的方式,缺省使用 mystl::less 作为比较方式 +template , + class Compare = mystl::less> +class priority_queue { +public: + typedef Container container_type; + typedef Compare value_compare; + // 使用底层容器的型别 + typedef typename Container::value_type value_type; + typedef typename Container::size_type size_type; + typedef typename Container::reference reference; + typedef typename Container::const_reference const_reference; + + static_assert(std::is_same::value, + "the value_type of Container should be same with T"); + +private: + container_type c_; // 用底层容器来表现 priority_queue + value_compare comp_; // 权值比较的标准 + +public: + // 构造、复制、移动函数 + priority_queue() = default; + + priority_queue(const Compare& c) : c_(), comp_(c) { + } + + explicit priority_queue(size_type n) : c_(n) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue(size_type n, const value_type& value) : c_(n, value) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + template + priority_queue(IIter first, IIter last) : c_(first, last) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue(std::initializer_list ilist) : c_(ilist) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue(const Container& s) : c_(s) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue(Container&& s) : c_(mystl::move(s)) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue(const priority_queue& rhs) : c_(rhs.c_), comp_(rhs.comp_) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue(priority_queue&& rhs) + : c_(mystl::move(rhs.c_)), comp_(rhs.comp_) { + mystl::make_heap(c_.begin(), c_.end(), comp_); + } + + priority_queue& operator=(const priority_queue& rhs) { + c_ = rhs.c_; + comp_ = rhs.comp_; + mystl::make_heap(c_.begin(), c_.end(), comp_); + return *this; + } + + priority_queue& operator=(priority_queue&& rhs) { + c_ = mystl::move(rhs.c_); + comp_ = rhs.comp_; + mystl::make_heap(c_.begin(), c_.end(), comp_); + return *this; + } + + priority_queue& operator=(std::initializer_list ilist) { + c_ = ilist; + comp_ = value_compare(); + mystl::make_heap(c_.begin(), c_.end(), comp_); + return *this; + } + + ~priority_queue() = default; + +public: + // 访问元素相关操作 + const_reference top() const { + return c_.front(); + } + + // 容量相关操作 + bool empty() const noexcept { + return c_.empty(); + } + + size_type size() const noexcept { + return c_.size(); + } + + // 修改容器相关操作 + template + void emplace(Args&&... args) { + c_.emplace_back(mystl::forward(args)...); + mystl::push_heap(c_.begin(), c_.end(), comp_); + } + + void push(const value_type& value) { + c_.push_back(value); + mystl::push_heap(c_.begin(), c_.end(), comp_); + } + + void push(value_type&& value) { + c_.push_back(mystl::move(value)); + mystl::push_heap(c_.begin(), c_.end(), comp_); + } + + void pop() { + mystl::pop_heap(c_.begin(), c_.end(), comp_); + c_.pop_back(); + } + + void clear() { + while (!empty()) { + pop(); + } + } + + void swap(priority_queue& rhs) noexcept(noexcept( + mystl::swap(c_, rhs.c_)) && noexcept(mystl::swap(comp_, rhs.comp_))) { + mystl::swap(c_, rhs.c_); + mystl::swap(comp_, rhs.comp_); + } + +public: + friend bool + operator==(const priority_queue& lhs, const priority_queue& rhs) { + return lhs.c_ == rhs.c_; + } + + friend bool + operator!=(const priority_queue& lhs, const priority_queue& rhs) { + return lhs.c_ != rhs.c_; + } +}; + +// 重载比较操作符 +template +bool operator==(priority_queue& lhs, + priority_queue& rhs) { + return lhs == rhs; +} + +template +bool operator!=(priority_queue& lhs, + priority_queue& rhs) { + return lhs != rhs; +} + +// 重载 mystl 的 swap +template +void swap(priority_queue& lhs, + priority_queue& + rhs) noexcept(noexcept(lhs.swap(rhs))) { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_QUEUE */ diff --git a/src/libcxx/include/rb_tree b/src/libcxx/include/rb_tree new file mode 100644 index 000000000..b60ad283f --- /dev/null +++ b/src/libcxx/include/rb_tree @@ -0,0 +1,1713 @@ + +/** + * @file rb_tree + * @brief stl rb_tree 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_RB_TREE +#define SIMPLEKERNEL_RB_TREE + +// 这个头文件包含一个模板类 rb_tree +// rb_tree : 红黑树 + +#include "assert.h" +#include "exceptdef" +#include "functional" +#include "initializer_list" +#include "iterator" +#include "memory" +#include "type_traits.h" + +namespace mystl { + +// rb tree 节点颜色的类型 + +typedef bool rb_tree_color_type; + +static constexpr rb_tree_color_type rb_tree_red = false; +static constexpr rb_tree_color_type rb_tree_black = true; + +// forward declaration + +template +struct rb_tree_node_base; +template +struct rb_tree_node; + +template +struct rb_tree_iterator; +template +struct rb_tree_const_iterator; + +// rb tree value traits + +template +struct rb_tree_value_traits_imp { + typedef T key_type; + typedef T mapped_type; + typedef T value_type; + + template + static const key_type& get_key(const Ty& value) { + return value; + } + + template + static const value_type& get_value(const Ty& value) { + return value; + } +}; + +template +struct rb_tree_value_traits_imp { + typedef typename std::remove_cv::type key_type; + typedef typename T::second_type mapped_type; + typedef T value_type; + + template + static const key_type& get_key(const Ty& value) { + return value.first; + } + + template + static const value_type& get_value(const Ty& value) { + return value; + } +}; + +template +struct rb_tree_value_traits { + static constexpr bool is_map = mystl::is_pair::value; + + typedef rb_tree_value_traits_imp value_traits_type; + + typedef typename value_traits_type::key_type key_type; + typedef typename value_traits_type::mapped_type mapped_type; + typedef typename value_traits_type::value_type value_type; + + template + static const key_type& get_key(const Ty& value) { + return value_traits_type::get_key(value); + } + + template + static const value_type& get_value(const Ty& value) { + return value_traits_type::get_value(value); + } +}; + +// rb tree node traits + +template +struct rb_tree_node_traits { + typedef rb_tree_color_type color_type; + + typedef rb_tree_value_traits value_traits; + typedef typename value_traits::key_type key_type; + typedef typename value_traits::mapped_type mapped_type; + typedef typename value_traits::value_type value_type; + + typedef rb_tree_node_base* base_ptr; + typedef rb_tree_node* node_ptr; +}; + +// rb tree 的节点设计 + +template +struct rb_tree_node_base { + typedef rb_tree_color_type color_type; + typedef rb_tree_node_base* base_ptr; + typedef rb_tree_node* node_ptr; + + base_ptr parent; // 父节点 + base_ptr left; // 左子节点 + base_ptr right; // 右子节点 + color_type color; // 节点颜色 + + base_ptr get_base_ptr() { + return &*this; + } + + node_ptr get_node_ptr() { + return reinterpret_cast(&*this); + } + + node_ptr& get_node_ref() { + return reinterpret_cast(*this); + } +}; + +template +struct rb_tree_node : public rb_tree_node_base { + typedef rb_tree_node_base* base_ptr; + typedef rb_tree_node* node_ptr; + + T value; // 节点值 + + base_ptr get_base_ptr() { + return static_cast(&*this); + } + + node_ptr get_node_ptr() { + return &*this; + } +}; + +// rb tree traits + +template +struct rb_tree_traits { + typedef rb_tree_value_traits value_traits; + + typedef typename value_traits::key_type key_type; + typedef typename value_traits::mapped_type mapped_type; + typedef typename value_traits::value_type value_type; + + typedef value_type* pointer; + typedef value_type& reference; + typedef const value_type* const_pointer; + typedef const value_type& const_reference; + + typedef rb_tree_node_base base_type; + typedef rb_tree_node node_type; + + typedef base_type* base_ptr; + typedef node_type* node_ptr; +}; + +// rb tree 的迭代器设计 + +template +struct rb_tree_iterator_base + : public mystl::iterator { + typedef typename rb_tree_traits::base_ptr base_ptr; + + base_ptr node; // 指向节点本身 + + rb_tree_iterator_base() : node(nullptr) { + } + + // 使迭代器前进 + void inc() { + if (node->right != nullptr) { + node = rb_tree_min(node->right); + } + else { // 如果没有右子节点 + auto y = node->parent; + while (y->right == node) { + node = y; + y = y->parent; + } + if ( + node->right + != y) { // 应对“寻找根节点的下一节点,而根节点没有右子节点”的特殊情况 + node = y; + } + } + } + + // 使迭代器后退 + void dec() { + if (node->parent->parent == node + && rb_tree_is_red(node)) { // 如果 node 为 header + node = node->right; // 指向整棵树的 max 节点 + } + else if (node->left != nullptr) { + node = rb_tree_max(node->left); + } + else { // 非 header 节点,也无左子节点 + auto y = node->parent; + while (node == y->left) { + node = y; + y = y->parent; + } + node = y; + } + } + + bool operator==(const rb_tree_iterator_base& rhs) { + return node == rhs.node; + } + + bool operator!=(const rb_tree_iterator_base& rhs) { + return node != rhs.node; + } +}; + +template +struct rb_tree_iterator : public rb_tree_iterator_base { + typedef rb_tree_traits tree_traits; + + typedef typename tree_traits::value_type value_type; + typedef typename tree_traits::pointer pointer; + typedef typename tree_traits::reference reference; + typedef typename tree_traits::base_ptr base_ptr; + typedef typename tree_traits::node_ptr node_ptr; + + typedef rb_tree_iterator iterator; + typedef rb_tree_const_iterator const_iterator; + typedef iterator self; + + using rb_tree_iterator_base::node; + + // 构造函数 + rb_tree_iterator() { + } + + rb_tree_iterator(base_ptr x) { + node = x; + } + + rb_tree_iterator(node_ptr x) { + node = x; + } + + rb_tree_iterator(const iterator& rhs) { + node = rhs.node; + } + + rb_tree_iterator(const const_iterator& rhs) { + node = rhs.node; + } + + // 重载操作符 + reference operator*() const { + return node->get_node_ptr()->value; + } + + pointer operator->() const { + return &(operator*()); + } + + self& operator++() { + this->inc(); + return *this; + } + + self operator++(int) { + self tmp(*this); + this->inc(); + return tmp; + } + + self& operator--() { + this->dec(); + return *this; + } + + self operator--(int) { + self tmp(*this); + this->dec(); + return tmp; + } +}; + +template +struct rb_tree_const_iterator : public rb_tree_iterator_base { + typedef rb_tree_traits tree_traits; + + typedef typename tree_traits::value_type value_type; + typedef typename tree_traits::const_pointer pointer; + typedef typename tree_traits::const_reference reference; + typedef typename tree_traits::base_ptr base_ptr; + typedef typename tree_traits::node_ptr node_ptr; + + typedef rb_tree_iterator iterator; + typedef rb_tree_const_iterator const_iterator; + typedef const_iterator self; + + using rb_tree_iterator_base::node; + + // 构造函数 + rb_tree_const_iterator() { + } + + rb_tree_const_iterator(base_ptr x) { + node = x; + } + + rb_tree_const_iterator(node_ptr x) { + node = x; + } + + rb_tree_const_iterator(const iterator& rhs) { + node = rhs.node; + } + + rb_tree_const_iterator(const const_iterator& rhs) { + node = rhs.node; + } + + // 重载操作符 + reference operator*() const { + return node->get_node_ptr()->value; + } + + pointer operator->() const { + return &(operator*()); + } + + self& operator++() { + this->inc(); + return *this; + } + + self operator++(int) { + self tmp(*this); + this->inc(); + return tmp; + } + + self& operator--() { + this->dec(); + return *this; + } + + self operator--(int) { + self tmp(*this); + this->dec(); + return tmp; + } +}; + +// tree algorithm + +template +NodePtr rb_tree_min(NodePtr x) noexcept { + while (x->left != nullptr) { + x = x->left; + } + return x; +} + +template +NodePtr rb_tree_max(NodePtr x) noexcept { + while (x->right != nullptr) { + x = x->right; + } + return x; +} + +template +bool rb_tree_is_lchild(NodePtr node) noexcept { + return node == node->parent->left; +} + +template +bool rb_tree_is_red(NodePtr node) noexcept { + return node->color == rb_tree_red; +} + +template +void rb_tree_set_black(NodePtr& node) noexcept { + node->color = rb_tree_black; +} + +template +void rb_tree_set_red(NodePtr& node) noexcept { + node->color = rb_tree_red; +} + +template +NodePtr rb_tree_next(NodePtr node) noexcept { + if (node->right != nullptr) { + return rb_tree_min(node->right); + } + while (!rb_tree_is_lchild(node)) { + node = node->parent; + } + return node->parent; +} + +/*---------------------------------------*\ +| p p | +| / \ / \ | +| x d rotate left y d | +| / \ ===========> / \ | +| a y x c | +| / \ / \ | +| b c a b | +\*---------------------------------------*/ +// 左旋,参数一为左旋点,参数二为根节点 +template +void rb_tree_rotate_left(NodePtr x, NodePtr& root) noexcept { + auto y = x->right; // y 为 x 的右子节点 + x->right = y->left; + if (y->left != nullptr) { + y->left->parent = x; + } + y->parent = x->parent; + + if (x == root) { // 如果 x 为根节点,让 y 顶替 x 成为根节点 + root = y; + } + else if (rb_tree_is_lchild(x)) { // 如果 x 是左子节点 + x->parent->left = y; + } + else { // 如果 x 是右子节点 + x->parent->right = y; + } + // 调整 x 与 y 的关系 + y->left = x; + x->parent = y; +} + +/*----------------------------------------*\ +| p p | +| / \ / \ | +| d x rotate right d y | +| / \ ===========> / \ | +| y a b x | +| / \ / \ | +| b c c a | +\*----------------------------------------*/ +// 右旋,参数一为右旋点,参数二为根节点 +template +void rb_tree_rotate_right(NodePtr x, NodePtr& root) noexcept { + auto y = x->left; + x->left = y->right; + if (y->right) { + y->right->parent = x; + } + y->parent = x->parent; + + if (x == root) { // 如果 x 为根节点,让 y 顶替 x 成为根节点 + root = y; + } + else if (rb_tree_is_lchild(x)) { // 如果 x 是右子节点 + x->parent->left = y; + } + else { // 如果 x 是左子节点 + x->parent->right = y; + } + // 调整 x 与 y 的关系 + y->right = x; + x->parent = y; +} + +// 插入节点后使 rb tree 重新平衡,参数一为新增节点,参数二为根节点 +// +// case 1: 新增节点位于根节点,令新增节点为黑 +// case 2: 新增节点的父节点为黑,没有破坏平衡,直接返回 +// case 3: 父节点和叔叔节点都为红,令父节点和叔叔节点为黑,祖父节点为红, +// 然后令祖父节点为当前节点,继续处理 +// case 4: 父节点为红,叔叔节点为 NIL +// 或黑色,父节点为左(右)孩子,当前节点为右(左)孩子, +// 让父节点成为当前节点,再以当前节点为支点左(右)旋 +// case 5: 父节点为红,叔叔节点为 NIL +// 或黑色,父节点为左(右)孩子,当前节点为左(右)孩子, +// 让父节点变为黑色,祖父节点变为红色,以祖父节点为支点右(左)旋 +// +// 参考博客: http://blog.csdn.net/v_JULY_v/article/details/6105630 +// http://blog.csdn.net/v_JULY_v/article/details/6109153 +template +void rb_tree_insert_rebalance(NodePtr x, NodePtr& root) noexcept { + rb_tree_set_red(x); // 新增节点为红色 + while (x != root && rb_tree_is_red(x->parent)) { + if (rb_tree_is_lchild(x->parent)) { // 如果父节点是左子节点 + auto uncle = x->parent->parent->right; + if (uncle != nullptr + && rb_tree_is_red(uncle)) { // case 3: 父节点和叔叔节点都为红 + rb_tree_set_black(x->parent); + rb_tree_set_black(uncle); + x = x->parent->parent; + rb_tree_set_red(x); + } + else { // 无叔叔节点或叔叔节点为黑 + if (!rb_tree_is_lchild(x)) { // case 4: 当前节点 x 为右子节点 + x = x->parent; + rb_tree_rotate_left(x, root); + } + // 都转换成 case 5: 当前节点为左子节点 + rb_tree_set_black(x->parent); + rb_tree_set_red(x->parent->parent); + rb_tree_rotate_right(x->parent->parent, root); + break; + } + } + else // 如果父节点是右子节点,对称处理 + { + auto uncle = x->parent->parent->left; + if (uncle != nullptr + && rb_tree_is_red(uncle)) { // case 3: 父节点和叔叔节点都为红 + rb_tree_set_black(x->parent); + rb_tree_set_black(uncle); + x = x->parent->parent; + rb_tree_set_red(x); + // 此时祖父节点为红,可能会破坏红黑树的性质,令当前节点为祖父节点,继续处理 + } + else { // 无叔叔节点或叔叔节点为黑 + if (rb_tree_is_lchild(x)) { // case 4: 当前节点 x 为左子节点 + x = x->parent; + rb_tree_rotate_right(x, root); + } + // 都转换成 case 5: 当前节点为左子节点 + rb_tree_set_black(x->parent); + rb_tree_set_red(x->parent->parent); + rb_tree_rotate_left(x->parent->parent, root); + break; + } + } + } + rb_tree_set_black(root); // 根节点永远为黑 +} + +// 删除节点后使 rb tree +// 重新平衡,参数一为要删除的节点,参数二为根节点,参数三为最小节点,参数四为最大节点 +// +// 参考博客: http://blog.csdn.net/v_JULY_v/article/details/6105630 +// http://blog.csdn.net/v_JULY_v/article/details/6109153 +template +NodePtr rb_tree_erase_rebalance(NodePtr z, NodePtr& root, NodePtr& leftmost, + NodePtr& rightmost) { + // y 是可能的替换节点,指向最终要删除的节点 + auto y = (z->left == nullptr || z->right == nullptr) ? z : rb_tree_next(z); + // x 是 y 的一个独子节点或 NIL 节点 + auto x = y->left != nullptr ? y->left : y->right; + // xp 为 x 的父节点 + NodePtr xp = nullptr; + + // y != z 说明 z 有两个非空子节点,此时 y 指向 z 右子树的最左节点,x + // 指向 y 的右子节点。 用 y 顶替 z 的位置,用 x 顶替 y 的位置,最后用 y + // 指向 z + if (y != z) { + z->left->parent = y; + y->left = z->left; + + // 如果 y 不是 z 的右子节点,那么 z 的右子节点一定有左孩子 + if (y != z->right) { // x 替换 y 的位置 + xp = y->parent; + if (x != nullptr) { + x->parent = y->parent; + } + + y->parent->left = x; + y->right = z->right; + z->right->parent = y; + } + else { + xp = y; + } + + // 连接 y 与 z 的父节点 + if (root == z) { + root = y; + } + else if (rb_tree_is_lchild(z)) { + z->parent->left = y; + } + else { + z->parent->right = y; + } + y->parent = z->parent; + mystl::swap(y->color, z->color); + y = z; + } + // y == z 说明 z 至多只有一个孩子 + else { + xp = y->parent; + if (x) { + x->parent = y->parent; + } + + // 连接 x 与 z 的父节点 + if (root == z) { + root = x; + } + else if (rb_tree_is_lchild(z)) { + z->parent->left = x; + } + else { + z->parent->right = x; + } + + // 此时 z 有可能是最左节点或最右节点,更新数据 + if (leftmost == z) { + leftmost = x == nullptr ? xp : rb_tree_min(x); + } + if (rightmost == z) { + rightmost = x == nullptr ? xp : rb_tree_max(x); + } + } + + // 此时,y 指向要删除的节点,x 为替代节点,从 x 节点开始调整。 + // 如果删除的节点为红色,树的性质没有被破坏,否则按照以下情况调整(x + // 为左子节点为例): case 1: + // 兄弟节点为红色,令父节点为红,兄弟节点为黑,进行左(右)旋,继续处理 + // case 2: 兄弟节点为黑色,且两个子节点都为黑色或 + // NIL,令兄弟节点为红,父节点成为当前节点,继续处理 case 3: + // 兄弟节点为黑色,左子节点为红色或 NIL,右子节点为黑色或 NIL, + // 令兄弟节点为红,兄弟节点的左子节点为黑,以兄弟节点为支点右(左)旋,继续处理 + // case 4: + // 兄弟节点为黑色,右子节点为红色,令兄弟节点为父节点的颜色,父节点为黑色,兄弟节点的右子节点 + // 为黑色,以父节点为支点左(右)旋,树的性质调整完成,算法结束 + if (!rb_tree_is_red(y)) { // x 为黑色时,调整,否则直接将 x 变为黑色即可 + while (x != root && (x == nullptr || !rb_tree_is_red(x))) { + if (x == xp->left) { // 如果 x 为左子节点 + auto brother = xp->right; + if (rb_tree_is_red(brother)) { // case 1 + rb_tree_set_black(brother); + rb_tree_set_red(xp); + rb_tree_rotate_left(xp, root); + brother = xp->right; + } + // case 1 转为为了 case 2、3、4 中的一种 + if ((brother->left == nullptr || !rb_tree_is_red(brother->left)) + && (brother->right == nullptr + || !rb_tree_is_red(brother->right))) { // case 2 + rb_tree_set_red(brother); + x = xp; + xp = xp->parent; + } + else { + if (brother->right == nullptr + || !rb_tree_is_red(brother->right)) { // case 3 + if (brother->left != nullptr) { + rb_tree_set_black(brother->left); + } + rb_tree_set_red(brother); + rb_tree_rotate_right(brother, root); + brother = xp->right; + } + // 转为 case 4 + brother->color = xp->color; + rb_tree_set_black(xp); + if (brother->right != nullptr) { + rb_tree_set_black(brother->right); + } + rb_tree_rotate_left(xp, root); + break; + } + } + else // x 为右子节点,对称处理 + { + auto brother = xp->left; + if (rb_tree_is_red(brother)) { // case 1 + rb_tree_set_black(brother); + rb_tree_set_red(xp); + rb_tree_rotate_right(xp, root); + brother = xp->left; + } + if ((brother->left == nullptr || !rb_tree_is_red(brother->left)) + && (brother->right == nullptr + || !rb_tree_is_red(brother->right))) { // case 2 + rb_tree_set_red(brother); + x = xp; + xp = xp->parent; + } + else { + if (brother->left == nullptr + || !rb_tree_is_red(brother->left)) { // case 3 + if (brother->right != nullptr) { + rb_tree_set_black(brother->right); + } + rb_tree_set_red(brother); + rb_tree_rotate_left(brother, root); + brother = xp->left; + } + // 转为 case 4 + brother->color = xp->color; + rb_tree_set_black(xp); + if (brother->left != nullptr) { + rb_tree_set_black(brother->left); + } + rb_tree_rotate_right(xp, root); + break; + } + } + } + if (x != nullptr) { + rb_tree_set_black(x); + } + } + return y; +} + +// 模板类 rb_tree +// 参数一代表数据类型,参数二代表键值比较类型 +template +class rb_tree { +public: + // rb_tree 的嵌套型别定义 + + typedef rb_tree_traits tree_traits; + typedef rb_tree_value_traits value_traits; + + typedef typename tree_traits::base_type base_type; + typedef typename tree_traits::base_ptr base_ptr; + typedef typename tree_traits::node_type node_type; + typedef typename tree_traits::node_ptr node_ptr; + typedef typename tree_traits::key_type key_type; + typedef typename tree_traits::mapped_type mapped_type; + typedef typename tree_traits::value_type value_type; + typedef Compare key_compare; + + typedef mystl::allocator allocator_type; + typedef mystl::allocator data_allocator; + typedef mystl::allocator base_allocator; + typedef mystl::allocator node_allocator; + + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + + typedef rb_tree_iterator iterator; + typedef rb_tree_const_iterator const_iterator; + typedef mystl::reverse_iterator reverse_iterator; + typedef mystl::reverse_iterator const_reverse_iterator; + + allocator_type get_allocator() const { + return node_allocator(); + } + + key_compare key_comp() const { + return key_comp_; + } + +private: + // 用以下三个数据表现 rb tree + base_ptr header_; // 特殊节点,与根节点互为对方的父节点 + size_type node_count_; // 节点数 + key_compare key_comp_; // 节点键值比较的准则 + +private: + // 以下三个函数用于取得根节点,最小节点和最大节点 + base_ptr& root() const { + return header_->parent; + } + + base_ptr& leftmost() const { + return header_->left; + } + + base_ptr& rightmost() const { + return header_->right; + } + +public: + // 构造、复制、析构函数 + rb_tree() { + rb_tree_init(); + } + + rb_tree(const rb_tree& rhs); + rb_tree(rb_tree&& rhs) noexcept; + + rb_tree& operator=(const rb_tree& rhs); + rb_tree& operator=(rb_tree&& rhs); + + ~rb_tree() { + clear(); + } + +public: + // 迭代器相关操作 + + iterator begin() noexcept { + return leftmost(); + } + + const_iterator begin() const noexcept { + return leftmost(); + } + + iterator end() noexcept { + return header_; + } + + const_iterator end() const noexcept { + return header_; + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关操作 + + bool empty() const noexcept { + return node_count_ == 0; + } + + size_type size() const noexcept { + return node_count_; + } + + size_type max_size() const noexcept { + return static_cast(-1); + } + + // 插入删除相关操作 + + // emplace + + template + iterator emplace_multi(Args&&... args); + + template + mystl::pair emplace_unique(Args&&... args); + + template + iterator emplace_multi_use_hint(iterator hint, Args&&... args); + + template + iterator emplace_unique_use_hint(iterator hint, Args&&... args); + + // insert + + iterator insert_multi(const value_type& value); + + iterator insert_multi(value_type&& value) { + return emplace_multi(mystl::move(value)); + } + + iterator insert_multi(iterator hint, const value_type& value) { + return emplace_multi_use_hint(hint, value); + } + + iterator insert_multi(iterator hint, value_type&& value) { + return emplace_multi_use_hint(hint, mystl::move(value)); + } + + template + void insert_multi(InputIterator first, InputIterator last) { + size_type n = mystl::distance(first, last); + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - n, + "rb_tree's size too big"); + for (; n > 0; --n, ++first) { + insert_multi(end(), *first); + } + } + + mystl::pair insert_unique(const value_type& value); + + mystl::pair insert_unique(value_type&& value) { + return emplace_unique(mystl::move(value)); + } + + iterator insert_unique(iterator hint, const value_type& value) { + return emplace_unique_use_hint(hint, value); + } + + iterator insert_unique(iterator hint, value_type&& value) { + return emplace_unique_use_hint(hint, mystl::move(value)); + } + + template + void insert_unique(InputIterator first, InputIterator last) { + size_type n = mystl::distance(first, last); + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - n, + "rb_tree's size too big"); + for (; n > 0; --n, ++first) { + insert_unique(end(), *first); + } + } + + // erase + + iterator erase(iterator hint); + + size_type erase_multi(const key_type& key); + size_type erase_unique(const key_type& key); + + void erase(iterator first, iterator last); + + void clear(); + + // rb_tree 相关操作 + + iterator find(const key_type& key); + const_iterator find(const key_type& key) const; + + size_type count_multi(const key_type& key) const { + auto p = equal_range_multi(key); + return static_cast(mystl::distance(p.first, p.second)); + } + + size_type count_unique(const key_type& key) const { + return find(key) != end() ? 1 : 0; + } + + iterator lower_bound(const key_type& key); + const_iterator lower_bound(const key_type& key) const; + + iterator upper_bound(const key_type& key); + const_iterator upper_bound(const key_type& key) const; + + mystl::pair equal_range_multi(const key_type& key) { + return mystl::pair(lower_bound(key), + upper_bound(key)); + } + + mystl::pair + equal_range_multi(const key_type& key) const { + return mystl::pair(lower_bound(key), + upper_bound(key)); + } + + mystl::pair equal_range_unique(const key_type& key) { + iterator it = find(key); + auto next = it; + return it == end() ? mystl::make_pair(it, it) + : mystl::make_pair(it, ++next); + } + + mystl::pair + equal_range_unique(const key_type& key) const { + const_iterator it = find(key); + auto next = it; + return it == end() ? mystl::make_pair(it, it) + : mystl::make_pair(it, ++next); + } + + void swap(rb_tree& rhs) noexcept; + +private: + // node related + template + node_ptr create_node(Args&&... args); + node_ptr clone_node(base_ptr x); + void destroy_node(node_ptr p); + + // init / reset + void rb_tree_init(); + void reset(); + + // get insert pos + mystl::pair get_insert_multi_pos(const key_type& key); + mystl::pair, bool> + get_insert_unique_pos(const key_type& key); + + // insert value / insert node + iterator + insert_value_at(base_ptr x, const value_type& value, bool add_to_left); + iterator insert_node_at(base_ptr x, node_ptr node, bool add_to_left); + + // insert use hint + iterator insert_multi_use_hint(iterator hint, key_type key, node_ptr node); + iterator insert_unique_use_hint(iterator hint, key_type key, node_ptr node); + + // copy tree / erase tree + base_ptr copy_from(base_ptr x, base_ptr p); + void erase_since(base_ptr x); +}; + +/*****************************************************************************************/ + +// 复制构造函数 +template +rb_tree::rb_tree(const rb_tree& rhs) { + rb_tree_init(); + if (rhs.node_count_ != 0) { + root() = copy_from(rhs.root(), header_); + leftmost() = rb_tree_min(root()); + rightmost() = rb_tree_max(root()); + } + node_count_ = rhs.node_count_; + key_comp_ = rhs.key_comp_; +} + +// 移动构造函数 +template +rb_tree::rb_tree(rb_tree&& rhs) noexcept + : header_(mystl::move(rhs.header_)), + node_count_(rhs.node_count_), + key_comp_(rhs.key_comp_) { + rhs.reset(); +} + +// 复制赋值操作符 +template +rb_tree& rb_tree::operator=(const rb_tree& rhs) { + if (this != &rhs) { + clear(); + + if (rhs.node_count_ != 0) { + root() = copy_from(rhs.root(), header_); + leftmost() = rb_tree_min(root()); + rightmost() = rb_tree_max(root()); + } + + node_count_ = rhs.node_count_; + key_comp_ = rhs.key_comp_; + } + return *this; +} + +// 移动赋值操作符 +template +rb_tree& rb_tree::operator=(rb_tree&& rhs) { + clear(); + header_ = mystl::move(rhs.header_); + node_count_ = rhs.node_count_; + key_comp_ = rhs.key_comp_; + rhs.reset(); + return *this; +} + +// 就地插入元素,键值允许重复 +template +template +typename rb_tree::iterator +rb_tree::emplace_multi(Args&&... args) { + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - 1, + "rb_tree's size too big"); + node_ptr np = create_node(mystl::forward(args)...); + auto res = get_insert_multi_pos(value_traits::get_key(np->value)); + return insert_node_at(res.first, np, res.second); +} + +// 就地插入元素,键值不允许重复 +template +template +mystl::pair::iterator, bool> +rb_tree::emplace_unique(Args&&... args) { + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - 1, + "rb_tree's size too big"); + node_ptr np = create_node(mystl::forward(args)...); + auto res = get_insert_unique_pos(value_traits::get_key(np->value)); + if (res.second) { // 插入成功 + return mystl::make_pair(insert_node_at(res.first.first, np, + res.first.second), + true); + } + destroy_node(np); + return mystl::make_pair(iterator(res.first.first), false); +} + +// 就地插入元素,键值允许重复,当 hint +// 位置与插入位置接近时,插入操作的时间复杂度可以降低 +template +template +typename rb_tree::iterator +rb_tree::emplace_multi_use_hint(iterator hint, Args&&... args) { + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - 1, + "rb_tree's size too big"); + node_ptr np = create_node(mystl::forward(args)...); + if (node_count_ == 0) { + return insert_node_at(header_, np, true); + } + key_type key = value_traits::get_key(np->value); + if (hint == begin()) { // 位于 begin 处 + if (key_comp_(key, value_traits::get_key(*hint))) { + return insert_node_at(hint.node, np, true); + } + else { + auto pos = get_insert_multi_pos(key); + return insert_node_at(pos.first, np, pos.second); + } + } + else if (hint == end()) { // 位于 end 处 + if (!key_comp_( + key, value_traits::get_key(rightmost()->get_node_ptr()->value))) { + return insert_node_at(rightmost(), np, false); + } + else { + auto pos = get_insert_multi_pos(key); + return insert_node_at(pos.first, np, pos.second); + } + } + return insert_multi_use_hint(hint, key, np); +} + +// 就地插入元素,键值不允许重复,当 hint +// 位置与插入位置接近时,插入操作的时间复杂度可以降低 +template +template +typename rb_tree::iterator +rb_tree::emplace_unique_use_hint(iterator hint, Args&&... args) { + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - 1, + "rb_tree's size too big"); + node_ptr np = create_node(mystl::forward(args)...); + if (node_count_ == 0) { + return insert_node_at(header_, np, true); + } + key_type key = value_traits::get_key(np->value); + if (hint == begin()) { // 位于 begin 处 + if (key_comp_(key, value_traits::get_key(*hint))) { + return insert_node_at(hint.node, np, true); + } + else { + auto pos = get_insert_unique_pos(key); + if (!pos.second) { + destroy_node(np); + return pos.first.first; + } + return insert_node_at(pos.first.first, np, pos.first.second); + } + } + else if (hint == end()) { // 位于 end 处 + if (key_comp_(value_traits::get_key(rightmost()->get_node_ptr()->value), + key)) { + return insert_node_at(rightmost(), np, false); + } + else { + auto pos = get_insert_unique_pos(key); + if (!pos.second) { + destroy_node(np); + return pos.first.first; + } + return insert_node_at(pos.first.first, np, pos.first.second); + } + } + return insert_unique_use_hint(hint, key, np); +} + +// 插入元素,节点键值允许重复 +template +typename rb_tree::iterator +rb_tree::insert_multi(const value_type& value) { + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - 1, + "rb_tree's size too big"); + auto res = get_insert_multi_pos(value_traits::get_key(value)); + return insert_value_at(res.first, value, res.second); +} + +// 插入新值,节点键值不允许重复,返回一个 pair,若插入成功,pair +// 的第二参数为 true,否则为 false +template +mystl::pair::iterator, bool> +rb_tree::insert_unique(const value_type& value) { + THROW_LENGTH_ERROR_IF(node_count_ > max_size() - 1, + "rb_tree's size too big"); + auto res = get_insert_unique_pos(value_traits::get_key(value)); + if (res.second) { // 插入成功 + return mystl::make_pair(insert_value_at(res.first.first, value, + res.first.second), + true); + } + return mystl::make_pair(res.first.first, false); +} + +// 删除 hint 位置的节点 +template +typename rb_tree::iterator +rb_tree::erase(iterator hint) { + auto node = hint.node->get_node_ptr(); + iterator next(node); + ++next; + + rb_tree_erase_rebalance(hint.node, root(), leftmost(), rightmost()); + destroy_node(node); + --node_count_; + return next; +} + +// 删除键值等于 key 的元素,返回删除的个数 +template +typename rb_tree::size_type +rb_tree::erase_multi(const key_type& key) { + auto p = equal_range_multi(key); + size_type n = mystl::distance(p.first, p.second); + erase(p.first, p.second); + return n; +} + +// 删除键值等于 key 的元素,返回删除的个数 +template +typename rb_tree::size_type +rb_tree::erase_unique(const key_type& key) { + auto it = find(key); + if (it != end()) { + erase(it); + return 1; + } + return 0; +} + +// 删除[first, last)区间内的元素 +template +void rb_tree::erase(iterator first, iterator last) { + if (first == begin() && last == end()) { + clear(); + } + else { + while (first != last) { + erase(first++); + } + } +} + +// 清空 rb tree +template +void rb_tree::clear() { + if (node_count_ != 0) { + erase_since(root()); + leftmost() = header_; + root() = nullptr; + rightmost() = header_; + node_count_ = 0; + } +} + +// 查找键值为 k 的节点,返回指向它的迭代器 +template +typename rb_tree::iterator +rb_tree::find(const key_type& key) { + auto y = header_; // 最后一个不小于 key 的节点 + auto x = root(); + while (x != nullptr) { + if (!key_comp_(value_traits::get_key(x->get_node_ptr()->value), + key)) { // key 小于等于 x 键值,向左走 + y = x, x = x->left; + } + else { // key 大于 x 键值,向右走 + x = x->right; + } + } + iterator j = iterator(y); + return (j == end() || key_comp_(key, value_traits::get_key(*j))) ? end() + : j; +} + +template +typename rb_tree::const_iterator +rb_tree::find(const key_type& key) const { + auto y = header_; // 最后一个不小于 key 的节点 + auto x = root(); + while (x != nullptr) { + if (!key_comp_(value_traits::get_key(x->get_node_ptr()->value), + key)) { // key 小于等于 x 键值,向左走 + y = x, x = x->left; + } + else { // key 大于 x 键值,向右走 + x = x->right; + } + } + const_iterator j = const_iterator(y); + return (j == end() || key_comp_(key, value_traits::get_key(*j))) ? end() + : j; +} + +// 键值不小于 key 的第一个位置 +template +typename rb_tree::iterator +rb_tree::lower_bound(const key_type& key) { + auto y = header_; + auto x = root(); + while (x != nullptr) { + if (!key_comp_(value_traits::get_key(x->get_node_ptr()->value), + key)) { // key <= x + y = x, x = x->left; + } + else { + x = x->right; + } + } + return iterator(y); +} + +template +typename rb_tree::const_iterator +rb_tree::lower_bound(const key_type& key) const { + auto y = header_; + auto x = root(); + while (x != nullptr) { + if (!key_comp_(value_traits::get_key(x->get_node_ptr()->value), + key)) { // key <= x + y = x, x = x->left; + } + else { + x = x->right; + } + } + return const_iterator(y); +} + +// 键值不小于 key 的最后一个位置 +template +typename rb_tree::iterator +rb_tree::upper_bound(const key_type& key) { + auto y = header_; + auto x = root(); + while (x != nullptr) { + if (key_comp_(key, value_traits::get_key( + x->get_node_ptr()->value))) { // key < x + y = x, x = x->left; + } + else { + x = x->right; + } + } + return iterator(y); +} + +template +typename rb_tree::const_iterator +rb_tree::upper_bound(const key_type& key) const { + auto y = header_; + auto x = root(); + while (x != nullptr) { + if (key_comp_(key, value_traits::get_key( + x->get_node_ptr()->value))) { // key < x + y = x, x = x->left; + } + else { + x = x->right; + } + } + return const_iterator(y); +} + +// 交换 rb tree +template +void rb_tree::swap(rb_tree& rhs) noexcept { + if (this != &rhs) { + mystl::swap(header_, rhs.header_); + mystl::swap(node_count_, rhs.node_count_); + mystl::swap(key_comp_, rhs.key_comp_); + } +} + +/*****************************************************************************************/ +// helper function + +// 创建一个结点 +template +template +typename rb_tree::node_ptr +rb_tree::create_node(Args&&... args) { + auto tmp = node_allocator::allocate(1); + try { + data_allocator::construct(mystl::address_of(tmp->value), + mystl::forward(args)...); + tmp->left = nullptr; + tmp->right = nullptr; + tmp->parent = nullptr; + } catch (...) { + node_allocator::deallocate(tmp); + throw; + } + return tmp; +} + +// 复制一个结点 +template +typename rb_tree::node_ptr +rb_tree::clone_node(base_ptr x) { + node_ptr tmp = create_node(x->get_node_ptr()->value); + tmp->color = x->color; + tmp->left = nullptr; + tmp->right = nullptr; + return tmp; +} + +// 销毁一个结点 +template +void rb_tree::destroy_node(node_ptr p) { + data_allocator::destroy(&p->value); + node_allocator::deallocate(p); +} + +// 初始化容器 +template +void rb_tree::rb_tree_init() { + header_ = base_allocator::allocate(1); + header_->color = rb_tree_red; // header_ 节点颜色为红,与 root 区分 + root() = nullptr; + leftmost() = header_; + rightmost() = header_; + node_count_ = 0; +} + +// reset 函数 +template +void rb_tree::reset() { + header_ = nullptr; + node_count_ = 0; +} + +// get_insert_multi_pos 函数 +template +mystl::pair::base_ptr, bool> +rb_tree::get_insert_multi_pos(const key_type& key) { + auto x = root(); + auto y = header_; + bool add_to_left = true; + while (x != nullptr) { + y = x; + add_to_left + = key_comp_(key, value_traits::get_key(x->get_node_ptr()->value)); + x = add_to_left ? x->left : x->right; + } + return mystl::make_pair(y, add_to_left); +} + +// get_insert_unique_pos 函数 +template +mystl::pair::base_ptr, bool>, bool> +rb_tree::get_insert_unique_pos( + const key_type& + key) { // 返回一个 pair,第一个值为一个 + // pair,包含插入点的父节点和一个 bool 表示是否在左边插入, + // 第二个值为一个 bool,表示是否插入成功 + auto x = root(); + auto y = header_; + bool add_to_left = true; // 树为空时也在 header_ 左边插入 + while (x != nullptr) { + y = x; + add_to_left + = key_comp_(key, value_traits::get_key(x->get_node_ptr()->value)); + x = add_to_left ? x->left : x->right; + } + iterator j = iterator(y); // 此时 y 为插入点的父节点 + if (add_to_left) { + if ( + y == header_ + || j == begin()) { // 如果树为空树或插入点在最左节点处,肯定可以插入新的节点 + return mystl::make_pair(mystl::make_pair(y, true), true); + } + else { // 否则,如果存在重复节点,那么 --j 就是重复的值 + --j; + } + } + if (key_comp_(value_traits::get_key(*j), key)) { // 表明新节点没有重复 + return mystl::make_pair(mystl::make_pair(y, add_to_left), true); + } + // 进行至此,表示新节点与现有节点键值重复 + return mystl::make_pair(mystl::make_pair(y, add_to_left), false); +} + +// insert_value_at 函数 +// x 为插入点的父节点, value 为要插入的值,add_to_left 表示是否在左边插入 +template +typename rb_tree::iterator +rb_tree::insert_value_at(base_ptr x, const value_type& value, + bool add_to_left) { + node_ptr node = create_node(value); + node->parent = x; + auto base_node = node->get_base_ptr(); + if (x == header_) { + root() = base_node; + leftmost() = base_node; + rightmost() = base_node; + } + else if (add_to_left) { + x->left = base_node; + if (leftmost() == x) { + leftmost() = base_node; + } + } + else { + x->right = base_node; + if (rightmost() == x) { + rightmost() = base_node; + } + } + rb_tree_insert_rebalance(base_node, root()); + ++node_count_; + return iterator(node); +} + +// 在 x 节点处插入新的节点 +// x 为插入点的父节点, node 为要插入的节点,add_to_left 表示是否在左边插入 +template +typename rb_tree::iterator +rb_tree::insert_node_at(base_ptr x, node_ptr node, + bool add_to_left) { + node->parent = x; + auto base_node = node->get_base_ptr(); + if (x == header_) { + root() = base_node; + leftmost() = base_node; + rightmost() = base_node; + } + else if (add_to_left) { + x->left = base_node; + if (leftmost() == x) { + leftmost() = base_node; + } + } + else { + x->right = base_node; + if (rightmost() == x) { + rightmost() = base_node; + } + } + rb_tree_insert_rebalance(base_node, root()); + ++node_count_; + return iterator(node); +} + +// 插入元素,键值允许重复,使用 hint +template +typename rb_tree::iterator +rb_tree::insert_multi_use_hint(iterator hint, key_type key, + node_ptr node) { + // 在 hint 附近寻找可插入的位置 + auto np = hint.node; + auto before = hint; + --before; + auto bnp = before.node; + if (!key_comp_(key, value_traits::get_key(*before)) + && !key_comp_(value_traits::get_key(*hint), + key)) { // before <= node <= hint + if (bnp->right == nullptr) { + return insert_node_at(bnp, node, false); + } + else if (np->left == nullptr) { + return insert_node_at(np, node, true); + } + } + auto pos = get_insert_multi_pos(key); + return insert_node_at(pos.first, node, pos.second); +} + +// 插入元素,键值不允许重复,使用 hint +template +typename rb_tree::iterator +rb_tree::insert_unique_use_hint(iterator hint, key_type key, + node_ptr node) { + // 在 hint 附近寻找可插入的位置 + auto np = hint.node; + auto before = hint; + --before; + auto bnp = before.node; + if (key_comp_(value_traits::get_key(*before), key) + && key_comp_(key, + value_traits::get_key(*hint))) { // before < node < hint + if (bnp->right == nullptr) { + return insert_node_at(bnp, node, false); + } + else if (np->left == nullptr) { + return insert_node_at(np, node, true); + } + } + auto pos = get_insert_unique_pos(key); + if (!pos.second) { + destroy_node(node); + return pos.first.first; + } + return insert_node_at(pos.first.first, node, pos.first.second); +} + +// copy_from 函数 +// 递归复制一颗树,节点从 x 开始,p 为 x 的父节点 +template +typename rb_tree::base_ptr +rb_tree::copy_from(base_ptr x, base_ptr p) { + auto top = clone_node(x); + top->parent = p; + try { + if (x->right) { + top->right = copy_from(x->right, top); + } + p = top; + x = x->left; + while (x != nullptr) { + auto y = clone_node(x); + p->left = y; + y->parent = p; + if (x->right) { + y->right = copy_from(x->right, y); + } + p = y; + x = x->left; + } + } catch (...) { + erase_since(top); + throw; + } + return top; +} + +// erase_since 函数 +// 从 x 节点开始删除该节点及其子树 +template +void rb_tree::erase_since(base_ptr x) { + while (x != nullptr) { + erase_since(x->right); + auto y = x->left; + destroy_node(x->get_node_ptr()); + x = y; + } +} + +// 重载比较操作符 +template +bool operator==(const rb_tree& lhs, + const rb_tree& rhs) { + return lhs.size() == rhs.size() + && mystl::equal(lhs.begin(), lhs.end(), rhs.begin()); +} + +template +bool operator<(const rb_tree& lhs, const rb_tree& rhs) { + return mystl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), + rhs.end()); +} + +template +bool operator!=(const rb_tree& lhs, + const rb_tree& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const rb_tree& lhs, const rb_tree& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const rb_tree& lhs, + const rb_tree& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const rb_tree& lhs, + const rb_tree& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(rb_tree& lhs, rb_tree& rhs) noexcept { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_RB_TREE */ diff --git a/src/libcxx/include/set b/src/libcxx/include/set new file mode 100644 index 000000000..e73fb1e2f --- /dev/null +++ b/src/libcxx/include/set @@ -0,0 +1,611 @@ + +/** + * @file set + * @brief stl set 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_SET +#define SIMPLEKERNEL_SET + +// 这个头文件包含两个模板类 set 和 multiset +// set : 集合,键值即实值,集合内元素会自动排序,键值不允许重复 +// multiset : 集合,键值即实值,集合内元素会自动排序,键值允许重复 + +// notes: +// +// 异常保证: +// std::set / std::multiset +// 满足基本异常保证,对以下等函数做强异常安全保证: +// * emplace +// * emplace_hint +// * insert + +#include "rb_tree" + +namespace mystl { + +// 模板类 set,键值不允许重复 +// 参数一代表键值类型,参数二代表键值比较方式,缺省使用 mystl::less +template > +class set { +public: + typedef Key key_type; + typedef Key value_type; + typedef Compare key_compare; + typedef Compare value_compare; + +private: + // 以 mystl::rb_tree 作为底层机制 + typedef mystl::rb_tree base_type; + base_type tree_; + +public: + // 使用 rb_tree 定义的型别 + typedef typename base_type::node_type node_type; + typedef typename base_type::const_pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::const_reference reference; + typedef typename base_type::const_reference const_reference; + typedef typename base_type::const_iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::const_reverse_iterator reverse_iterator; + typedef typename base_type::const_reverse_iterator const_reverse_iterator; + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::allocator_type allocator_type; + +public: + // 构造、复制、移动函数 + set() = default; + + template + set(InputIterator first, InputIterator last) : tree_() { + tree_.insert_unique(first, last); + } + + set(std::initializer_list ilist) : tree_() { + tree_.insert_unique(ilist.begin(), ilist.end()); + } + + set(const set& rhs) : tree_(rhs.tree_) { + } + + set(set&& rhs) noexcept : tree_(mystl::move(rhs.tree_)) { + } + + set& operator=(const set& rhs) { + tree_ = rhs.tree_; + return *this; + } + + set& operator=(set&& rhs) { + tree_ = mystl::move(rhs.tree_); + return *this; + } + + set& operator=(std::initializer_list ilist) { + tree_.clear(); + tree_.insert_unique(ilist.begin(), ilist.end()); + return *this; + } + + // 相关接口 + + key_compare key_comp() const { + return tree_.key_comp(); + } + + value_compare value_comp() const { + return tree_.key_comp(); + } + + allocator_type get_allocator() const { + return tree_.get_allocator(); + } + + // 迭代器相关 + + iterator begin() noexcept { + return tree_.begin(); + } + + const_iterator begin() const noexcept { + return tree_.begin(); + } + + iterator end() noexcept { + return tree_.end(); + } + + const_iterator end() const noexcept { + return tree_.end(); + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关 + bool empty() const noexcept { + return tree_.empty(); + } + + size_type size() const noexcept { + return tree_.size(); + } + + size_type max_size() const noexcept { + return tree_.max_size(); + } + + // 插入删除操作 + + template + pair emplace(Args&&... args) { + return tree_.emplace_unique(mystl::forward(args)...); + } + + template + iterator emplace_hint(iterator hint, Args&&... args) { + return tree_.emplace_unique_use_hint(hint, + mystl::forward(args)...); + } + + pair insert(const value_type& value) { + return tree_.insert_unique(value); + } + + pair insert(value_type&& value) { + return tree_.insert_unique(mystl::move(value)); + } + + iterator insert(iterator hint, const value_type& value) { + return tree_.insert_unique(hint, value); + } + + iterator insert(iterator hint, value_type&& value) { + return tree_.insert_unique(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + tree_.insert_unique(first, last); + } + + void erase(iterator position) { + tree_.erase(position); + } + + size_type erase(const key_type& key) { + return tree_.erase_unique(key); + } + + void erase(iterator first, iterator last) { + tree_.erase(first, last); + } + + void clear() { + tree_.clear(); + } + + // set 相关操作 + + iterator find(const key_type& key) { + return tree_.find(key); + } + + const_iterator find(const key_type& key) const { + return tree_.find(key); + } + + size_type count(const key_type& key) const { + return tree_.count_unique(key); + } + + iterator lower_bound(const key_type& key) { + return tree_.lower_bound(key); + } + + const_iterator lower_bound(const key_type& key) const { + return tree_.lower_bound(key); + } + + iterator upper_bound(const key_type& key) { + return tree_.upper_bound(key); + } + + const_iterator upper_bound(const key_type& key) const { + return tree_.upper_bound(key); + } + + pair equal_range(const key_type& key) { + return tree_.equal_range_unique(key); + } + + pair + equal_range(const key_type& key) const { + return tree_.equal_range_unique(key); + } + + void swap(set& rhs) noexcept { + tree_.swap(rhs.tree_); + } + +public: + friend bool operator==(const set& lhs, const set& rhs) { + return lhs.tree_ == rhs.tree_; + } + + friend bool operator<(const set& lhs, const set& rhs) { + return lhs.tree_ < rhs.tree_; + } +}; + +// 重载比较操作符 +template +bool operator==(const set& lhs, const set& rhs) { + return lhs == rhs; +} + +template +bool operator<(const set& lhs, const set& rhs) { + return lhs < rhs; +} + +template +bool operator!=(const set& lhs, const set& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const set& lhs, const set& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const set& lhs, const set& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const set& lhs, const set& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(set& lhs, set& rhs) noexcept { + lhs.swap(rhs); +} + +/*****************************************************************************************/ + +// 模板类 multiset,键值允许重复 +// 参数一代表键值类型,参数二代表键值比较方式,缺省使用 mystl::less +template > +class multiset { +public: + typedef Key key_type; + typedef Key value_type; + typedef Compare key_compare; + typedef Compare value_compare; + +private: + // 以 mystl::rb_tree 作为底层机制 + typedef mystl::rb_tree base_type; + base_type tree_; // 以 rb_tree 表现 multiset + +public: + // 使用 rb_tree 定义的型别 + typedef typename base_type::node_type node_type; + typedef typename base_type::const_pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::const_reference reference; + typedef typename base_type::const_reference const_reference; + typedef typename base_type::const_iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::const_reverse_iterator reverse_iterator; + typedef typename base_type::const_reverse_iterator const_reverse_iterator; + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::allocator_type allocator_type; + +public: + // 构造、复制、移动函数 + multiset() = default; + + template + multiset(InputIterator first, InputIterator last) : tree_() { + tree_.insert_multi(first, last); + } + + multiset(std::initializer_list ilist) : tree_() { + tree_.insert_multi(ilist.begin(), ilist.end()); + } + + multiset(const multiset& rhs) : tree_(rhs.tree_) { + } + + multiset(multiset&& rhs) noexcept : tree_(mystl::move(rhs.tree_)) { + } + + multiset& operator=(const multiset& rhs) { + tree_ = rhs.tree_; + return *this; + } + + multiset& operator=(multiset&& rhs) { + tree_ = mystl::move(rhs.tree_); + return *this; + } + + multiset& operator=(std::initializer_list ilist) { + tree_.clear(); + tree_.insert_multi(ilist.begin(), ilist.end()); + return *this; + } + + // 相关接口 + + key_compare key_comp() const { + return tree_.key_comp(); + } + + value_compare value_comp() const { + return tree_.key_comp(); + } + + allocator_type get_allocator() const { + return tree_.get_allocator(); + } + + // 迭代器相关 + + iterator begin() noexcept { + return tree_.begin(); + } + + const_iterator begin() const noexcept { + return tree_.begin(); + } + + iterator end() noexcept { + return tree_.end(); + } + + const_iterator end() const noexcept { + return tree_.end(); + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关 + bool empty() const noexcept { + return tree_.empty(); + } + + size_type size() const noexcept { + return tree_.size(); + } + + size_type max_size() const noexcept { + return tree_.max_size(); + } + + // 插入删除操作 + + template + iterator emplace(Args&&... args) { + return tree_.emplace_multi(mystl::forward(args)...); + } + + template + iterator emplace_hint(iterator hint, Args&&... args) { + return tree_.emplace_multi_use_hint(hint, + mystl::forward(args)...); + } + + iterator insert(const value_type& value) { + return tree_.insert_multi(value); + } + + iterator insert(value_type&& value) { + return tree_.insert_multi(mystl::move(value)); + } + + iterator insert(iterator hint, const value_type& value) { + return tree_.insert_multi(hint, value); + } + + iterator insert(iterator hint, value_type&& value) { + return tree_.insert_multi(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + tree_.insert_multi(first, last); + } + + void erase(iterator position) { + tree_.erase(position); + } + + size_type erase(const key_type& key) { + return tree_.erase_multi(key); + } + + void erase(iterator first, iterator last) { + tree_.erase(first, last); + } + + void clear() { + tree_.clear(); + } + + // multiset 相关操作 + + iterator find(const key_type& key) { + return tree_.find(key); + } + + const_iterator find(const key_type& key) const { + return tree_.find(key); + } + + size_type count(const key_type& key) const { + return tree_.count_multi(key); + } + + iterator lower_bound(const key_type& key) { + return tree_.lower_bound(key); + } + + const_iterator lower_bound(const key_type& key) const { + return tree_.lower_bound(key); + } + + iterator upper_bound(const key_type& key) { + return tree_.upper_bound(key); + } + + const_iterator upper_bound(const key_type& key) const { + return tree_.upper_bound(key); + } + + pair equal_range(const key_type& key) { + return tree_.equal_range_multi(key); + } + + pair + equal_range(const key_type& key) const { + return tree_.equal_range_multi(key); + } + + void swap(multiset& rhs) noexcept { + tree_.swap(rhs.tree_); + } + +public: + friend bool operator==(const multiset& lhs, const multiset& rhs) { + return lhs.tree_ == rhs.tree_; + } + + friend bool operator<(const multiset& lhs, const multiset& rhs) { + return lhs.tree_ < rhs.tree_; + } +}; + +// 重载比较操作符 +template +bool operator==(const multiset& lhs, + const multiset& rhs) { + return lhs == rhs; +} + +template +bool operator<(const multiset& lhs, + const multiset& rhs) { + return lhs < rhs; +} + +template +bool operator!=(const multiset& lhs, + const multiset& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const multiset& lhs, + const multiset& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const multiset& lhs, + const multiset& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const multiset& lhs, + const multiset& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(multiset& lhs, multiset& rhs) noexcept { + lhs.swap(rhs); +} +}; // namespace mystl + +#endif /* SIMPLEKERNEL_SET */ diff --git a/src/libcxx/include/set_algo b/src/libcxx/include/set_algo new file mode 100644 index 000000000..951e552ed --- /dev/null +++ b/src/libcxx/include/set_algo @@ -0,0 +1,228 @@ + +/** + * @file set_algo + * @brief stl set_algo 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_SET_ALGO +#define SIMPLEKERNEL_SET_ALGO + +// 这个头文件包含 set 的四种算法: union, intersection, difference, +// symmetric_difference 所有函数都要求序列有序 + +#include "algobase" +#include "iterator" + +namespace mystl { + +/*****************************************************************************************/ +// set_union +// 计算 S1∪S2 的结果并保存到 result 中,返回一个迭代器指向输出结果的尾部 +/*****************************************************************************************/ +template +OutputIter set_union(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result) { + while (first1 != last1 && first2 != last2) { + if (*first1 < *first2) { + *result = *first1; + ++first1; + } + else if (*first2 < *first1) { + *result = *first2; + ++first2; + } + else { + *result = *first1; + ++first1; + ++first2; + } + ++result; + } + // 将剩余元素拷贝到 result + return mystl::copy(first2, last2, mystl::copy(first1, last1, result)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +OutputIter set_union(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result, Compared comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + *result = *first1; + ++first1; + } + else if (comp(*first2, *first1)) { + *result = *first2; + ++first2; + } + else { + *result = *first1; + ++first1; + ++first2; + } + ++result; + } + // 将剩余元素拷贝到 result + return mystl::copy(first2, last2, mystl::copy(first1, last1, result)); +} + +/*****************************************************************************************/ +// set_intersection +// 计算 S1∩S2 的结果并保存到 result 中,返回一个迭代器指向输出结果的尾部 +/*****************************************************************************************/ +template +OutputIter +set_intersection(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result) { + while (first1 != last1 && first2 != last2) { + if (*first1 < *first2) { + ++first1; + } + else if (*first2 < *first1) { + ++first2; + } + else { + *result = *first1; + ++first1; + ++first2; + ++result; + } + } + return result; +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +OutputIter +set_intersection(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result, Compared comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + ++first1; + } + else if (comp(*first2, *first1)) { + ++first2; + } + else { + *result = *first1; + ++first1; + ++first2; + ++result; + } + } + return result; +} + +/*****************************************************************************************/ +// set_difference +// 计算 S1-S2 的结果并保存到 result 中,返回一个迭代器指向输出结果的尾部 +/*****************************************************************************************/ +template +OutputIter +set_difference(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result) { + while (first1 != last1 && first2 != last2) { + if (*first1 < *first2) { + *result = *first1; + ++first1; + ++result; + } + else if (*first2 < *first1) { + ++first2; + } + else { + ++first1; + ++first2; + } + } + return mystl::copy(first1, last1, result); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +OutputIter +set_difference(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result, Compared comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + *result = *first1; + ++first1; + ++result; + } + else if (comp(*first2, *first1)) { + ++first2; + } + else { + ++first1; + ++first2; + } + } + return mystl::copy(first1, last1, result); +} + +/*****************************************************************************************/ +// set_symmetric_difference +// 计算 (S1-S2)∪(S2-S1) 的结果并保存到 result +// 中,返回一个迭代器指向输出结果的尾部 +/*****************************************************************************************/ +template +OutputIter +set_symmetric_difference(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result) { + while (first1 != last1 && first2 != last2) { + if (*first1 < *first2) { + *result = *first1; + ++first1; + ++result; + } + else if (*first2 < *first1) { + *result = *first2; + ++first2; + ++result; + } + else { + ++first1; + ++first2; + } + } + return mystl::copy(first2, last2, mystl::copy(first1, last1, result)); +} + +// 重载版本使用函数对象 comp 代替比较操作 +template +OutputIter +set_symmetric_difference(InputIter1 first1, InputIter1 last1, InputIter2 first2, + InputIter2 last2, OutputIter result, Compared comp) { + while (first1 != last1 && first2 != last2) { + if (comp(*first1, *first2)) { + *result = *first1; + ++first1; + ++result; + } + else if (comp(*first2, *first1)) { + *result = *first2; + ++first2; + ++result; + } + else { + ++first1; + ++first2; + } + } + return mystl::copy(first2, last2, mystl::copy(first1, last1, result)); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_SET_ALGO */ diff --git a/src/libcxx/include/stack b/src/libcxx/include/stack new file mode 100644 index 000000000..bef748062 --- /dev/null +++ b/src/libcxx/include/stack @@ -0,0 +1,199 @@ + +/** + * @file stack + * @brief stl stack 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STACK +#define SIMPLEKERNEL_STACK + +// 这个头文件包含了一个模板类 stack +// stack : 栈 + +#include "deque" + +namespace mystl { + +// 模板类 stack +// 参数一代表数据类型,参数二代表底层容器类型,缺省使用 mystl::deque +// 作为底层容器 +template > +class stack { +public: + typedef Container container_type; + // 使用底层容器的型别 + typedef typename Container::value_type value_type; + typedef typename Container::size_type size_type; + typedef typename Container::reference reference; + typedef typename Container::const_reference const_reference; + + static_assert(std::is_same::value, + "the value_type of Container should be same with T"); + +private: + container_type c_; // 用底层容器表现 stack + +public: + // 构造、复制、移动函数 + stack() = default; + + explicit stack(size_type n) : c_(n) { + } + + stack(size_type n, const value_type& value) : c_(n, value) { + } + + template + stack(IIter first, IIter last) : c_(first, last) { + } + + stack(std::initializer_list ilist) : c_(ilist.begin(), ilist.end()) { + } + + stack(const Container& c) : c_(c) { + } + + stack(Container&& c) noexcept( + std::is_nothrow_move_constructible::value) + : c_(mystl::move(c)) { + } + + stack(const stack& rhs) : c_(rhs.c_) { + } + + stack(stack&& rhs) noexcept( + std::is_nothrow_move_constructible::value) + : c_(mystl::move(rhs.c_)) { + } + + stack& operator=(const stack& rhs) { + c_ = rhs.c_; + return *this; + } + + stack& operator=(stack&& rhs) noexcept( + std::is_nothrow_move_assignable::value) { + c_ = mystl::move(rhs.c_); + return *this; + } + + stack& operator=(std::initializer_list ilist) { + c_ = ilist; + return *this; + } + + ~stack() = default; + + // 访问元素相关操作 + reference top() { + return c_.back(); + } + + const_reference top() const { + return c_.back(); + } + + // 容量相关操作 + bool empty() const noexcept { + return c_.empty(); + } + + size_type size() const noexcept { + return c_.size(); + } + + // 修改容器相关操作 + + template + void emplace(Args&&... args) { + c_.emplace_back(mystl::forward(args)...); + } + + void push(const value_type& value) { + c_.push_back(value); + } + + void push(value_type&& value) { + c_.push_back(mystl::move(value)); + } + + void pop() { + c_.pop_back(); + } + + void clear() { + while (!empty()) { + pop(); + } + } + + void swap(stack& rhs) noexcept(noexcept(mystl::swap(c_, rhs.c_))) { + mystl::swap(c_, rhs.c_); + } + +public: + friend bool operator==(const stack& lhs, const stack& rhs) { + return lhs.c_ == rhs.c_; + } + + friend bool operator<(const stack& lhs, const stack& rhs) { + return lhs.c_ < rhs.c_; + } +}; + +// 重载比较操作符 +template +bool operator==(const stack& lhs, + const stack& rhs) { + return lhs == rhs; +} + +template +bool operator<(const stack& lhs, const stack& rhs) { + return lhs < rhs; +} + +template +bool operator!=(const stack& lhs, + const stack& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const stack& lhs, const stack& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const stack& lhs, + const stack& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const stack& lhs, + const stack& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(stack& lhs, + stack& rhs) noexcept(noexcept(lhs.swap(rhs))) { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_STACK */ diff --git a/src/libcxx/include/string b/src/libcxx/include/string new file mode 100644 index 000000000..dc32effca --- /dev/null +++ b/src/libcxx/include/string @@ -0,0 +1,23 @@ + +/** + * @file string + * @brief stl string 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_STRING +#define SIMPLEKERNEL_STRING + +#include "astring" + +#endif /* SIMPLEKERNEL_STRING */ diff --git a/src/libcxx/include/type_traits b/src/libcxx/include/type_traits new file mode 100644 index 000000000..1dd441ddd --- /dev/null +++ b/src/libcxx/include/type_traits @@ -0,0 +1,2951 @@ + +/** + * @file type_traits + * @brief stl type_traits 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_TYPE_TRAITS +#define SIMPLEKERNEL_TYPE_TRAITS + +#include "stddef.h" +#include "stdint.h" + +namespace std { + +typedef decltype(nullptr) nullptr_t; + +#define _GLIBCXX20_DEPRECATED(MSG) [[deprecated(MSG)]] + +/** + * @defgroup metaprogramming Metaprogramming + * @ingroup utilities + * + * Template utilities for compile-time introspection and modification, + * including type classification traits, type property inspection traits + * and type transformation traits. + * + * @{ + */ + +/// integral_constant +template +struct integral_constant { + static constexpr _Tp value = __v; + typedef _Tp value_type; + typedef integral_constant<_Tp, __v> type; + + constexpr operator value_type() const noexcept { + return value; + } +#if __cplusplus > 201103L + +# define __cpp_lib_integral_constant_callable 201304 + + constexpr value_type operator()() const noexcept { + return value; + } +#endif +}; + +template +constexpr _Tp integral_constant<_Tp, __v>::value; + +/// The type used as a compile-time boolean with true value. +typedef integral_constant true_type; + +/// The type used as a compile-time boolean with false value. +typedef integral_constant false_type; + +template +using __bool_constant = integral_constant; + +#if __cplusplus > 201402L +# define __cpp_lib_bool_constant 201505 +template +using bool_constant = integral_constant; +#endif + +// Meta programming helper types. + +template +struct conditional; + +template +struct __type_identity { + using type = _Type; +}; + +template +using __type_identity_t = typename __type_identity<_Tp>::type; + +template +struct __or_; + +template <> +struct __or_<> : public false_type { }; + +template +struct __or_<_B1> : public _B1 { }; + +template +struct __or_<_B1, _B2> : public conditional<_B1::value, _B1, _B2>::type { }; + +template +struct __or_<_B1, _B2, _B3, _Bn...> + : public conditional<_B1::value, _B1, __or_<_B2, _B3, _Bn...>>::type { }; + +template +struct __and_; + +template <> +struct __and_<> : public true_type { }; + +template +struct __and_<_B1> : public _B1 { }; + +template +struct __and_<_B1, _B2> : public conditional<_B1::value, _B2, _B1>::type { }; + +template +struct __and_<_B1, _B2, _B3, _Bn...> + : public conditional<_B1::value, __and_<_B2, _B3, _Bn...>, _B1>::type { }; + +template +struct __not_ : public __bool_constant { }; + +#if __cplusplus >= 201703L + +template +inline constexpr bool __or_v = __or_<_Bn...>::value; +template +inline constexpr bool __and_v = __and_<_Bn...>::value; + +# define __cpp_lib_logical_traits 201510 + +template +struct conjunction : __and_<_Bn...> { }; + +template +struct disjunction : __or_<_Bn...> { }; + +template +struct negation : __not_<_Pp> { }; + +template +inline constexpr bool conjunction_v = conjunction<_Bn...>::value; + +template +inline constexpr bool disjunction_v = disjunction<_Bn...>::value; + +template +inline constexpr bool negation_v = negation<_Pp>::value; + +#endif // C++17 + +// Forward declarations +template +struct is_reference; +template +struct is_function; +template +struct is_void; +template +struct __is_array_unknown_bounds; + +// Helper functions that return false_type for incomplete classes, +// incomplete unions and arrays of known bound from those. + +template +constexpr true_type __is_complete_or_unbounded(__type_identity<_Tp>) { + return {}; +} + +template +constexpr typename __or_, is_function<_NestedType>, + is_void<_NestedType>, + __is_array_unknown_bounds<_NestedType>>::type +__is_complete_or_unbounded(_TypeIdentity) { + return {}; +} + +// For several sfinae-friendly trait implementations we transport both the +// result information (as the member type) and the failure information (no +// member type). This is very similar to std::enable_if, but we cannot use +// them, because we need to derive from them as an implementation detail. + +template +struct __success_type { + typedef _Tp type; +}; + +struct __failure_type { }; + +template +struct remove_cv; + +// __remove_cv_t (std::remove_cv_t for C++11). +template +using __remove_cv_t = typename remove_cv<_Tp>::type; + +template +struct is_const; + +// Primary type categories. + +template +struct __is_void_helper : public false_type { }; + +template <> +struct __is_void_helper : public true_type { }; + +/// is_void +template +struct is_void : public __is_void_helper<__remove_cv_t<_Tp>>::type { }; + +template +struct __is_integral_helper : public false_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +#ifdef _GLIBCXX_USE_WCHAR_T +template <> +struct __is_integral_helper : public true_type { }; +#endif + +#ifdef _GLIBCXX_USE_CHAR8_T +template <> +struct __is_integral_helper : public true_type { }; +#endif + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +template <> +struct __is_integral_helper : public true_type { }; + +// Conditionalizing on __STRICT_ANSI__ here will break any port that +// uses one of these types for size_t. +#if defined(__GLIBCXX_TYPE_INT_N_0) +template <> +struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_0> : public true_type { }; + +template <> +struct __is_integral_helper + : public true_type { }; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_1) +template <> +struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_1> : public true_type { }; + +template <> +struct __is_integral_helper + : public true_type { }; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_2) +template <> +struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_2> : public true_type { }; + +template <> +struct __is_integral_helper + : public true_type { }; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_3) +template <> +struct __is_integral_helper<__GLIBCXX_TYPE_INT_N_3> : public true_type { }; + +template <> +struct __is_integral_helper + : public true_type { }; +#endif + +/// is_integral +template +struct is_integral : public __is_integral_helper<__remove_cv_t<_Tp>>::type { }; + +template +struct __is_floating_point_helper : public false_type { }; + +template <> +struct __is_floating_point_helper : public true_type { }; + +template <> +struct __is_floating_point_helper : public true_type { }; + +template <> +struct __is_floating_point_helper : public true_type { }; + +#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128) +template <> +struct __is_floating_point_helper<__float128> : public true_type { }; +#endif + +/// is_floating_point +template +struct is_floating_point + : public __is_floating_point_helper<__remove_cv_t<_Tp>>::type { }; + +/// is_array +template +struct is_array : public false_type { }; + +template +struct is_array<_Tp[_Size]> : public true_type { }; + +template +struct is_array<_Tp[]> : public true_type { }; + +template +struct __is_pointer_helper : public false_type { }; + +template +struct __is_pointer_helper<_Tp*> : public true_type { }; + +/// is_pointer +template +struct is_pointer : public __is_pointer_helper<__remove_cv_t<_Tp>>::type { }; + +/// is_lvalue_reference +template +struct is_lvalue_reference : public false_type { }; + +template +struct is_lvalue_reference<_Tp&> : public true_type { }; + +/// is_rvalue_reference +template +struct is_rvalue_reference : public false_type { }; + +template +struct is_rvalue_reference<_Tp&&> : public true_type { }; + +template +struct __is_member_object_pointer_helper : public false_type { }; + +template +struct __is_member_object_pointer_helper<_Tp _Cp::*> + : public __not_>::type { }; + +/// is_member_object_pointer +template +struct is_member_object_pointer + : public __is_member_object_pointer_helper<__remove_cv_t<_Tp>>::type { }; + +template +struct __is_member_function_pointer_helper : public false_type { }; + +template +struct __is_member_function_pointer_helper<_Tp _Cp::*> + : public is_function<_Tp>::type { }; + +/// is_member_function_pointer +template +struct is_member_function_pointer + : public __is_member_function_pointer_helper<__remove_cv_t<_Tp>>::type { }; + +/// is_enum +template +struct is_enum : public integral_constant { }; + +/// is_union +template +struct is_union : public integral_constant { }; + +/// is_class +template +struct is_class : public integral_constant { }; + +/// is_function +template +struct is_function : public __bool_constant::value> { }; + +template +struct is_function<_Tp&> : public false_type { }; + +template +struct is_function<_Tp&&> : public false_type { }; + +#define __cpp_lib_is_null_pointer 201309 + +template +struct __is_null_pointer_helper : public false_type { }; + +template <> +struct __is_null_pointer_helper : public true_type { }; + +/// is_null_pointer (LWG 2247). +template +struct is_null_pointer + : public __is_null_pointer_helper<__remove_cv_t<_Tp>>::type { }; + +/// __is_nullptr_t (deprecated extension). +template +struct __is_nullptr_t : public is_null_pointer<_Tp> { +} __attribute__((__deprecated__)); + +// Composite type categories. + +/// is_reference +template +struct is_reference + : public __or_, is_rvalue_reference<_Tp>>::type { +}; + +/// is_arithmetic +template +struct is_arithmetic + : public __or_, is_floating_point<_Tp>>::type { }; + +/// is_fundamental +template +struct is_fundamental : public __or_, is_void<_Tp>, + is_null_pointer<_Tp>>::type { }; + +/// is_object +template +struct is_object + : public __not_< + __or_, is_reference<_Tp>, is_void<_Tp>>>::type { }; + +template +struct is_member_pointer; + +/// is_scalar +template +struct is_scalar + : public __or_, is_enum<_Tp>, is_pointer<_Tp>, + is_member_pointer<_Tp>, is_null_pointer<_Tp>>::type { }; + +/// is_compound +template +struct is_compound : public __not_>::type { }; + +template +struct __is_member_pointer_helper : public false_type { }; + +template +struct __is_member_pointer_helper<_Tp _Cp::*> : public true_type { }; + +/// is_member_pointer +template +struct is_member_pointer + : public __is_member_pointer_helper<__remove_cv_t<_Tp>>::type { }; + +template +struct is_same; + +template +using __is_one_of = __or_...>; + +// Check if a type is one of the signed integer types. +template +using __is_signed_integer + = __is_one_of<__remove_cv_t<_Tp>, signed char, signed short, signed int, + signed long, signed long long +#if defined(__GLIBCXX_TYPE_INT_N_0) + , + signed __GLIBCXX_TYPE_INT_N_0 +#endif +#if defined(__GLIBCXX_TYPE_INT_N_1) + , + signed __GLIBCXX_TYPE_INT_N_1 +#endif +#if defined(__GLIBCXX_TYPE_INT_N_2) + , + signed __GLIBCXX_TYPE_INT_N_2 +#endif +#if defined(__GLIBCXX_TYPE_INT_N_3) + , + signed __GLIBCXX_TYPE_INT_N_3 +#endif + >; + +// Check if a type is one of the unsigned integer types. +template +using __is_unsigned_integer + = __is_one_of<__remove_cv_t<_Tp>, unsigned char, unsigned short, unsigned int, + unsigned long, unsigned long long +#if defined(__GLIBCXX_TYPE_INT_N_0) + , + unsigned __GLIBCXX_TYPE_INT_N_0 +#endif +#if defined(__GLIBCXX_TYPE_INT_N_1) + , + unsigned __GLIBCXX_TYPE_INT_N_1 +#endif +#if defined(__GLIBCXX_TYPE_INT_N_2) + , + unsigned __GLIBCXX_TYPE_INT_N_2 +#endif +#if defined(__GLIBCXX_TYPE_INT_N_3) + , + unsigned __GLIBCXX_TYPE_INT_N_3 +#endif + >; + +// Check if a type is one of the signed or unsigned integer types. +template +using __is_standard_integer + = __or_<__is_signed_integer<_Tp>, __is_unsigned_integer<_Tp>>; + +// __void_t (std::void_t for C++11) +template +using __void_t = void; + +// Utility to detect referenceable types ([defns.referenceable]). + +template +struct __is_referenceable : public false_type {}; + +template +struct __is_referenceable<_Tp, __void_t<_Tp&>> : public true_type {}; + +// Type properties. + +/// is_const +template +struct is_const : public false_type { }; + +template +struct is_const : public true_type { }; + +/// is_volatile +template +struct is_volatile : public false_type { }; + +template +struct is_volatile : public true_type { }; + +/// is_trivial +template +struct is_trivial : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +// is_trivially_copyable +template +struct is_trivially_copyable + : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_standard_layout +template +struct is_standard_layout + : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_pod (deprecated in C++20) +// Could use is_standard_layout && is_trivial instead of the builtin. +template +struct _GLIBCXX20_DEPRECATED("use is_standard_layout && is_trivial instead") + is_pod : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_literal_type +template +struct is_literal_type + : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_empty +template +struct is_empty : public integral_constant { }; + +/// is_polymorphic +template +struct is_polymorphic : public integral_constant { +}; + +#if __cplusplus >= 201402L +# define __cpp_lib_is_final 201402L + +/// is_final +template +struct is_final : public integral_constant { }; +#endif + +/// is_abstract +template +struct is_abstract : public integral_constant { }; + +template ::value> +struct __is_signed_helper : public false_type { }; + +template +struct __is_signed_helper<_Tp, true> + : public integral_constant { }; + +/// is_signed +template +struct is_signed : public __is_signed_helper<_Tp>::type { }; + +/// is_unsigned +template +struct is_unsigned : public __and_, __not_>> { +}; + +// Destructible and constructible type properties. + +/** + * @brief Utility to simplify expressions used in unevaluated operands + * @ingroup utilities + */ + +template +_Up __declval(int); + +template +_Tp __declval(long); + +template +auto declval() noexcept -> decltype(__declval<_Tp>(0)); + +template +struct extent; + +template +struct remove_all_extents; + +template +struct __is_array_known_bounds + : public integral_constant::value > 0)> { }; + +template +struct __is_array_unknown_bounds + : public __and_, __not_>> { }; + +// In N3290 is_destructible does not say anything about function +// types and abstract types, see LWG 2049. This implementation +// describes function types as non-destructible and all complete +// object types as destructible, iff the explicit destructor +// call expression is wellformed. +struct __do_is_destructible_impl { + template ().~_Tp())> + static true_type __test(int); + + template + static false_type __test(...); +}; + +template +struct __is_destructible_impl : public __do_is_destructible_impl { + typedef decltype(__test<_Tp>(0)) type; +}; + +template , __is_array_unknown_bounds<_Tp>, + is_function<_Tp>>::value, + bool = __or_, is_scalar<_Tp>>::value> +struct __is_destructible_safe; + +template +struct __is_destructible_safe<_Tp, false, false> + : public __is_destructible_impl< + typename remove_all_extents<_Tp>::type>::type { }; + +template +struct __is_destructible_safe<_Tp, true, false> : public false_type { }; + +template +struct __is_destructible_safe<_Tp, false, true> : public true_type { }; + +/// is_destructible +template +struct is_destructible : public __is_destructible_safe<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +// is_nothrow_destructible requires that is_destructible is +// satisfied as well. We realize that by mimicing the +// implementation of is_destructible but refer to noexcept(expr) +// instead of decltype(expr). +struct __do_is_nt_destructible_impl { + template + static __bool_constant().~_Tp())> __test(int); + + template + static false_type __test(...); +}; + +template +struct __is_nt_destructible_impl : public __do_is_nt_destructible_impl { + typedef decltype(__test<_Tp>(0)) type; +}; + +template , __is_array_unknown_bounds<_Tp>, + is_function<_Tp>>::value, + bool = __or_, is_scalar<_Tp>>::value> +struct __is_nt_destructible_safe; + +template +struct __is_nt_destructible_safe<_Tp, false, false> + : public __is_nt_destructible_impl< + typename remove_all_extents<_Tp>::type>::type { }; + +template +struct __is_nt_destructible_safe<_Tp, true, false> : public false_type { }; + +template +struct __is_nt_destructible_safe<_Tp, false, true> : public true_type { }; + +/// is_nothrow_destructible +template +struct is_nothrow_destructible : public __is_nt_destructible_safe<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template +struct __is_constructible_impl + : public __bool_constant<__is_constructible(_Tp, _Args...)> { }; + +/// is_constructible +template +struct is_constructible : public __is_constructible_impl<_Tp, _Args...> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_default_constructible +template +struct is_default_constructible : public __is_constructible_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_copy_constructible_impl; + +template +struct __is_copy_constructible_impl<_Tp, false> : public false_type { }; + +template +struct __is_copy_constructible_impl<_Tp, true> + : public __is_constructible_impl<_Tp, const _Tp&> { }; + +/// is_copy_constructible +template +struct is_copy_constructible : public __is_copy_constructible_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_move_constructible_impl; + +template +struct __is_move_constructible_impl<_Tp, false> : public false_type { }; + +template +struct __is_move_constructible_impl<_Tp, true> + : public __is_constructible_impl<_Tp, _Tp&&> { }; + +/// is_move_constructible +template +struct is_move_constructible : public __is_move_constructible_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template +struct __is_nt_constructible_impl : public false_type { }; + +template +struct __is_nt_constructible_impl + : public __bool_constant()...))> { }; + +template +struct __is_nt_constructible_impl + : public __bool_constant(std::declval<_Arg>()))> { +}; + +template +struct __is_nt_constructible_impl + : public __bool_constant { }; + +template +struct __is_nt_constructible_impl + : public __bool_constant< + noexcept(typename remove_all_extents<_Tp>::type())> { }; + +#if __cpp_aggregate_paren_init +template +struct __is_nt_constructible_impl + : public __is_nt_constructible_impl { }; + +template +struct __is_nt_constructible_impl + : public __and_<__is_nt_constructible_impl...> { }; +#endif + +template +using __is_nothrow_constructible_impl + = __is_nt_constructible_impl<__is_constructible(_Tp, _Args...), _Tp, + _Args...>; + +/// is_nothrow_constructible +template +struct is_nothrow_constructible + : public __is_nothrow_constructible_impl<_Tp, _Args...>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_nothrow_default_constructible +template +struct is_nothrow_default_constructible + : public __is_nothrow_constructible_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_nothrow_copy_constructible_impl; + +template +struct __is_nothrow_copy_constructible_impl<_Tp, false> : public false_type { }; + +template +struct __is_nothrow_copy_constructible_impl<_Tp, true> + : public __is_nothrow_constructible_impl<_Tp, const _Tp&> { }; + +/// is_nothrow_copy_constructible +template +struct is_nothrow_copy_constructible + : public __is_nothrow_copy_constructible_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_nothrow_move_constructible_impl; + +template +struct __is_nothrow_move_constructible_impl<_Tp, false> : public false_type { }; + +template +struct __is_nothrow_move_constructible_impl<_Tp, true> + : public __is_nothrow_constructible_impl<_Tp, _Tp&&> { }; + +/// is_nothrow_move_constructible +template +struct is_nothrow_move_constructible + : public __is_nothrow_move_constructible_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_assignable +template +struct is_assignable : public __bool_constant<__is_assignable(_Tp, _Up)> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_copy_assignable_impl; + +template +struct __is_copy_assignable_impl<_Tp, false> : public false_type { }; + +template +struct __is_copy_assignable_impl<_Tp, true> + : public __bool_constant<__is_assignable(_Tp&, const _Tp&)> { }; + +/// is_copy_assignable +template +struct is_copy_assignable : public __is_copy_assignable_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_move_assignable_impl; + +template +struct __is_move_assignable_impl<_Tp, false> : public false_type { }; + +template +struct __is_move_assignable_impl<_Tp, true> + : public __bool_constant<__is_assignable(_Tp&, _Tp&&)> { }; + +/// is_move_assignable +template +struct is_move_assignable : public __is_move_assignable_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template +struct __is_nt_assignable_impl + : public integral_constant() = declval<_Up>())> { }; + +template +struct __is_nothrow_assignable_impl + : public __and_<__bool_constant<__is_assignable(_Tp, _Up)>, + __is_nt_assignable_impl<_Tp, _Up>> { }; + +/// is_nothrow_assignable +template +struct is_nothrow_assignable : public __is_nothrow_assignable_impl<_Tp, _Up> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_nt_copy_assignable_impl; + +template +struct __is_nt_copy_assignable_impl<_Tp, false> : public false_type { }; + +template +struct __is_nt_copy_assignable_impl<_Tp, true> + : public __is_nothrow_assignable_impl<_Tp&, const _Tp&> { }; + +/// is_nothrow_copy_assignable +template +struct is_nothrow_copy_assignable : public __is_nt_copy_assignable_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_nt_move_assignable_impl; + +template +struct __is_nt_move_assignable_impl<_Tp, false> : public false_type { }; + +template +struct __is_nt_move_assignable_impl<_Tp, true> + : public __is_nothrow_assignable_impl<_Tp&, _Tp&&> { }; + +/// is_nothrow_move_assignable +template +struct is_nothrow_move_assignable : public __is_nt_move_assignable_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_trivially_constructible +template +struct is_trivially_constructible + : public __bool_constant<__is_trivially_constructible(_Tp, _Args...)> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_trivially_default_constructible +template +struct is_trivially_default_constructible + : public __bool_constant<__is_trivially_constructible(_Tp)> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +struct __do_is_implicitly_default_constructible_impl { + template + static void __helper(const _Tp&); + + template + static true_type + __test(const _Tp&, decltype(__helper({}))* = 0); + + static false_type __test(...); +}; + +template +struct __is_implicitly_default_constructible_impl + : public __do_is_implicitly_default_constructible_impl { + typedef decltype(__test(declval<_Tp>())) type; +}; + +template +struct __is_implicitly_default_constructible_safe + : public __is_implicitly_default_constructible_impl<_Tp>::type { }; + +template +struct __is_implicitly_default_constructible + : public __and_<__is_constructible_impl<_Tp>, + __is_implicitly_default_constructible_safe<_Tp>> { }; + +template ::value> +struct __is_trivially_copy_constructible_impl; + +template +struct __is_trivially_copy_constructible_impl<_Tp, false> : public false_type { +}; + +template +struct __is_trivially_copy_constructible_impl<_Tp, true> + : public __and_<__is_copy_constructible_impl<_Tp>, + integral_constant< + bool, __is_trivially_constructible(_Tp, const _Tp&)>> { }; + +/// is_trivially_copy_constructible +template +struct is_trivially_copy_constructible + : public __is_trivially_copy_constructible_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_trivially_move_constructible_impl; + +template +struct __is_trivially_move_constructible_impl<_Tp, false> : public false_type { +}; + +template +struct __is_trivially_move_constructible_impl<_Tp, true> + : public __and_< + __is_move_constructible_impl<_Tp>, + integral_constant> { }; + +/// is_trivially_move_constructible +template +struct is_trivially_move_constructible + : public __is_trivially_move_constructible_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_trivially_assignable +template +struct is_trivially_assignable + : public __bool_constant<__is_trivially_assignable(_Tp, _Up)> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_trivially_copy_assignable_impl; + +template +struct __is_trivially_copy_assignable_impl<_Tp, false> : public false_type { }; + +template +struct __is_trivially_copy_assignable_impl<_Tp, true> + : public __bool_constant<__is_trivially_assignable(_Tp&, const _Tp&)> { }; + +/// is_trivially_copy_assignable +template +struct is_trivially_copy_assignable + : public __is_trivially_copy_assignable_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template ::value> +struct __is_trivially_move_assignable_impl; + +template +struct __is_trivially_move_assignable_impl<_Tp, false> : public false_type { }; + +template +struct __is_trivially_move_assignable_impl<_Tp, true> + : public __bool_constant<__is_trivially_assignable(_Tp&, _Tp&&)> { }; + +/// is_trivially_move_assignable +template +struct is_trivially_move_assignable + : public __is_trivially_move_assignable_impl<_Tp> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_trivially_destructible +template +struct is_trivially_destructible + : public __and_<__is_destructible_safe<_Tp>, + __bool_constant<__has_trivial_destructor(_Tp)>> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// has_virtual_destructor +template +struct has_virtual_destructor + : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +// type property queries. + +/// alignment_of +template +struct alignment_of : public integral_constant { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// rank +template +struct rank : public integral_constant { }; + +template +struct rank<_Tp[_Size]> + : public integral_constant::value> { }; + +template +struct rank<_Tp[]> : public integral_constant::value> { }; + +/// extent +template +struct extent : public integral_constant { }; + +template +struct extent<_Tp[_Size], _Uint> + : public integral_constant< + size_t, _Uint == 0 ? _Size : extent<_Tp, _Uint - 1>::value> { }; + +template +struct extent<_Tp[], _Uint> + : public integral_constant::value> { +}; + +// Type relations. + +/// is_same +template +struct is_same +#ifdef _GLIBCXX_BUILTIN_IS_SAME_AS + : public integral_constant +#else + : public false_type +#endif +{ +}; + +#ifndef _GLIBCXX_BUILTIN_IS_SAME_AS +template +struct is_same<_Tp, _Tp> : public true_type { }; +#endif + +/// is_base_of +template +struct is_base_of + : public integral_constant { }; + +template , is_function<_To>, is_array<_To>>::value> +struct __is_convertible_helper { + typedef typename is_void<_To>::type type; +}; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" + +template +class __is_convertible_helper<_From, _To, false> { + template + static void __test_aux(_To1) noexcept; + + template (std::declval<_From1>()))> + static true_type __test(int); + + template + static false_type __test(...); + +public: + typedef decltype(__test<_From, _To>(0)) type; +}; + +#pragma GCC diagnostic pop + +/// is_convertible +template +struct is_convertible : public __is_convertible_helper<_From, _To>::type { }; + +// helper trait for unique_ptr, shared_ptr, and span +template +using __is_array_convertible + = is_convertible<_FromElementType (*)[], _ToElementType (*)[]>; + +template , is_function<_To>, is_array<_To>>::value> +struct __is_nt_convertible_helper : is_void<_To> { }; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" + +template +class __is_nt_convertible_helper<_From, _To, false> { + template + static void __test_aux(_To1) noexcept; + + template + static __bool_constant(std::declval<_From1>()))> + __test(int); + + template + static false_type __test(...); + +public: + using type = decltype(__test<_From, _To>(0)); +}; + +#pragma GCC diagnostic pop + +// is_nothrow_convertible for C++11 +template +struct __is_nothrow_convertible + : public __is_nt_convertible_helper<_From, _To>::type { }; + +#if __cplusplus > 201703L +# define __cpp_lib_is_nothrow_convertible 201806L + +/// is_nothrow_convertible +template +struct is_nothrow_convertible + : public __is_nt_convertible_helper<_From, _To>::type { }; + +/// is_nothrow_convertible_v +template +inline constexpr bool is_nothrow_convertible_v + = is_nothrow_convertible<_From, _To>::value; +#endif // C++2a + +// Const-volatile modifications. + +/// remove_const +template +struct remove_const { + typedef _Tp type; +}; + +template +struct remove_const { + typedef _Tp type; +}; + +/// remove_volatile +template +struct remove_volatile { + typedef _Tp type; +}; + +template +struct remove_volatile { + typedef _Tp type; +}; + +/// remove_cv +template +struct remove_cv { + using type = _Tp; +}; + +template +struct remove_cv { + using type = _Tp; +}; + +template +struct remove_cv { + using type = _Tp; +}; + +template +struct remove_cv { + using type = _Tp; +}; + +/// add_const +template +struct add_const { + typedef const _Tp type; +}; + +/// add_volatile +template +struct add_volatile { + typedef volatile _Tp type; +}; + +/// add_cv +template +struct add_cv { + typedef typename add_const::type>::type type; +}; + +#if __cplusplus > 201103L + +# define __cpp_lib_transformation_trait_aliases 201304 + +/// Alias template for remove_const +template +using remove_const_t = typename remove_const<_Tp>::type; + +/// Alias template for remove_volatile +template +using remove_volatile_t = typename remove_volatile<_Tp>::type; + +/// Alias template for remove_cv +template +using remove_cv_t = typename remove_cv<_Tp>::type; + +/// Alias template for add_const +template +using add_const_t = typename add_const<_Tp>::type; + +/// Alias template for add_volatile +template +using add_volatile_t = typename add_volatile<_Tp>::type; + +/// Alias template for add_cv +template +using add_cv_t = typename add_cv<_Tp>::type; +#endif + +// Reference transformations. + +/// remove_reference +template +struct remove_reference { + typedef _Tp type; +}; + +template +struct remove_reference<_Tp&> { + typedef _Tp type; +}; + +template +struct remove_reference<_Tp&&> { + typedef _Tp type; +}; + +template ::value> +struct __add_lvalue_reference_helper { + typedef _Tp type; +}; + +template +struct __add_lvalue_reference_helper<_Tp, true> { + typedef _Tp& type; +}; + +/// add_lvalue_reference +template +struct add_lvalue_reference : public __add_lvalue_reference_helper<_Tp> { }; + +template ::value> +struct __add_rvalue_reference_helper { + typedef _Tp type; +}; + +template +struct __add_rvalue_reference_helper<_Tp, true> { + typedef _Tp&& type; +}; + +/// add_rvalue_reference +template +struct add_rvalue_reference : public __add_rvalue_reference_helper<_Tp> { }; + +#if __cplusplus > 201103L +/// Alias template for remove_reference +template +using remove_reference_t = typename remove_reference<_Tp>::type; + +/// Alias template for add_lvalue_reference +template +using add_lvalue_reference_t = typename add_lvalue_reference<_Tp>::type; + +/// Alias template for add_rvalue_reference +template +using add_rvalue_reference_t = typename add_rvalue_reference<_Tp>::type; +#endif + +// Sign modifications. + +// Utility for constructing identically cv-qualified types. +template +struct __cv_selector; + +template +struct __cv_selector<_Unqualified, false, false> { + typedef _Unqualified __type; +}; + +template +struct __cv_selector<_Unqualified, false, true> { + typedef volatile _Unqualified __type; +}; + +template +struct __cv_selector<_Unqualified, true, false> { + typedef const _Unqualified __type; +}; + +template +struct __cv_selector<_Unqualified, true, true> { + typedef const volatile _Unqualified __type; +}; + +template ::value, + bool _IsVol = is_volatile<_Qualified>::value> +class __match_cv_qualifiers { + typedef __cv_selector<_Unqualified, _IsConst, _IsVol> __match; + +public: + typedef typename __match::__type __type; +}; + +// Utility for finding the unsigned versions of signed integral types. +template +struct __make_unsigned { + typedef _Tp __type; +}; + +template <> +struct __make_unsigned { + typedef unsigned char __type; +}; + +template <> +struct __make_unsigned { + typedef unsigned char __type; +}; + +template <> +struct __make_unsigned { + typedef unsigned short __type; +}; + +template <> +struct __make_unsigned { + typedef unsigned int __type; +}; + +template <> +struct __make_unsigned { + typedef unsigned long __type; +}; + +template <> +struct __make_unsigned { + typedef unsigned long long __type; +}; + +#if defined(__GLIBCXX_TYPE_INT_N_0) +template <> +struct __make_unsigned<__GLIBCXX_TYPE_INT_N_0> { + typedef unsigned __GLIBCXX_TYPE_INT_N_0 __type; +}; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_1) +template <> +struct __make_unsigned<__GLIBCXX_TYPE_INT_N_1> { + typedef unsigned __GLIBCXX_TYPE_INT_N_1 __type; +}; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_2) +template <> +struct __make_unsigned<__GLIBCXX_TYPE_INT_N_2> { + typedef unsigned __GLIBCXX_TYPE_INT_N_2 __type; +}; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_3) +template <> +struct __make_unsigned<__GLIBCXX_TYPE_INT_N_3> { + typedef unsigned __GLIBCXX_TYPE_INT_N_3 __type; +}; +#endif + +// Select between integral and enum: not possible to be both. +template ::value, + bool _IsEnum = is_enum<_Tp>::value> +class __make_unsigned_selector; + +template +class __make_unsigned_selector<_Tp, true, false> { + using __unsigned_type = + typename __make_unsigned<__remove_cv_t<_Tp>>::__type; + +public: + using __type = typename __match_cv_qualifiers<_Tp, __unsigned_type>::__type; +}; + +class __make_unsigned_selector_base { +protected: + template + struct _List { }; + + template + struct _List<_Tp, _Up...> : _List<_Up...> { + static constexpr size_t __size = sizeof(_Tp); + }; + + template + struct __select; + + template + struct __select<_Sz, _List<_Uint, _UInts...>, true> { + using __type = _Uint; + }; + + template + struct __select<_Sz, _List<_Uint, _UInts...>, false> + : __select<_Sz, _List<_UInts...>> { }; +}; + +// Choose unsigned integer type with the smallest rank and same size as _Tp +template +class __make_unsigned_selector<_Tp, false, true> + : __make_unsigned_selector_base { + // With -fshort-enums, an enum may be as small as a char. + using _UInts = _List; + + using __unsigned_type = typename __select::__type; + +public: + using __type = typename __match_cv_qualifiers<_Tp, __unsigned_type>::__type; +}; + +// int, char8_t, char16_t and char32_t are integral types but are +// neither signed integer types nor unsigned integer types, so must be +// transformed to the unsigned integer type with the smallest rank. +// Use the partial specialization for enumeration types to do that. +#if defined(_GLIBCXX_USE_WCHAR_T) +template <> +struct __make_unsigned { + using __type = typename __make_unsigned_selector::__type; +}; +#endif + +#ifdef _GLIBCXX_USE_CHAR8_T +template <> +struct __make_unsigned { + using __type = + typename __make_unsigned_selector::__type; +}; +#endif + +template <> +struct __make_unsigned { + using __type = + typename __make_unsigned_selector::__type; +}; + +template <> +struct __make_unsigned { + using __type = + typename __make_unsigned_selector::__type; +}; + +// Given an integral/enum type, return the corresponding unsigned +// integer type. +// Primary template. +/// make_unsigned +template +struct make_unsigned { + typedef typename __make_unsigned_selector<_Tp>::__type type; +}; + +// Integral, but don't define. +template <> +struct make_unsigned; + +// Utility for finding the signed versions of unsigned integral types. +template +struct __make_signed { + typedef _Tp __type; +}; + +template <> +struct __make_signed { + typedef signed char __type; +}; + +template <> +struct __make_signed { + typedef signed char __type; +}; + +template <> +struct __make_signed { + typedef signed short __type; +}; + +template <> +struct __make_signed { + typedef signed int __type; +}; + +template <> +struct __make_signed { + typedef signed long __type; +}; + +template <> +struct __make_signed { + typedef signed long long __type; +}; + +#if defined(__GLIBCXX_TYPE_INT_N_0) +template <> +struct __make_signed { + typedef __GLIBCXX_TYPE_INT_N_0 __type; +}; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_1) +template <> +struct __make_signed { + typedef __GLIBCXX_TYPE_INT_N_1 __type; +}; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_2) +template <> +struct __make_signed { + typedef __GLIBCXX_TYPE_INT_N_2 __type; +}; +#endif +#if defined(__GLIBCXX_TYPE_INT_N_3) +template <> +struct __make_signed { + typedef __GLIBCXX_TYPE_INT_N_3 __type; +}; +#endif + +// Select between integral and enum: not possible to be both. +template ::value, + bool _IsEnum = is_enum<_Tp>::value> +class __make_signed_selector; + +template +class __make_signed_selector<_Tp, true, false> { + using __signed_type = typename __make_signed<__remove_cv_t<_Tp>>::__type; + +public: + using __type = typename __match_cv_qualifiers<_Tp, __signed_type>::__type; +}; + +// Choose signed integer type with the smallest rank and same size as _Tp +template +class __make_signed_selector<_Tp, false, true> { + typedef typename __make_unsigned_selector<_Tp>::__type __unsigned_type; + +public: + typedef typename __make_signed_selector<__unsigned_type>::__type __type; +}; + +// int, char16_t and char32_t are integral types but are neither +// signed integer types nor unsigned integer types, so must be +// transformed to the signed integer type with the smallest rank. +// Use the partial specialization for enumeration types to do that. +#if defined(_GLIBCXX_USE_WCHAR_T) +template <> +struct __make_signed { + using __type = typename __make_signed_selector::__type; +}; +#endif + +#if defined(_GLIBCXX_USE_CHAR8_T) +template <> +struct __make_signed { + using __type = + typename __make_signed_selector::__type; +}; +#endif + +template <> +struct __make_signed { + using __type = + typename __make_signed_selector::__type; +}; + +template <> +struct __make_signed { + using __type = + typename __make_signed_selector::__type; +}; + +// Given an integral/enum type, return the corresponding signed +// integer type. +// Primary template. +/// make_signed +template +struct make_signed { + typedef typename __make_signed_selector<_Tp>::__type type; +}; + +// Integral, but don't define. +template <> +struct make_signed; + +#if __cplusplus > 201103L +/// Alias template for make_signed +template +using make_signed_t = typename make_signed<_Tp>::type; + +/// Alias template for make_unsigned +template +using make_unsigned_t = typename make_unsigned<_Tp>::type; +#endif + +// Array modifications. + +/// remove_extent +template +struct remove_extent { + typedef _Tp type; +}; + +template +struct remove_extent<_Tp[_Size]> { + typedef _Tp type; +}; + +template +struct remove_extent<_Tp[]> { + typedef _Tp type; +}; + +/// remove_all_extents +template +struct remove_all_extents { + typedef _Tp type; +}; + +template +struct remove_all_extents<_Tp[_Size]> { + typedef typename remove_all_extents<_Tp>::type type; +}; + +template +struct remove_all_extents<_Tp[]> { + typedef typename remove_all_extents<_Tp>::type type; +}; + +#if __cplusplus > 201103L +/// Alias template for remove_extent +template +using remove_extent_t = typename remove_extent<_Tp>::type; + +/// Alias template for remove_all_extents +template +using remove_all_extents_t = typename remove_all_extents<_Tp>::type; +#endif + +// Pointer modifications. + +template +struct __remove_pointer_helper { + typedef _Tp type; +}; + +template +struct __remove_pointer_helper<_Tp, _Up*> { + typedef _Up type; +}; + +/// remove_pointer +template +struct remove_pointer + : public __remove_pointer_helper<_Tp, __remove_cv_t<_Tp>> { }; + +/// add_pointer +template , is_void<_Tp>>::value> +struct __add_pointer_helper { + typedef _Tp type; +}; + +template +struct __add_pointer_helper<_Tp, true> { + typedef typename remove_reference<_Tp>::type* type; +}; + +template +struct add_pointer : public __add_pointer_helper<_Tp> { }; + +#if __cplusplus > 201103L +/// Alias template for remove_pointer +template +using remove_pointer_t = typename remove_pointer<_Tp>::type; + +/// Alias template for add_pointer +template +using add_pointer_t = typename add_pointer<_Tp>::type; +#endif + +template +struct __aligned_storage_msa { + union __type { + unsigned char __data[_Len]; + + struct __attribute__((__aligned__)) { + } __align; + }; +}; + +/** + * @brief Alignment type. + * + * The value of _Align is a default-alignment which shall be the + * most stringent alignment requirement for any C++ object type + * whose size is no greater than _Len (3.9). The member typedef + * type shall be a POD type suitable for use as uninitialized + * storage for any object whose size is at most _Len and whose + * alignment is a divisor of _Align. + */ +template ::__type)> +struct aligned_storage { + union type { + unsigned char __data[_Len]; + + struct __attribute__((__aligned__((_Align)))) { + } __align; + }; +}; + +template +struct __strictest_alignment { + static const size_t _S_alignment = 0; + static const size_t _S_size = 0; +}; + +template +struct __strictest_alignment<_Tp, _Types...> { + static const size_t _S_alignment + = alignof(_Tp) > __strictest_alignment<_Types...>::_S_alignment + ? alignof(_Tp) + : __strictest_alignment<_Types...>::_S_alignment; + static const size_t _S_size + = sizeof(_Tp) > __strictest_alignment<_Types...>::_S_size + ? sizeof(_Tp) + : __strictest_alignment<_Types...>::_S_size; +}; + +/** + * @brief Provide aligned storage for types. + * + * [meta.trans.other] + * + * Provides aligned storage for any of the provided types of at + * least size _Len. + * + * @see aligned_storage + */ +template +struct aligned_union { +private: + static_assert(sizeof...(_Types) != 0, "At least one type is required"); + + using __strictest = __strictest_alignment<_Types...>; + static const size_t _S_len + = _Len > __strictest::_S_size ? _Len : __strictest::_S_size; + +public: + /// The value of the strictest alignment of _Types. + static const size_t alignment_value = __strictest::_S_alignment; + /// The storage. + typedef typename aligned_storage<_S_len, alignment_value>::type type; +}; + +template +const size_t aligned_union<_Len, _Types...>::alignment_value; + +// Decay trait for arrays and functions, used for perfect forwarding +// in make_pair, make_tuple, etc. +template ::value, + bool _IsFunction = is_function<_Up>::value> +struct __decay_selector; + +// NB: DR 705. +template +struct __decay_selector<_Up, false, false> { + typedef __remove_cv_t<_Up> __type; +}; + +template +struct __decay_selector<_Up, true, false> { + typedef typename remove_extent<_Up>::type* __type; +}; + +template +struct __decay_selector<_Up, false, true> { + typedef typename add_pointer<_Up>::type __type; +}; + +/// decay +template +class decay { + typedef typename remove_reference<_Tp>::type __remove_type; + +public: + typedef typename __decay_selector<__remove_type>::__type type; +}; + +// __decay_t (std::decay_t for C++11). +template +using __decay_t = typename decay<_Tp>::type; + +template +class reference_wrapper; + +// Helper which adds a reference to a type when given a reference_wrapper +template +struct __strip_reference_wrapper { + typedef _Tp __type; +}; + +template +struct __strip_reference_wrapper> { + typedef _Tp& __type; +}; + +template +using __decay_and_strip = __strip_reference_wrapper<__decay_t<_Tp>>; + +// Primary template. +/// Define a member typedef @c type only if a boolean constant is true. +template +struct enable_if { }; + +// Partial specialization for true. +template +struct enable_if { + typedef _Tp type; +}; + +// __enable_if_t (std::enable_if_t for C++11) +template +using __enable_if_t = typename enable_if<_Cond, _Tp>::type; + +template +using _Require = __enable_if_t<__and_<_Cond...>::value>; + +// Primary template. +/// Define a member typedef @c type to one of two argument types. +template +struct conditional { + typedef _Iftrue type; +}; + +// Partial specialization for false. +template +struct conditional { + typedef _Iffalse type; +}; + +// __remove_cvref_t (std::remove_cvref_t for C++11). +template +using __remove_cvref_t = + typename remove_cv::type>::type; + +/// common_type +template +struct common_type; + +// Sfinae-friendly common_type implementation: + +struct __do_common_type_impl { + template + using __cond_t = decltype(true ? std::declval<_Tp>() : std::declval<_Up>()); + + // if decay_t() : declval())> + // denotes a valid type, let C denote that type. + template + static __success_type<__decay_t<__cond_t<_Tp, _Up>>> _S_test(int); + +#if __cplusplus > 201703L + // Otherwise, if COND-RES(CREF(D1), CREF(D2)) denotes a type, + // let C denote the type decay_t. + template + static __success_type<__remove_cvref_t<__cond_t>> + _S_test_2(int); +#endif + + template + static __failure_type _S_test_2(...); + + template + static decltype(_S_test_2<_Tp, _Up>(0)) _S_test(...); +}; + +// If sizeof...(T) is zero, there shall be no member type. +template <> +struct common_type<> { }; + +// If sizeof...(T) is one, the same type, if any, as common_type_t. +template +struct common_type<_Tp0> : public common_type<_Tp0, _Tp0> { }; + +// If sizeof...(T) is two, ... +template , + typename _Dp2 = __decay_t<_Tp2>> +struct __common_type_impl { + // If is_same_v is false or is_same_v is false, + // let C denote the same type, if any, as common_type_t. + using type = common_type<_Dp1, _Dp2>; +}; + +template +struct __common_type_impl<_Tp1, _Tp2, _Tp1, _Tp2> + : private __do_common_type_impl { + // Otherwise, if decay_t() : + // declval())> denotes a valid type, let C denote that type. + using type = decltype(_S_test<_Tp1, _Tp2>(0)); +}; + +// If sizeof...(T) is two, ... +template +struct common_type<_Tp1, _Tp2> : public __common_type_impl<_Tp1, _Tp2>::type { +}; + +template +struct __common_type_pack { }; + +template +struct __common_type_fold; + +// If sizeof...(T) is greater than two, ... +template +struct common_type<_Tp1, _Tp2, _Rp...> + : public __common_type_fold, + __common_type_pack<_Rp...>> { }; + +// Let C denote the same type, if any, as common_type_t. +// If there is such a type C, type shall denote the same type, if any, +// as common_type_t. +template +struct __common_type_fold<_CTp, __common_type_pack<_Rp...>, + __void_t> + : public common_type { }; + +// Otherwise, there shall be no member type. +template +struct __common_type_fold<_CTp, _Rp, void> { }; + +template ::value> +struct __underlying_type_impl { + using type = __underlying_type(_Tp); +}; + +template +struct __underlying_type_impl<_Tp, false> { }; + +/// The underlying type of an enum. +template +struct underlying_type : public __underlying_type_impl<_Tp> { }; + +template +struct __declval_protector { + static const bool __stop = false; +}; + +template +auto declval() noexcept -> decltype(__declval<_Tp>(0)) { + static_assert(__declval_protector<_Tp>::__stop, + "declval() must not be used!"); + return __declval<_Tp>(0); +} + +/// result_of +template +class result_of; + +// Sfinae-friendly result_of implementation: + +#define __cpp_lib_result_of_sfinae 201210 + +struct __invoke_memfun_ref { }; + +struct __invoke_memfun_deref { }; + +struct __invoke_memobj_ref { }; + +struct __invoke_memobj_deref { }; + +struct __invoke_other { }; + +// Associate a tag type with a specialization of __success_type. +template +struct __result_of_success : __success_type<_Tp> { + using __invoke_type = _Tag; +}; + +// [func.require] paragraph 1 bullet 1: +struct __result_of_memfun_ref_impl { + template + static __result_of_success< + decltype((std::declval<_Tp1>() + .*std::declval<_Fp>())(std::declval<_Args>()...)), + __invoke_memfun_ref> + _S_test(int); + + template + static __failure_type _S_test(...); +}; + +template +struct __result_of_memfun_ref : private __result_of_memfun_ref_impl { + typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type; +}; + +// [func.require] paragraph 1 bullet 2: +struct __result_of_memfun_deref_impl { + template + static __result_of_success< + decltype(((*std::declval<_Tp1>()) + .*std::declval<_Fp>())(std::declval<_Args>()...)), + __invoke_memfun_deref> + _S_test(int); + + template + static __failure_type _S_test(...); +}; + +template +struct __result_of_memfun_deref : private __result_of_memfun_deref_impl { + typedef decltype(_S_test<_MemPtr, _Arg, _Args...>(0)) type; +}; + +// [func.require] paragraph 1 bullet 3: +struct __result_of_memobj_ref_impl { + template + static __result_of_success< + decltype(std::declval<_Tp1>().*std::declval<_Fp>()), __invoke_memobj_ref> + _S_test(int); + + template + static __failure_type _S_test(...); +}; + +template +struct __result_of_memobj_ref : private __result_of_memobj_ref_impl { + typedef decltype(_S_test<_MemPtr, _Arg>(0)) type; +}; + +// [func.require] paragraph 1 bullet 4: +struct __result_of_memobj_deref_impl { + template + static __result_of_success()) + .*std::declval<_Fp>()), + __invoke_memobj_deref> + _S_test(int); + + template + static __failure_type _S_test(...); +}; + +template +struct __result_of_memobj_deref : private __result_of_memobj_deref_impl { + typedef decltype(_S_test<_MemPtr, _Arg>(0)) type; +}; + +template +struct __result_of_memobj; + +template +struct __result_of_memobj<_Res _Class::*, _Arg> { + typedef __remove_cvref_t<_Arg> _Argval; + typedef _Res _Class::*_MemPtr; + typedef typename conditional< + __or_, is_base_of<_Class, _Argval>>::value, + __result_of_memobj_ref<_MemPtr, _Arg>, + __result_of_memobj_deref<_MemPtr, _Arg>>::type::type type; +}; + +template +struct __result_of_memfun; + +template +struct __result_of_memfun<_Res _Class::*, _Arg, _Args...> { + typedef typename remove_reference<_Arg>::type _Argval; + typedef _Res _Class::*_MemPtr; + typedef typename conditional< + is_base_of<_Class, _Argval>::value, + __result_of_memfun_ref<_MemPtr, _Arg, _Args...>, + __result_of_memfun_deref<_MemPtr, _Arg, _Args...>>::type::type type; +}; + +// _GLIBCXX_RESOLVE_LIB_DEFECTS +// 2219. INVOKE-ing a pointer to member with a reference_wrapper +// as the object expression + +// Used by result_of, invoke etc. to unwrap a reference_wrapper. +template > +struct __inv_unwrap { + using type = _Tp; +}; + +template +struct __inv_unwrap<_Tp, reference_wrapper<_Up>> { + using type = _Up&; +}; + +template +struct __result_of_impl { + typedef __failure_type type; +}; + +template +struct __result_of_impl + : public __result_of_memobj<__decay_t<_MemPtr>, + typename __inv_unwrap<_Arg>::type> { }; + +template +struct __result_of_impl + : public __result_of_memfun<__decay_t<_MemPtr>, + typename __inv_unwrap<_Arg>::type, _Args...> { +}; + +// [func.require] paragraph 1 bullet 5: +struct __result_of_other_impl { + template + static __result_of_success< + decltype(std::declval<_Fn>()(std::declval<_Args>()...)), __invoke_other> + _S_test(int); + + template + static __failure_type _S_test(...); +}; + +template +struct __result_of_impl + : private __result_of_other_impl { + typedef decltype(_S_test<_Functor, _ArgTypes...>(0)) type; +}; + +// __invoke_result (std::invoke_result for C++11) +template +struct __invoke_result : public __result_of_impl< + is_member_object_pointer< + typename remove_reference<_Functor>::type>::value, + is_member_function_pointer< + typename remove_reference<_Functor>::type>::value, + _Functor, _ArgTypes...>::type { }; + +template +struct result_of<_Functor(_ArgTypes...)> + : public __invoke_result<_Functor, _ArgTypes...> { }; + +#if __cplusplus >= 201402L +/// Alias template for aligned_storage +template ::__type)> +using aligned_storage_t = typename aligned_storage<_Len, _Align>::type; + +template +using aligned_union_t = typename aligned_union<_Len, _Types...>::type; + +/// Alias template for decay +template +using decay_t = typename decay<_Tp>::type; + +/// Alias template for enable_if +template +using enable_if_t = typename enable_if<_Cond, _Tp>::type; + +/// Alias template for conditional +template +using conditional_t = typename conditional<_Cond, _Iftrue, _Iffalse>::type; + +/// Alias template for common_type +template +using common_type_t = typename common_type<_Tp...>::type; + +/// Alias template for underlying_type +template +using underlying_type_t = typename underlying_type<_Tp>::type; + +/// Alias template for result_of +template +using result_of_t = typename result_of<_Tp>::type; +#endif // C++14 + +#if __cplusplus >= 201703L || !defined(__STRICT_ANSI__) // c++17 or gnu++11 +# define __cpp_lib_void_t 201411 +/// A metafunction that always yields void, used for detecting valid types. +template +using void_t = void; +#endif + +/// Implementation of the detection idiom (negative case). +template class _Op, typename... _Args> +struct __detector { + using value_t = false_type; + using type = _Default; +}; + +/// Implementation of the detection idiom (positive case). +template class _Op, + typename... _Args> +struct __detector<_Default, __void_t<_Op<_Args...>>, _Op, _Args...> { + using value_t = true_type; + using type = _Op<_Args...>; +}; + +// Detect whether _Op<_Args...> is a valid type, use _Default if not. +template class _Op, + typename... _Args> +using __detected_or = __detector<_Default, void, _Op, _Args...>; + +// _Op<_Args...> if that is a valid type, otherwise _Default. +template class _Op, + typename... _Args> +using __detected_or_t = typename __detected_or<_Default, _Op, _Args...>::type; + +/// @} group metaprogramming + +/** + * Use SFINAE to determine if the type _Tp has a publicly-accessible + * member type _NTYPE. + */ +#define _GLIBCXX_HAS_NESTED_TYPE(_NTYPE) \ + template > \ + struct __has_##_NTYPE : false_type { }; \ + template \ + struct __has_##_NTYPE<_Tp, __void_t> : true_type { \ + }; + +template +struct __is_swappable; + +template +struct __is_nothrow_swappable; + +template +class tuple; + +template +struct __is_tuple_like_impl : false_type { }; + +template +struct __is_tuple_like_impl> : true_type { }; + +// Internal type trait that allows us to sfinae-protect tuple_cat. +template +struct __is_tuple_like + : public __is_tuple_like_impl<__remove_cvref_t<_Tp>>::type { }; + +template +constexpr inline _Require<__not_<__is_tuple_like<_Tp>>, + is_move_constructible<_Tp>, is_move_assignable<_Tp>> +swap(_Tp&, _Tp&) noexcept(__and_, + is_nothrow_move_assignable<_Tp>>::value); + +template +constexpr inline __enable_if_t<__is_swappable<_Tp>::value> + swap(_Tp (&__a)[_Nm], + _Tp (&__b)[_Nm]) noexcept(__is_nothrow_swappable<_Tp>::value); + +namespace __swappable_details { +using std::swap; + +struct __do_is_swappable_impl { + template (), + std::declval<_Tp&>()))> + static true_type __test(int); + + template + static false_type __test(...); +}; + +struct __do_is_nothrow_swappable_impl { + template + static __bool_constant(), + std::declval<_Tp&>()))> + __test(int); + + template + static false_type __test(...); +}; + +} // namespace __swappable_details + +template +struct __is_swappable_impl + : public __swappable_details::__do_is_swappable_impl { + typedef decltype(__test<_Tp>(0)) type; +}; + +template +struct __is_nothrow_swappable_impl + : public __swappable_details::__do_is_nothrow_swappable_impl { + typedef decltype(__test<_Tp>(0)) type; +}; + +template +struct __is_swappable : public __is_swappable_impl<_Tp>::type { }; + +template +struct __is_nothrow_swappable : public __is_nothrow_swappable_impl<_Tp>::type { +}; + +#if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11 +# define __cpp_lib_is_swappable 201603 + +/// Metafunctions used for detecting swappable types: p0185r1 + +/// is_swappable +template +struct is_swappable : public __is_swappable_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +/// is_nothrow_swappable +template +struct is_nothrow_swappable : public __is_nothrow_swappable_impl<_Tp>::type { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +# if __cplusplus >= 201402L +/// is_swappable_v +template +inline constexpr bool is_swappable_v = is_swappable<_Tp>::value; + +/// is_nothrow_swappable_v +template +inline constexpr bool is_nothrow_swappable_v = is_nothrow_swappable<_Tp>::value; +# endif // __cplusplus >= 201402L + +namespace __swappable_with_details { +using std::swap; + +struct __do_is_swappable_with_impl { + template < + typename _Tp, typename _Up, + typename = decltype(swap(std::declval<_Tp>(), std::declval<_Up>())), + typename = decltype(swap(std::declval<_Up>(), std::declval<_Tp>()))> + static true_type __test(int); + + template + static false_type __test(...); +}; + +struct __do_is_nothrow_swappable_with_impl { + template + static __bool_constant< + noexcept(swap(std::declval<_Tp>(), std::declval<_Up>())) + && noexcept(swap(std::declval<_Up>(), std::declval<_Tp>()))> + __test(int); + + template + static false_type __test(...); +}; + +} // namespace __swappable_with_details + +template +struct __is_swappable_with_impl + : public __swappable_with_details::__do_is_swappable_with_impl { + typedef decltype(__test<_Tp, _Up>(0)) type; +}; + +// Optimization for the homogenous lvalue case, not required: +template +struct __is_swappable_with_impl<_Tp&, _Tp&> + : public __swappable_details::__do_is_swappable_impl { + typedef decltype(__test<_Tp&>(0)) type; +}; + +template +struct __is_nothrow_swappable_with_impl + : public __swappable_with_details::__do_is_nothrow_swappable_with_impl { + typedef decltype(__test<_Tp, _Up>(0)) type; +}; + +// Optimization for the homogenous lvalue case, not required: +template +struct __is_nothrow_swappable_with_impl<_Tp&, _Tp&> + : public __swappable_details::__do_is_nothrow_swappable_impl { + typedef decltype(__test<_Tp&>(0)) type; +}; + +/// is_swappable_with +template +struct is_swappable_with : public __is_swappable_with_impl<_Tp, _Up>::type { }; + +/// is_nothrow_swappable_with +template +struct is_nothrow_swappable_with + : public __is_nothrow_swappable_with_impl<_Tp, _Up>::type { }; + +# if __cplusplus >= 201402L +/// is_swappable_with_v +template +inline constexpr bool is_swappable_with_v = is_swappable_with<_Tp, _Up>::value; + +/// is_nothrow_swappable_with_v +template +inline constexpr bool is_nothrow_swappable_with_v + = is_nothrow_swappable_with<_Tp, _Up>::value; +# endif // __cplusplus >= 201402L + +#endif // c++1z or gnu++11 + +// __is_invocable (std::is_invocable for C++11) + +// The primary template is used for invalid INVOKE expressions. +template ::value, + typename = void> +struct __is_invocable_impl : false_type { }; + +// Used for valid INVOKE and INVOKE expressions. +template +struct __is_invocable_impl<_Result, _Ret, + /* is_void<_Ret> = */ true, + __void_t> : true_type { }; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" + +// Used for INVOKE expressions to check the implicit conversion to R. +template +struct __is_invocable_impl<_Result, _Ret, + /* is_void<_Ret> = */ false, + __void_t> { +private: + // The type of the INVOKE expression. + // Unlike declval, this doesn't add_rvalue_reference. + static typename _Result::type _S_get(); + + template + static void _S_conv(_Tp); + + // This overload is viable if INVOKE(f, args...) can convert to _Tp. + template (_S_get()))> + static true_type _S_test(int); + + template + static false_type _S_test(...); + +public: + using type = decltype(_S_test<_Ret>(1)); +}; + +#pragma GCC diagnostic pop + +template +struct __is_invocable + : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>::type { }; + +template +constexpr bool __call_is_nt(__invoke_memfun_ref) { + using _Up = typename __inv_unwrap<_Tp>::type; + return noexcept((std::declval<_Up>() + .*std::declval<_Fn>())(std::declval<_Args>()...)); +} + +template +constexpr bool __call_is_nt(__invoke_memfun_deref) { + return noexcept(((*std::declval<_Tp>()) + .*std::declval<_Fn>())(std::declval<_Args>()...)); +} + +template +constexpr bool __call_is_nt(__invoke_memobj_ref) { + using _Up = typename __inv_unwrap<_Tp>::type; + return noexcept(std::declval<_Up>().*std::declval<_Fn>()); +} + +template +constexpr bool __call_is_nt(__invoke_memobj_deref) { + return noexcept((*std::declval<_Tp>()).*std::declval<_Fn>()); +} + +template +constexpr bool __call_is_nt(__invoke_other) { + return noexcept(std::declval<_Fn>()(std::declval<_Args>()...)); +} + +template +struct __call_is_nothrow : __bool_constant( + typename _Result::__invoke_type {})> { }; + +template +using __call_is_nothrow_ + = __call_is_nothrow<__invoke_result<_Fn, _Args...>, _Fn, _Args...>; + +// __is_nothrow_invocable (std::is_nothrow_invocable for C++11) +template +struct __is_nothrow_invocable + : __and_<__is_invocable<_Fn, _Args...>, + __call_is_nothrow_<_Fn, _Args...>>::type { }; + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" + +struct __nonesuchbase { }; + +struct __nonesuch : private __nonesuchbase { + ~__nonesuch() = delete; + __nonesuch(const __nonesuch&) = delete; + void operator=(const __nonesuch&) = delete; +}; + +#pragma GCC diagnostic pop + +#if __cplusplus >= 201703L +# define __cpp_lib_is_invocable 201703 + +/// std::invoke_result +template +struct invoke_result : public __invoke_result<_Functor, _ArgTypes...> { }; + +/// std::invoke_result_t +template +using invoke_result_t = typename invoke_result<_Fn, _Args...>::type; + +/// std::is_invocable +template +struct is_invocable + : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>::type { + static_assert(std::__is_complete_or_unbounded(__type_identity<_Fn> {}), + "_Fn must be a complete class or an unbounded array"); +}; + +/// std::is_invocable_r +template +struct is_invocable_r + : __is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, _Ret>::type { + static_assert(std::__is_complete_or_unbounded(__type_identity<_Fn> {}), + "_Fn must be a complete class or an unbounded array"); +}; + +/// std::is_nothrow_invocable +template +struct is_nothrow_invocable + : __and_<__is_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, void>, + __call_is_nothrow_<_Fn, _ArgTypes...>>::type { + static_assert(std::__is_complete_or_unbounded(__type_identity<_Fn> {}), + "_Fn must be a complete class or an unbounded array"); +}; + +template +struct __is_nt_invocable_impl : false_type { }; + +template +struct __is_nt_invocable_impl<_Result, _Ret, __void_t> + : __or_, + __is_nothrow_convertible> { }; + +/// std::is_nothrow_invocable_r +template +struct is_nothrow_invocable_r + : __and_<__is_nt_invocable_impl<__invoke_result<_Fn, _ArgTypes...>, _Ret>, + __call_is_nothrow_<_Fn, _ArgTypes...>>::type { }; + +/// std::is_invocable_v +template +inline constexpr bool is_invocable_v = is_invocable<_Fn, _Args...>::value; + +/// std::is_nothrow_invocable_v +template +inline constexpr bool is_nothrow_invocable_v + = is_nothrow_invocable<_Fn, _Args...>::value; + +/// std::is_invocable_r_v +template +inline constexpr bool is_invocable_r_v + = is_invocable_r<_Ret, _Fn, _Args...>::value; + +/// std::is_nothrow_invocable_r_v +template +inline constexpr bool is_nothrow_invocable_r_v + = is_nothrow_invocable_r<_Ret, _Fn, _Args...>::value; +#endif // C++17 + +#if __cplusplus >= 201703L +# define __cpp_lib_type_trait_variable_templates 201510L +template +inline constexpr bool is_void_v = is_void<_Tp>::value; +template +inline constexpr bool is_null_pointer_v = is_null_pointer<_Tp>::value; +template +inline constexpr bool is_integral_v = is_integral<_Tp>::value; +template +inline constexpr bool is_floating_point_v = is_floating_point<_Tp>::value; +template +inline constexpr bool is_array_v = is_array<_Tp>::value; +template +inline constexpr bool is_pointer_v = is_pointer<_Tp>::value; +template +inline constexpr bool is_lvalue_reference_v = is_lvalue_reference<_Tp>::value; +template +inline constexpr bool is_rvalue_reference_v = is_rvalue_reference<_Tp>::value; +template +inline constexpr bool is_member_object_pointer_v + = is_member_object_pointer<_Tp>::value; +template +inline constexpr bool is_member_function_pointer_v + = is_member_function_pointer<_Tp>::value; +template +inline constexpr bool is_enum_v = is_enum<_Tp>::value; +template +inline constexpr bool is_union_v = is_union<_Tp>::value; +template +inline constexpr bool is_class_v = is_class<_Tp>::value; +template +inline constexpr bool is_function_v = is_function<_Tp>::value; +template +inline constexpr bool is_reference_v = is_reference<_Tp>::value; +template +inline constexpr bool is_arithmetic_v = is_arithmetic<_Tp>::value; +template +inline constexpr bool is_fundamental_v = is_fundamental<_Tp>::value; +template +inline constexpr bool is_object_v = is_object<_Tp>::value; +template +inline constexpr bool is_scalar_v = is_scalar<_Tp>::value; +template +inline constexpr bool is_compound_v = is_compound<_Tp>::value; +template +inline constexpr bool is_member_pointer_v = is_member_pointer<_Tp>::value; +template +inline constexpr bool is_const_v = is_const<_Tp>::value; +template +inline constexpr bool is_volatile_v = is_volatile<_Tp>::value; +template +inline constexpr bool is_trivial_v = is_trivial<_Tp>::value; +template +inline constexpr bool is_trivially_copyable_v + = is_trivially_copyable<_Tp>::value; +template +inline constexpr bool is_standard_layout_v = is_standard_layout<_Tp>::value; +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +template +_GLIBCXX20_DEPRECATED("use is_standard_layout_v && is_trivial_v instead") +inline constexpr bool is_pod_v = is_pod<_Tp>::value; +# pragma GCC diagnostic pop +template +inline constexpr bool is_literal_type_v = is_literal_type<_Tp>::value; +template +inline constexpr bool is_empty_v = is_empty<_Tp>::value; +template +inline constexpr bool is_polymorphic_v = is_polymorphic<_Tp>::value; +template +inline constexpr bool is_abstract_v = is_abstract<_Tp>::value; +template +inline constexpr bool is_final_v = is_final<_Tp>::value; +template +inline constexpr bool is_signed_v = is_signed<_Tp>::value; +template +inline constexpr bool is_unsigned_v = is_unsigned<_Tp>::value; +template +inline constexpr bool is_constructible_v + = is_constructible<_Tp, _Args...>::value; +template +inline constexpr bool is_default_constructible_v + = is_default_constructible<_Tp>::value; +template +inline constexpr bool is_copy_constructible_v + = is_copy_constructible<_Tp>::value; +template +inline constexpr bool is_move_constructible_v + = is_move_constructible<_Tp>::value; +template +inline constexpr bool is_assignable_v = is_assignable<_Tp, _Up>::value; +template +inline constexpr bool is_copy_assignable_v = is_copy_assignable<_Tp>::value; +template +inline constexpr bool is_move_assignable_v = is_move_assignable<_Tp>::value; +template +inline constexpr bool is_destructible_v = is_destructible<_Tp>::value; +template +inline constexpr bool is_trivially_constructible_v + = is_trivially_constructible<_Tp, _Args...>::value; +template +inline constexpr bool is_trivially_default_constructible_v + = is_trivially_default_constructible<_Tp>::value; +template +inline constexpr bool is_trivially_copy_constructible_v + = is_trivially_copy_constructible<_Tp>::value; +template +inline constexpr bool is_trivially_move_constructible_v + = is_trivially_move_constructible<_Tp>::value; +template +inline constexpr bool is_trivially_assignable_v + = is_trivially_assignable<_Tp, _Up>::value; +template +inline constexpr bool is_trivially_copy_assignable_v + = is_trivially_copy_assignable<_Tp>::value; +template +inline constexpr bool is_trivially_move_assignable_v + = is_trivially_move_assignable<_Tp>::value; +template +inline constexpr bool is_trivially_destructible_v + = is_trivially_destructible<_Tp>::value; +template +inline constexpr bool is_nothrow_constructible_v + = is_nothrow_constructible<_Tp, _Args...>::value; +template +inline constexpr bool is_nothrow_default_constructible_v + = is_nothrow_default_constructible<_Tp>::value; +template +inline constexpr bool is_nothrow_copy_constructible_v + = is_nothrow_copy_constructible<_Tp>::value; +template +inline constexpr bool is_nothrow_move_constructible_v + = is_nothrow_move_constructible<_Tp>::value; +template +inline constexpr bool is_nothrow_assignable_v + = is_nothrow_assignable<_Tp, _Up>::value; +template +inline constexpr bool is_nothrow_copy_assignable_v + = is_nothrow_copy_assignable<_Tp>::value; +template +inline constexpr bool is_nothrow_move_assignable_v + = is_nothrow_move_assignable<_Tp>::value; +template +inline constexpr bool is_nothrow_destructible_v + = is_nothrow_destructible<_Tp>::value; +template +inline constexpr bool has_virtual_destructor_v + = has_virtual_destructor<_Tp>::value; +template +inline constexpr size_t alignment_of_v = alignment_of<_Tp>::value; +template +inline constexpr size_t rank_v = rank<_Tp>::value; +template +inline constexpr size_t extent_v = extent<_Tp, _Idx>::value; +# ifdef _GLIBCXX_BUILTIN_IS_SAME_AS +template +inline constexpr bool is_same_v = _GLIBCXX_BUILTIN_IS_SAME_AS(_Tp, _Up); +# else +template +inline constexpr bool is_same_v = std::is_same<_Tp, _Up>::value; +# endif +template +inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value; +template +inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value; + +# ifdef _GLIBCXX_HAVE_BUILTIN_HAS_UNIQ_OBJ_REP +# define __cpp_lib_has_unique_object_representations 201606 + +/// has_unique_object_representations +template +struct has_unique_object_representations + : bool_constant<__has_unique_object_representations( + remove_cv_t>)> { + static_assert( + std::__is_complete_or_unbounded(__type_identity<_Tp> {}), + "template argument must be a complete class or an unbounded array"); +}; + +template +inline constexpr bool has_unique_object_representations_v + = has_unique_object_representations<_Tp>::value; +# endif + +# ifdef _GLIBCXX_HAVE_BUILTIN_IS_AGGREGATE +# define __cpp_lib_is_aggregate 201703 + +/// is_aggregate +template +struct is_aggregate : bool_constant<__is_aggregate(remove_cv_t<_Tp>)> { }; + +/// is_aggregate_v +template +inline constexpr bool is_aggregate_v = is_aggregate<_Tp>::value; +# endif +#endif // C++17 +} // namespace std + +#endif /* SIMPLEKERNEL_TYPE_TRAITS */ diff --git a/src/libcxx/include/type_traits.h b/src/libcxx/include/type_traits.h new file mode 100644 index 000000000..7055ecd8c --- /dev/null +++ b/src/libcxx/include/type_traits.h @@ -0,0 +1,60 @@ + +/** + * @file type_traits.h + * @brief stl type_traits 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_TYPE_TRAITS_H +#define SIMPLEKERNEL_TYPE_TRAITS_H + +// 这个头文件用于提取类型信息 + +// use standard header for type_traits +#include "type_traits" + +namespace mystl { + +// helper struct + +template +struct m_integral_constant { + static constexpr T value = v; +}; + +template +using m_bool_constant = m_integral_constant; + +typedef m_bool_constant m_true_type; +typedef m_bool_constant m_false_type; + +/*****************************************************************************************/ +// type traits + +// is_pair + +// --- forward declaration begin +template +struct pair; + +// --- forward declaration end + +template +struct is_pair : mystl::m_false_type { }; + +template +struct is_pair> : mystl::m_true_type { }; + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_TYPE_TRAITS_H */ diff --git a/src/libcxx/include/uninitialized b/src/libcxx/include/uninitialized new file mode 100644 index 000000000..8e9af3d17 --- /dev/null +++ b/src/libcxx/include/uninitialized @@ -0,0 +1,240 @@ + +/** + * @file uninitialized + * @brief stl uninitialized 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_UNINITIALIZED +#define SIMPLEKERNEL_UNINITIALIZED + +// 这个头文件用于对未初始化空间构造元素 + +#include "algobase" +#include "construct" +#include "iterator" +#include "type_traits.h" +#include "util" + +namespace mystl { + +/*****************************************************************************************/ +// uninitialized_copy +// 把 [first, last) 上的内容复制到以 result +// 为起始处的空间,返回复制结束的位置 +/*****************************************************************************************/ +template +ForwardIter unchecked_uninit_copy(InputIter first, InputIter last, + ForwardIter result, std::true_type) { + return mystl::copy(first, last, result); +} + +template +ForwardIter unchecked_uninit_copy(InputIter first, InputIter last, + ForwardIter result, std::false_type) { + auto cur = result; + try { + for (; first != last; ++first, ++cur) { + mystl::construct(&*cur, *first); + } + } catch (...) { + for (; result != cur; ++result) { + mystl::destroy(&*result); + } + } + return cur; +} + +template +ForwardIter +uninitialized_copy(InputIter first, InputIter last, ForwardIter result) { + return mystl::unchecked_uninit_copy( + first, last, result, + std::is_trivially_copy_assignable< + typename iterator_traits::value_type> {}); +} + +/*****************************************************************************************/ +// uninitialized_copy_n +// 把 [first, first + n) 上的内容复制到以 result +// 为起始处的空间,返回复制结束的位置 +/*****************************************************************************************/ +template +ForwardIter unchecked_uninit_copy_n(InputIter first, Size n, ForwardIter result, + std::true_type) { + return mystl::copy_n(first, n, result).second; +} + +template +ForwardIter unchecked_uninit_copy_n(InputIter first, Size n, ForwardIter result, + std::false_type) { + auto cur = result; + try { + for (; n > 0; --n, ++cur, ++first) { + mystl::construct(&*cur, *first); + } + } catch (...) { + for (; result != cur; ++result) { + mystl::destroy(&*result); + } + } + return cur; +} + +template +ForwardIter uninitialized_copy_n(InputIter first, Size n, ForwardIter result) { + return mystl::unchecked_uninit_copy_n( + first, n, result, + std::is_trivially_copy_assignable< + typename iterator_traits::value_type> {}); +} + +/*****************************************************************************************/ +// uninitialized_fill +// 在 [first, last) 区间内填充元素值 +/*****************************************************************************************/ +template +void unchecked_uninit_fill(ForwardIter first, ForwardIter last, const T& value, + std::true_type) { + mystl::fill(first, last, value); +} + +template +void unchecked_uninit_fill(ForwardIter first, ForwardIter last, const T& value, + std::false_type) { + auto cur = first; + try { + for (; cur != last; ++cur) { + mystl::construct(&*cur, value); + } + } catch (...) { + for (; first != cur; ++first) { + mystl::destroy(&*first); + } + } +} + +template +void uninitialized_fill(ForwardIter first, ForwardIter last, const T& value) { + mystl::unchecked_uninit_fill( + first, last, value, + std::is_trivially_copy_assignable< + typename iterator_traits::value_type> {}); +} + +/*****************************************************************************************/ +// uninitialized_fill_n +// 从 first 位置开始,填充 n 个元素值,返回填充结束的位置 +/*****************************************************************************************/ +template +ForwardIter unchecked_uninit_fill_n(ForwardIter first, Size n, const T& value, + std::true_type) { + return mystl::fill_n(first, n, value); +} + +template +ForwardIter unchecked_uninit_fill_n(ForwardIter first, Size n, const T& value, + std::false_type) { + auto cur = first; + try { + for (; n > 0; --n, ++cur) { + mystl::construct(&*cur, value); + } + } catch (...) { + for (; first != cur; ++first) { + mystl::destroy(&*first); + } + } + return cur; +} + +template +ForwardIter uninitialized_fill_n(ForwardIter first, Size n, const T& value) { + return mystl::unchecked_uninit_fill_n( + first, n, value, + std::is_trivially_copy_assignable< + typename iterator_traits::value_type> {}); +} + +/*****************************************************************************************/ +// uninitialized_move +// 把[first, last)上的内容移动到以 result 为起始处的空间,返回移动结束的位置 +/*****************************************************************************************/ +template +ForwardIter unchecked_uninit_move(InputIter first, InputIter last, + ForwardIter result, std::true_type) { + return mystl::move(first, last, result); +} + +template +ForwardIter unchecked_uninit_move(InputIter first, InputIter last, + ForwardIter result, std::false_type) { + ForwardIter cur = result; + try { + for (; first != last; ++first, ++cur) { + mystl::construct(&*cur, mystl::move(*first)); + } + } catch (...) { + mystl::destroy(result, cur); + } + return cur; +} + +template +ForwardIter +uninitialized_move(InputIter first, InputIter last, ForwardIter result) { + return mystl::unchecked_uninit_move( + first, last, result, + std::is_trivially_move_assignable< + typename iterator_traits::value_type> {}); +} + +/*****************************************************************************************/ +// uninitialized_move_n +// 把[first, first + n)上的内容移动到以 result +// 为起始处的空间,返回移动结束的位置 +/*****************************************************************************************/ +template +ForwardIter unchecked_uninit_move_n(InputIter first, Size n, ForwardIter result, + std::true_type) { + return mystl::move(first, first + n, result); +} + +template +ForwardIter unchecked_uninit_move_n(InputIter first, Size n, ForwardIter result, + std::false_type) { + auto cur = result; + try { + for (; n > 0; --n, ++first, ++cur) { + mystl::construct(&*cur, mystl::move(*first)); + } + } catch (...) { + for (; result != cur; ++result) { + mystl::destroy(&*result); + } + throw; + } + return cur; +} + +template +ForwardIter uninitialized_move_n(InputIter first, Size n, ForwardIter result) { + return mystl::unchecked_uninit_move_n( + first, n, result, + std::is_trivially_move_assignable< + typename iterator_traits::value_type> {}); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_UNINITIALIZED */ diff --git a/src/libcxx/include/unordered_map b/src/libcxx/include/unordered_map new file mode 100644 index 000000000..06a4f9b81 --- /dev/null +++ b/src/libcxx/include/unordered_map @@ -0,0 +1,723 @@ + +/** + * @file unordered_map + * @brief stl unordered_map 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_UNORDERED_MAP +#define SIMPLEKERNEL_UNORDERED_MAP + +// 这个头文件包含两个模板类 unordered_map 和 unordered_multimap +// 功能与用法与 map 和 multimap 类似,不同的是使用 hashtable +// 作为底层实现机制,容器内的元素不会自动排序 + +// notes: +// +// 异常保证: +// std::unordered_map / std::unordered_multimap +// 满足基本异常保证,对以下等函数做强异常安全保证: +// * emplace +// * emplace_hint +// * insert + +#include "hashtable" + +namespace mystl { + +// 模板类 unordered_map,键值不允许重复 +// 参数一代表键值类型,参数二代表实值类型,参数三代表哈希函数,缺省使用 +// mystl::hash 参数四代表键值比较方式,缺省使用 mystl::equal_to +template , + class KeyEqual = mystl::equal_to> +class unordered_map { +private: + // 使用 hashtable 作为底层机制 + typedef hashtable, Hash, KeyEqual> base_type; + base_type ht_; + +public: + // 使用 hashtable 的型别 + + typedef typename base_type::allocator_type allocator_type; + typedef typename base_type::key_type key_type; + typedef typename base_type::mapped_type mapped_type; + typedef typename base_type::value_type value_type; + typedef typename base_type::hasher hasher; + typedef typename base_type::key_equal key_equal; + + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::local_iterator local_iterator; + typedef typename base_type::const_local_iterator const_local_iterator; + + allocator_type get_allocator() const { + return ht_.get_allocator(); + } + +public: + // 构造、复制、移动、析构函数 + + unordered_map() : ht_(100, Hash(), KeyEqual()) { + } + + explicit unordered_map(size_type bucket_count, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(bucket_count, hash, equal) { + } + + template + unordered_map(InputIterator first, InputIterator last, + const size_type bucket_count = 100, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, + static_cast(mystl::distance(first, last))), + hash, equal) { + for (; first != last; ++first) { + ht_.insert_unique_noresize(*first); + } + } + + unordered_map(std::initializer_list ilist, + const size_type bucket_count = 100, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, static_cast(ilist.size())), + hash, equal) { + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_unique_noresize(*first); + } + } + + unordered_map(const unordered_map& rhs) : ht_(rhs.ht_) { + } + + unordered_map(unordered_map&& rhs) noexcept : ht_(mystl::move(rhs.ht_)) { + } + + unordered_map& operator=(const unordered_map& rhs) { + ht_ = rhs.ht_; + return *this; + } + + unordered_map& operator=(unordered_map&& rhs) { + ht_ = mystl::move(rhs.ht_); + return *this; + } + + unordered_map& operator=(std::initializer_list ilist) { + ht_.clear(); + ht_.reserve(ilist.size()); + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_unique_noresize(*first); + } + return *this; + } + + ~unordered_map() = default; + + // 迭代器相关 + + iterator begin() noexcept { + return ht_.begin(); + } + + const_iterator begin() const noexcept { + return ht_.begin(); + } + + iterator end() noexcept { + return ht_.end(); + } + + const_iterator end() const noexcept { + return ht_.end(); + } + + const_iterator cbegin() const noexcept { + return ht_.cbegin(); + } + + const_iterator cend() const noexcept { + return ht_.cend(); + } + + // 容量相关 + + bool empty() const noexcept { + return ht_.empty(); + } + + size_type size() const noexcept { + return ht_.size(); + } + + size_type max_size() const noexcept { + return ht_.max_size(); + } + + // 修改容器操作 + + // empalce / empalce_hint + + template + pair emplace(Args&&... args) { + return ht_.emplace_unique(mystl::forward(args)...); + } + + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return ht_.emplace_unique_use_hint(hint, mystl::forward(args)...); + } + + // insert + + pair insert(const value_type& value) { + return ht_.insert_unique(value); + } + + pair insert(value_type&& value) { + return ht_.emplace_unique(mystl::move(value)); + } + + iterator insert(const_iterator hint, const value_type& value) { + return ht_.insert_unique_use_hint(hint, value); + } + + iterator insert(const_iterator hint, value_type&& value) { + return ht_.emplace_unique_use_hint(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + ht_.insert_unique(first, last); + } + + // erase / clear + + void erase(iterator it) { + ht_.erase(it); + } + + void erase(iterator first, iterator last) { + ht_.erase(first, last); + } + + size_type erase(const key_type& key) { + return ht_.erase_unique(key); + } + + void clear() { + ht_.clear(); + } + + void swap(unordered_map& other) noexcept { + ht_.swap(other.ht_); + } + + // 查找相关 + + mapped_type& at(const key_type& key) { + iterator it = ht_.find(key); + THROW_OUT_OF_RANGE_IF(it.node == nullptr, + "unordered_map no such element exists"); + return it->second; + } + + const mapped_type& at(const key_type& key) const { + iterator it = ht_.find(key); + THROW_OUT_OF_RANGE_IF(it.node == nullptr, + "unordered_map no such element exists"); + return it->second; + } + + mapped_type& operator[](const key_type& key) { + iterator it = ht_.find(key); + if (it.node == nullptr) { + it = ht_.emplace_unique(key, T {}).first; + } + return it->second; + } + + mapped_type& operator[](key_type&& key) { + iterator it = ht_.find(key); + if (it.node == nullptr) { + it = ht_.emplace_unique(mystl::move(key), T {}).first; + } + return it->second; + } + + size_type count(const key_type& key) const { + return ht_.count(key); + } + + iterator find(const key_type& key) { + return ht_.find(key); + } + + const_iterator find(const key_type& key) const { + return ht_.find(key); + } + + pair equal_range(const key_type& key) { + return ht_.equal_range_unique(key); + } + + pair + equal_range(const key_type& key) const { + return ht_.equal_range_unique(key); + } + + // bucket interface + + local_iterator begin(size_type n) noexcept { + return ht_.begin(n); + } + + const_local_iterator begin(size_type n) const noexcept { + return ht_.begin(n); + } + + const_local_iterator cbegin(size_type n) const noexcept { + return ht_.cbegin(n); + } + + local_iterator end(size_type n) noexcept { + return ht_.end(n); + } + + const_local_iterator end(size_type n) const noexcept { + return ht_.end(n); + } + + const_local_iterator cend(size_type n) const noexcept { + return ht_.cend(n); + } + + size_type bucket_count() const noexcept { + return ht_.bucket_count(); + } + + size_type max_bucket_count() const noexcept { + return ht_.max_bucket_count(); + } + + size_type bucket_size(size_type n) const noexcept { + return ht_.bucket_size(n); + } + + size_type bucket(const key_type& key) const { + return ht_.bucket(key); + } + + // hash policy + + float load_factor() const noexcept { + return ht_.load_factor(); + } + + float max_load_factor() const noexcept { + return ht_.max_load_factor(); + } + + void max_load_factor(float ml) { + ht_.max_load_factor(ml); + } + + void rehash(size_type count) { + ht_.rehash(count); + } + + void reserve(size_type count) { + ht_.reserve(count); + } + + hasher hash_fcn() const { + return ht_.hash_fcn(); + } + + key_equal key_eq() const { + return ht_.key_eq(); + } + +public: + friend bool operator==(const unordered_map& lhs, const unordered_map& rhs) { + return lhs.ht_.equal_range_unique(rhs.ht_); + } + + friend bool operator!=(const unordered_map& lhs, const unordered_map& rhs) { + return !lhs.ht_.equal_range_unique(rhs.ht_); + } +}; + +// 重载比较操作符 +template +bool operator==(const unordered_map& lhs, + const unordered_map& rhs) { + return lhs == rhs; +} + +template +bool operator!=(const unordered_map& lhs, + const unordered_map& rhs) { + return lhs != rhs; +} + +// 重载 mystl 的 swap +template +void swap(unordered_map& lhs, + unordered_map& rhs) { + lhs.swap(rhs); +} + +/*****************************************************************************************/ + +// 模板类 unordered_multimap,键值允许重复 +// 参数一代表键值类型,参数二代表实值类型,参数三代表哈希函数,缺省使用 +// mystl::hash 参数四代表键值比较方式,缺省使用 mystl::equal_to +template , + class KeyEqual = mystl::equal_to> +class unordered_multimap { +private: + // 使用 hashtable 作为底层机制 + typedef hashtable, Hash, KeyEqual> base_type; + base_type ht_; + +public: + // 使用 hashtable 的型别 + typedef typename base_type::allocator_type allocator_type; + typedef typename base_type::key_type key_type; + typedef typename base_type::mapped_type mapped_type; + typedef typename base_type::value_type value_type; + typedef typename base_type::hasher hasher; + typedef typename base_type::key_equal key_equal; + + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + + typedef typename base_type::iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::local_iterator local_iterator; + typedef typename base_type::const_local_iterator const_local_iterator; + + allocator_type get_allocator() const { + return ht_.get_allocator(); + } + +public: + // 构造、复制、移动函数 + + unordered_multimap() : ht_(100, Hash(), KeyEqual()) { + } + + explicit unordered_multimap(size_type bucket_count, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(bucket_count, hash, equal) { + } + + template + unordered_multimap(InputIterator first, InputIterator last, + const size_type bucket_count = 100, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, + static_cast(mystl::distance(first, last))), + hash, equal) { + for (; first != last; ++first) { + ht_.insert_multi_noresize(*first); + } + } + + unordered_multimap(std::initializer_list ilist, + const size_type bucket_count = 100, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, static_cast(ilist.size())), + hash, equal) { + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_multi_noresize(*first); + } + } + + unordered_multimap(const unordered_multimap& rhs) : ht_(rhs.ht_) { + } + + unordered_multimap(unordered_multimap&& rhs) noexcept + : ht_(mystl::move(rhs.ht_)) { + } + + unordered_multimap& operator=(const unordered_multimap& rhs) { + ht_ = rhs.ht_; + return *this; + } + + unordered_multimap& operator=(unordered_multimap&& rhs) { + ht_ = mystl::move(rhs.ht_); + return *this; + } + + unordered_multimap& operator=(std::initializer_list ilist) { + ht_.clear(); + ht_.reserve(ilist.size()); + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_multi_noresize(*first); + } + return *this; + } + + ~unordered_multimap() = default; + + // 迭代器相关 + + iterator begin() noexcept { + return ht_.begin(); + } + + const_iterator begin() const noexcept { + return ht_.begin(); + } + + iterator end() noexcept { + return ht_.end(); + } + + const_iterator end() const noexcept { + return ht_.end(); + } + + const_iterator cbegin() const noexcept { + return ht_.cbegin(); + } + + const_iterator cend() const noexcept { + return ht_.cend(); + } + + // 容量相关 + + bool empty() const noexcept { + return ht_.empty(); + } + + size_type size() const noexcept { + return ht_.size(); + } + + size_type max_size() const noexcept { + return ht_.max_size(); + } + + // 修改容器相关 + + // emplace / emplace_hint + + template + iterator emplace(Args&&... args) { + return ht_.emplace_multi(mystl::forward(args)...); + } + + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return ht_.emplace_multi_use_hint(hint, mystl::forward(args)...); + } + + // insert + + iterator insert(const value_type& value) { + return ht_.insert_multi(value); + } + + iterator insert(value_type&& value) { + return ht_.emplace_multi(mystl::move(value)); + } + + iterator insert(const_iterator hint, const value_type& value) { + return ht_.insert_multi_use_hint(hint, value); + } + + iterator insert(const_iterator hint, value_type&& value) { + return ht_.emplace_multi_use_hint(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + ht_.insert_multi(first, last); + } + + // erase / clear + + void erase(iterator it) { + ht_.erase(it); + } + + void erase(iterator first, iterator last) { + ht_.erase(first, last); + } + + size_type erase(const key_type& key) { + return ht_.erase_multi(key); + } + + void clear() { + ht_.clear(); + } + + void swap(unordered_multimap& other) noexcept { + ht_.swap(other.ht_); + } + + // 查找相关 + + size_type count(const key_type& key) const { + return ht_.count(key); + } + + iterator find(const key_type& key) { + return ht_.find(key); + } + + const_iterator find(const key_type& key) const { + return ht_.find(key); + } + + pair equal_range(const key_type& key) { + return ht_.equal_range_multi(key); + } + + pair + equal_range(const key_type& key) const { + return ht_.equal_range_multi(key); + } + + // bucket interface + + local_iterator begin(size_type n) noexcept { + return ht_.begin(n); + } + + const_local_iterator begin(size_type n) const noexcept { + return ht_.begin(n); + } + + const_local_iterator cbegin(size_type n) const noexcept { + return ht_.cbegin(n); + } + + local_iterator end(size_type n) noexcept { + return ht_.end(n); + } + + const_local_iterator end(size_type n) const noexcept { + return ht_.end(n); + } + + const_local_iterator cend(size_type n) const noexcept { + return ht_.cend(n); + } + + size_type bucket_count() const noexcept { + return ht_.bucket_count(); + } + + size_type max_bucket_count() const noexcept { + return ht_.max_bucket_count(); + } + + size_type bucket_size(size_type n) const noexcept { + return ht_.bucket_size(n); + } + + size_type bucket(const key_type& key) const { + return ht_.bucket(key); + } + + // hash policy + + float load_factor() const noexcept { + return ht_.load_factor(); + } + + float max_load_factor() const noexcept { + return ht_.max_load_factor(); + } + + void max_load_factor(float ml) { + ht_.max_load_factor(ml); + } + + void rehash(size_type count) { + ht_.rehash(count); + } + + void reserve(size_type count) { + ht_.reserve(count); + } + + hasher hash_fcn() const { + return ht_.hash_fcn(); + } + + key_equal key_eq() const { + return ht_.key_eq(); + } + +public: + friend bool + operator==(const unordered_multimap& lhs, const unordered_multimap& rhs) { + return lhs.ht_.equal_range_multi(rhs.ht_); + } + + friend bool + operator!=(const unordered_multimap& lhs, const unordered_multimap& rhs) { + return !lhs.ht_.equal_range_multi(rhs.ht_); + } +}; + +// 重载比较操作符 +template +bool operator==(const unordered_multimap& lhs, + const unordered_multimap& rhs) { + return lhs == rhs; +} + +template +bool operator!=(const unordered_multimap& lhs, + const unordered_multimap& rhs) { + return lhs != rhs; +} + +// 重载 mystl 的 swap +template +void swap(unordered_multimap& lhs, + unordered_multimap& rhs) { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_UNORDERED_MAP */ diff --git a/src/libcxx/include/unordered_set b/src/libcxx/include/unordered_set new file mode 100644 index 000000000..04b8dd750 --- /dev/null +++ b/src/libcxx/include/unordered_set @@ -0,0 +1,690 @@ + +/** + * @file unordered_set + * @brief stl unordered_set 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_UNORDERED_SET +#define SIMPLEKERNEL_UNORDERED_SET + +// 这个头文件包含两个模板类 unordered_set 和 unordered_multiset +// 功能与用法与 set 和 multiset 类似,不同的是使用 hashtable +// 作为底层实现机制,容器中的元素不会自动排序 + +// notes: +// +// 异常保证: +// std::unordered_set / std::unordered_multiset +// 满足基本异常保证,对以下等函数做强异常安全保证: +// * emplace +// * emplace_hint +// * insert + +#include "hashtable" + +namespace mystl { + +// 模板类 unordered_set,键值不允许重复 +// 参数一代表键值类型,参数二代表哈希函数,缺省使用 mystl::hash, +// 参数三代表键值比较方式,缺省使用 mystl::equal_to +template , + class KeyEqual = mystl::equal_to> +class unordered_set { +private: + // 使用 hashtable 作为底层机制 + typedef hashtable base_type; + base_type ht_; + +public: + // 使用 hashtable 的型别 + typedef typename base_type::allocator_type allocator_type; + typedef typename base_type::key_type key_type; + typedef typename base_type::value_type value_type; + typedef typename base_type::hasher hasher; + typedef typename base_type::key_equal key_equal; + + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + + typedef typename base_type::const_iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::const_local_iterator local_iterator; + typedef typename base_type::const_local_iterator const_local_iterator; + + allocator_type get_allocator() const { + return ht_.get_allocator(); + } + +public: + // 构造、复制、移动函数 + + unordered_set() : ht_(100, Hash(), KeyEqual()) { + } + + explicit unordered_set(size_type bucket_count, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(bucket_count, hash, equal) { + } + + template + unordered_set(InputIterator first, InputIterator last, + const size_type bucket_count = 100, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, + static_cast(mystl::distance(first, last))), + hash, equal) { + for (; first != last; ++first) { + ht_.insert_unique_noresize(*first); + } + } + + unordered_set(std::initializer_list ilist, + const size_type bucket_count = 100, const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, static_cast(ilist.size())), + hash, equal) { + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_unique_noresize(*first); + } + } + + unordered_set(const unordered_set& rhs) : ht_(rhs.ht_) { + } + + unordered_set(unordered_set&& rhs) noexcept : ht_(mystl::move(rhs.ht_)) { + } + + unordered_set& operator=(const unordered_set& rhs) { + ht_ = rhs.ht_; + return *this; + } + + unordered_set& operator=(unordered_set&& rhs) { + ht_ = mystl::move(rhs.ht_); + return *this; + } + + unordered_set& operator=(std::initializer_list ilist) { + ht_.clear(); + ht_.reserve(ilist.size()); + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_unique_noresize(*first); + } + return *this; + } + + ~unordered_set() = default; + + // 迭代器相关 + + iterator begin() noexcept { + return ht_.begin(); + } + + const_iterator begin() const noexcept { + return ht_.begin(); + } + + iterator end() noexcept { + return ht_.end(); + } + + const_iterator end() const noexcept { + return ht_.end(); + } + + const_iterator cbegin() const noexcept { + return ht_.cbegin(); + } + + const_iterator cend() const noexcept { + return ht_.cend(); + } + + // 容量相关 + + bool empty() const noexcept { + return ht_.empty(); + } + + size_type size() const noexcept { + return ht_.size(); + } + + size_type max_size() const noexcept { + return ht_.max_size(); + } + + // 修改容器操作 + + // empalce / empalce_hint + + template + pair emplace(Args&&... args) { + return ht_.emplace_unique(mystl::forward(args)...); + } + + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return ht_.emplace_unique_use_hint(hint, mystl::forward(args)...); + } + + // insert + + pair insert(const value_type& value) { + return ht_.insert_unique(value); + } + + pair insert(value_type&& value) { + return ht_.emplace_unique(mystl::move(value)); + } + + iterator insert(const_iterator hint, const value_type& value) { + return ht_.insert_unique_use_hint(hint, value); + } + + iterator insert(const_iterator hint, value_type&& value) { + return ht_.emplace_unique_use_hint(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + ht_.insert_unique(first, last); + } + + // erase / clear + + void erase(iterator it) { + ht_.erase(it); + } + + void erase(iterator first, iterator last) { + ht_.erase(first, last); + } + + size_type erase(const key_type& key) { + return ht_.erase_unique(key); + } + + void clear() { + ht_.clear(); + } + + void swap(unordered_set& other) noexcept { + ht_.swap(other.ht_); + } + + // 查找相关 + + size_type count(const key_type& key) const { + return ht_.count(key); + } + + iterator find(const key_type& key) { + return ht_.find(key); + } + + const_iterator find(const key_type& key) const { + return ht_.find(key); + } + + pair equal_range(const key_type& key) { + return ht_.equal_range_unique(key); + } + + pair + equal_range(const key_type& key) const { + return ht_.equal_range_unique(key); + } + + // bucket interface + + local_iterator begin(size_type n) noexcept { + return ht_.begin(n); + } + + const_local_iterator begin(size_type n) const noexcept { + return ht_.begin(n); + } + + const_local_iterator cbegin(size_type n) const noexcept { + return ht_.cbegin(n); + } + + local_iterator end(size_type n) noexcept { + return ht_.end(n); + } + + const_local_iterator end(size_type n) const noexcept { + return ht_.end(n); + } + + const_local_iterator cend(size_type n) const noexcept { + return ht_.cend(n); + } + + size_type bucket_count() const noexcept { + return ht_.bucket_count(); + } + + size_type max_bucket_count() const noexcept { + return ht_.max_bucket_count(); + } + + size_type bucket_size(size_type n) const noexcept { + return ht_.bucket_size(n); + } + + size_type bucket(const key_type& key) const { + return ht_.bucket(key); + } + + // hash policy + + float load_factor() const noexcept { + return ht_.load_factor(); + } + + float max_load_factor() const noexcept { + return ht_.max_load_factor(); + } + + void max_load_factor(float ml) { + ht_.max_load_factor(ml); + } + + void rehash(size_type count) { + ht_.rehash(count); + } + + void reserve(size_type count) { + ht_.reserve(count); + } + + hasher hash_fcn() const { + return ht_.hash_fcn(); + } + + key_equal key_eq() const { + return ht_.key_eq(); + } + +public: + friend bool operator==(const unordered_set& lhs, const unordered_set& rhs) { + return lhs.ht_.equal_range_unique(rhs.ht_); + } + + friend bool operator!=(const unordered_set& lhs, const unordered_set& rhs) { + return !lhs.ht_.equal_range_unique(rhs.ht_); + } +}; + +// 重载比较操作符 +template +bool operator==(const unordered_set& lhs, + const unordered_set& rhs) { + return lhs == rhs; +} + +template +bool operator!=(const unordered_set& lhs, + const unordered_set& rhs) { + return lhs != rhs; +} + +// 重载 mystl 的 swap +template +void swap(unordered_set& lhs, + unordered_set& rhs) { + lhs.swap(rhs); +} + +/*****************************************************************************************/ + +// 模板类 unordered_multiset,键值允许重复 +// 参数一代表键值类型,参数二代表哈希函数,缺省使用 mystl::hash, +// 参数三代表键值比较方式,缺省使用 mystl::equal_to +template , + class KeyEqual = mystl::equal_to> +class unordered_multiset { +private: + // 使用 hashtable 作为底层机制 + typedef hashtable base_type; + base_type ht_; + +public: + // 使用 hashtable 的型别 + typedef typename base_type::allocator_type allocator_type; + typedef typename base_type::key_type key_type; + typedef typename base_type::value_type value_type; + typedef typename base_type::hasher hasher; + typedef typename base_type::key_equal key_equal; + + typedef typename base_type::size_type size_type; + typedef typename base_type::difference_type difference_type; + typedef typename base_type::pointer pointer; + typedef typename base_type::const_pointer const_pointer; + typedef typename base_type::reference reference; + typedef typename base_type::const_reference const_reference; + + typedef typename base_type::const_iterator iterator; + typedef typename base_type::const_iterator const_iterator; + typedef typename base_type::const_local_iterator local_iterator; + typedef typename base_type::const_local_iterator const_local_iterator; + + allocator_type get_allocator() const { + return ht_.get_allocator(); + } + +public: + // 构造、复制、移动函数 + + unordered_multiset() : ht_(100, Hash(), KeyEqual()) { + } + + explicit unordered_multiset(size_type bucket_count, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(bucket_count, hash, equal) { + } + + template + unordered_multiset(InputIterator first, InputIterator last, + const size_type bucket_count = 100, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, + static_cast(mystl::distance(first, last))), + hash, equal) { + for (; first != last; ++first) { + ht_.insert_multi_noresize(*first); + } + } + + unordered_multiset(std::initializer_list ilist, + const size_type bucket_count = 100, + const Hash& hash = Hash(), + const KeyEqual& equal = KeyEqual()) + : ht_(mystl::max(bucket_count, static_cast(ilist.size())), + hash, equal) { + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_multi_noresize(*first); + } + } + + unordered_multiset(const unordered_multiset& rhs) : ht_(rhs.ht_) { + } + + unordered_multiset(unordered_multiset&& rhs) noexcept + : ht_(mystl::move(rhs.ht_)) { + } + + unordered_multiset& operator=(const unordered_multiset& rhs) { + ht_ = rhs.ht_; + return *this; + } + + unordered_multiset& operator=(unordered_multiset&& rhs) { + ht_ = mystl::move(rhs.ht_); + return *this; + } + + unordered_multiset& operator=(std::initializer_list ilist) { + ht_.clear(); + ht_.reserve(ilist.size()); + for (auto first = ilist.begin(), last = ilist.end(); first != last; + ++first) { + ht_.insert_multi_noresize(*first); + } + return *this; + } + + ~unordered_multiset() = default; + + // 迭代器相关 + + iterator begin() noexcept { + return ht_.begin(); + } + + const_iterator begin() const noexcept { + return ht_.begin(); + } + + iterator end() noexcept { + return ht_.end(); + } + + const_iterator end() const noexcept { + return ht_.end(); + } + + const_iterator cbegin() const noexcept { + return ht_.cbegin(); + } + + const_iterator cend() const noexcept { + return ht_.cend(); + } + + // 容量相关 + + bool empty() const noexcept { + return ht_.empty(); + } + + size_type size() const noexcept { + return ht_.size(); + } + + size_type max_size() const noexcept { + return ht_.max_size(); + } + + // 修改容器相关 + + // emplace / emplace_hint + + template + iterator emplace(Args&&... args) { + return ht_.emplace_multi(mystl::forward(args)...); + } + + template + iterator emplace_hint(const_iterator hint, Args&&... args) { + return ht_.emplace_multi_use_hint(hint, mystl::forward(args)...); + } + + // insert + + iterator insert(const value_type& value) { + return ht_.insert_multi(value); + } + + iterator insert(value_type&& value) { + return ht_.emplace_multi(mystl::move(value)); + } + + iterator insert(const_iterator hint, const value_type& value) { + return ht_.insert_multi_use_hint(hint, value); + } + + iterator insert(const_iterator hint, value_type&& value) { + return ht_.emplace_multi_use_hint(hint, mystl::move(value)); + } + + template + void insert(InputIterator first, InputIterator last) { + ht_.insert_multi(first, last); + } + + // erase / clear + + void erase(iterator it) { + ht_.erase(it); + } + + void erase(iterator first, iterator last) { + ht_.erase(first, last); + } + + size_type erase(const key_type& key) { + return ht_.erase_multi(key); + } + + void clear() { + ht_.clear(); + } + + void swap(unordered_multiset& other) noexcept { + ht_.swap(other.ht_); + } + + // 查找相关 + + size_type count(const key_type& key) const { + return ht_.count(key); + } + + iterator find(const key_type& key) { + return ht_.find(key); + } + + const_iterator find(const key_type& key) const { + return ht_.find(key); + } + + pair equal_range(const key_type& key) { + return ht_.equal_range_multi(key); + } + + pair + equal_range(const key_type& key) const { + return ht_.equal_range_multi(key); + } + + // bucket interface + + local_iterator begin(size_type n) noexcept { + return ht_.begin(n); + } + + const_local_iterator begin(size_type n) const noexcept { + return ht_.begin(n); + } + + const_local_iterator cbegin(size_type n) const noexcept { + return ht_.cbegin(n); + } + + local_iterator end(size_type n) noexcept { + return ht_.end(n); + } + + const_local_iterator end(size_type n) const noexcept { + return ht_.end(n); + } + + const_local_iterator cend(size_type n) const noexcept { + return ht_.cend(n); + } + + size_type bucket_count() const noexcept { + return ht_.bucket_count(); + } + + size_type max_bucket_count() const noexcept { + return ht_.max_bucket_count(); + } + + size_type bucket_size(size_type n) const noexcept { + return ht_.bucket_size(n); + } + + size_type bucket(const key_type& key) const { + return ht_.bucket(key); + } + + // hash policy + + float load_factor() const noexcept { + return ht_.load_factor(); + } + + float max_load_factor() const noexcept { + return ht_.max_load_factor(); + } + + void max_load_factor(float ml) { + ht_.max_load_factor(ml); + } + + void rehash(size_type count) { + ht_.rehash(count); + } + + void reserve(size_type count) { + ht_.reserve(count); + } + + hasher hash_fcn() const { + return ht_.hash_fcn(); + } + + key_equal key_eq() const { + return ht_.key_eq(); + } + +public: + friend bool + operator==(const unordered_multiset& lhs, const unordered_multiset& rhs) { + return lhs.ht_.equal_range_multi(rhs.ht_); + } + + friend bool + operator!=(const unordered_multiset& lhs, const unordered_multiset& rhs) { + return !lhs.ht_.equal_range_multi(rhs.ht_); + } +}; + +// 重载比较操作符 +template +bool operator==(const unordered_multiset& lhs, + const unordered_multiset& rhs) { + return lhs == rhs; +} + +template +bool operator!=(const unordered_multiset& lhs, + const unordered_multiset& rhs) { + return lhs != rhs; +} + +// 重载 mystl 的 swap +template +void swap(unordered_multiset& lhs, + unordered_multiset& rhs) { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_UNORDERED_SET */ diff --git a/src/libcxx/include/util b/src/libcxx/include/util new file mode 100644 index 000000000..ddd668f36 --- /dev/null +++ b/src/libcxx/include/util @@ -0,0 +1,292 @@ + +/** + * @file util + * @brief stl util 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_UTIL +#define SIMPLEKERNEL_UTIL + +// 这个文件包含一些通用工具,包括 move, forward, swap 等函数,以及 pair 等 + +#include "stddef.h" +#include "type_traits.h" + +namespace mystl { + +// move + +template +typename std::remove_reference::type&& move(T&& arg) noexcept { + return static_cast::type&&>(arg); +} + +// forward + +template +T&& forward(typename std::remove_reference::type& arg) noexcept { + return static_cast(arg); +} + +template +T&& forward(typename std::remove_reference::type&& arg) noexcept { + static_assert(!std::is_lvalue_reference::value, "bad forward"); + return static_cast(arg); +} + +// swap + +template +void swap(Tp& lhs, Tp& rhs) { + auto tmp(mystl::move(lhs)); + lhs = mystl::move(rhs); + rhs = mystl::move(tmp); +} + +template +ForwardIter2 +swap_range(ForwardIter1 first1, ForwardIter1 last1, ForwardIter2 first2) { + for (; first1 != last1; ++first1, (void)++first2) { + mystl::swap(*first1, *first2); + } + return first2; +} + +template +void swap(Tp (&a)[N], Tp (&b)[N]) { + mystl::swap_range(a, a + N, b); +} + +// -------------------------------------------------------------------------------------- +// pair + +// 结构体模板 : pair +// 两个模板参数分别表示两个数据的类型 +// 用 first 和 second 来分别取出第一个数据和第二个数据 +template +struct pair { + typedef Ty1 first_type; + typedef Ty2 second_type; + + first_type first; // 保存第一个数据 + second_type second; // 保存第二个数据 + + // default constructiable + template ::value + && std::is_default_constructible::value, + void>::type> + constexpr pair() : first(), second() { + } + + // implicit constructiable for this type + template < + class U1 = Ty1, class U2 = Ty2, + typename std::enable_if::value + && std::is_copy_constructible::value + && std::is_convertible::value + && std::is_convertible::value, + int>::type + = 0> + constexpr pair(const Ty1& a, const Ty2& b) : first(a), second(b) { + } + + // explicit constructible for this type + template ::value + && std::is_copy_constructible::value + && (!std::is_convertible::value + || !std::is_convertible::value), + int>::type + = 0> + explicit constexpr pair(const Ty1& a, const Ty2& b) : first(a), second(b) { + } + + pair(const pair& rhs) = default; + pair(pair&& rhs) = default; + + // implicit constructiable for other type + template < + class Other1, class Other2, + typename std::enable_if::value + && std::is_constructible::value + && std::is_convertible::value + && std::is_convertible::value, + int>::type + = 0> + constexpr pair(Other1&& a, Other2&& b) + : first(mystl::forward(a)), second(mystl::forward(b)) { + } + + // explicit constructiable for other type + template ::value + && std::is_constructible::value + && (!std::is_convertible::value + || !std::is_convertible::value), + int>::type + = 0> + explicit constexpr pair(Other1&& a, Other2&& b) + : first(mystl::forward(a)), second(mystl::forward(b)) { + } + + // implicit constructiable for other pair + template ::value + && std::is_constructible::value + && std::is_convertible::value + && std::is_convertible::value, + int>::type + = 0> + constexpr pair(const pair& other) + : first(other.first), second(other.second) { + } + + // explicit constructiable for other pair + template ::value + && std::is_constructible::value + && (!std::is_convertible::value + || !std::is_convertible::value), + int>::type + = 0> + explicit constexpr pair(const pair& other) + : first(other.first), second(other.second) { + } + + // implicit constructiable for other pair + template < + class Other1, class Other2, + typename std::enable_if::value + && std::is_constructible::value + && std::is_convertible::value + && std::is_convertible::value, + int>::type + = 0> + constexpr pair(pair&& other) + : first(mystl::forward(other.first)), + second(mystl::forward(other.second)) { + } + + // explicit constructiable for other pair + template ::value + && std::is_constructible::value + && (!std::is_convertible::value + || !std::is_convertible::value), + int>::type + = 0> + explicit constexpr pair(pair&& other) + : first(mystl::forward(other.first)), + second(mystl::forward(other.second)) { + } + + // copy assign for this pair + pair& operator=(const pair& rhs) { + if (this != &rhs) { + first = rhs.first; + second = rhs.second; + } + return *this; + } + + // move assign for this pair + pair& operator=(pair&& rhs) { + if (this != &rhs) { + first = mystl::move(rhs.first); + second = mystl::move(rhs.second); + } + return *this; + } + + // copy assign for other pair + template + pair& operator=(const pair& other) { + first = other.first; + second = other.second; + return *this; + } + + // move assign for other pair + template + pair& operator=(pair&& other) { + first = mystl::forward(other.first); + second = mystl::forward(other.second); + return *this; + } + + ~pair() = default; + + void swap(pair& other) { + if (this != &other) { + mystl::swap(first, other.first); + mystl::swap(second, other.second); + } + } +}; + +// 重载比较操作符 +template +bool operator==(const pair& lhs, const pair& rhs) { + return lhs.first == rhs.first && lhs.second == rhs.second; +} + +template +bool operator<(const pair& lhs, const pair& rhs) { + return lhs.first < rhs.first + || (lhs.first == rhs.first && lhs.second < rhs.second); +} + +template +bool operator!=(const pair& lhs, const pair& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const pair& lhs, const pair& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const pair& lhs, const pair& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const pair& lhs, const pair& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(pair& lhs, pair& rhs) { + lhs.swap(rhs); +} + +// 全局函数,让两个数据成为一个 pair +template +pair make_pair(Ty1&& first, Ty2&& second) { + return pair(mystl::forward(first), + mystl::forward(second)); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_UTIL */ diff --git a/src/libcxx/include/vector b/src/libcxx/include/vector new file mode 100644 index 000000000..3b0b3d801 --- /dev/null +++ b/src/libcxx/include/vector @@ -0,0 +1,904 @@ + +/** + * @file vector + * @brief stl vector 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-04-05 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/Alinshans/MyTinySTL + * @par change log: + * + *
DateAuthorDescription + *
2023-04-05Zone.N迁移到 doxygen + *
+ */ + +#ifndef SIMPLEKERNEL_VECTOR +#define SIMPLEKERNEL_VECTOR + +// 这个头文件包含一个模板类 vector +// vector : 向量 + +// notes: +// +// 异常保证: +// std::vector +// 满足基本异常保证,部分函数无异常保证,并对以下函数做强异常安全保证: +// * emplace +// * emplace_back +// * push_back +// 当 std::is_nothrow_move_assignable::value == true +// 时,以下函数也满足强异常保证: +// * reserve +// * resize +// * insert + +#include "algo" +#include "exceptdef" +#include "initializer_list" +#include "iterator" +#include "memory" +#include "util" + +namespace mystl { + +#ifdef max +# pragma message("#undefing marco max") +# undef max +#endif // max + +#ifdef min +# pragma message("#undefing marco min") +# undef min +#endif // min + +// 模板类: vector +// 模板参数 T 代表类型 +template +class vector { + static_assert(!std::is_same::value, + "vector is abandoned in mystl"); + +public: + // vector 的嵌套型别定义 + typedef mystl::allocator allocator_type; + typedef mystl::allocator data_allocator; + + typedef typename allocator_type::value_type value_type; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + typedef typename allocator_type::size_type size_type; + typedef typename allocator_type::difference_type difference_type; + + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef mystl::reverse_iterator reverse_iterator; + typedef mystl::reverse_iterator const_reverse_iterator; + + allocator_type get_allocator() { + return data_allocator(); + } + +private: + iterator begin_; // 表示目前使用空间的头部 + iterator end_; // 表示目前使用空间的尾部 + iterator cap_; // 表示目前储存空间的尾部 + +public: + // 构造、复制、移动、析构函数 + vector() noexcept { + try_init(); + } + + explicit vector(size_type n) { + fill_init(n, value_type()); + } + + vector(size_type n, const value_type& value) { + fill_init(n, value); + } + + template ::value, int>::type + = 0> + vector(Iter first, Iter last) { + MYSTL_DEBUG(!(last < first)); + range_init(first, last); + } + + vector(const vector& rhs) { + range_init(rhs.begin_, rhs.end_); + } + + vector(vector&& rhs) noexcept + : begin_(rhs.begin_), end_(rhs.end_), cap_(rhs.cap_) { + rhs.begin_ = nullptr; + rhs.end_ = nullptr; + rhs.cap_ = nullptr; + } + + vector(std::initializer_list ilist) { + range_init(ilist.begin(), ilist.end()); + } + + vector& operator=(const vector& rhs); + vector& operator=(vector&& rhs) noexcept; + + vector& operator=(std::initializer_list ilist) { + vector tmp(ilist.begin(), ilist.end()); + swap(tmp); + return *this; + } + + ~vector() { + destroy_and_recover(begin_, end_, cap_ - begin_); + begin_ = end_ = cap_ = nullptr; + } + +public: + // 迭代器相关操作 + iterator begin() noexcept { + return begin_; + } + + const_iterator begin() const noexcept { + return begin_; + } + + iterator end() noexcept { + return end_; + } + + const_iterator end() const noexcept { + return end_; + } + + reverse_iterator rbegin() noexcept { + return reverse_iterator(end()); + } + + const_reverse_iterator rbegin() const noexcept { + return const_reverse_iterator(end()); + } + + reverse_iterator rend() noexcept { + return reverse_iterator(begin()); + } + + const_reverse_iterator rend() const noexcept { + return const_reverse_iterator(begin()); + } + + const_iterator cbegin() const noexcept { + return begin(); + } + + const_iterator cend() const noexcept { + return end(); + } + + const_reverse_iterator crbegin() const noexcept { + return rbegin(); + } + + const_reverse_iterator crend() const noexcept { + return rend(); + } + + // 容量相关操作 + bool empty() const noexcept { + return begin_ == end_; + } + + size_type size() const noexcept { + return static_cast(end_ - begin_); + } + + size_type max_size() const noexcept { + return static_cast(-1) / sizeof(T); + } + + size_type capacity() const noexcept { + return static_cast(cap_ - begin_); + } + + void reserve(size_type n); + void shrink_to_fit(); + + // 访问元素相关操作 + reference operator[](size_type n) { + MYSTL_DEBUG(n < size()); + return *(begin_ + n); + } + + const_reference operator[](size_type n) const { + MYSTL_DEBUG(n < size()); + return *(begin_ + n); + } + + reference at(size_type n) { + THROW_OUT_OF_RANGE_IF(!(n < size()), + "vector::at() subscript out of range"); + return (*this)[n]; + } + + const_reference at(size_type n) const { + THROW_OUT_OF_RANGE_IF(!(n < size()), + "vector::at() subscript out of range"); + return (*this)[n]; + } + + reference front() { + MYSTL_DEBUG(!empty()); + return *begin_; + } + + const_reference front() const { + MYSTL_DEBUG(!empty()); + return *begin_; + } + + reference back() { + MYSTL_DEBUG(!empty()); + return *(end_ - 1); + } + + const_reference back() const { + MYSTL_DEBUG(!empty()); + return *(end_ - 1); + } + + pointer data() noexcept { + return begin_; + } + + const_pointer data() const noexcept { + return begin_; + } + + // 修改容器相关操作 + + // assign + + void assign(size_type n, const value_type& value) { + fill_assign(n, value); + } + + template ::value, int>::type + = 0> + void assign(Iter first, Iter last) { + MYSTL_DEBUG(!(last < first)); + copy_assign(first, last, iterator_category(first)); + } + + void assign(std::initializer_list il) { + copy_assign(il.begin(), il.end(), mystl::forward_iterator_tag {}); + } + + // emplace / emplace_back + + template + iterator emplace(const_iterator pos, Args&&... args); + + template + void emplace_back(Args&&... args); + + // push_back / pop_back + + void push_back(const value_type& value); + + void push_back(value_type&& value) { + emplace_back(mystl::move(value)); + } + + void pop_back(); + + // insert + + iterator insert(const_iterator pos, const value_type& value); + + iterator insert(const_iterator pos, value_type&& value) { + return emplace(pos, mystl::move(value)); + } + + iterator insert(const_iterator pos, size_type n, const value_type& value) { + MYSTL_DEBUG(pos >= begin() && pos <= end()); + return fill_insert(const_cast(pos), n, value); + } + + template ::value, int>::type + = 0> + void insert(const_iterator pos, Iter first, Iter last) { + MYSTL_DEBUG(pos >= begin() && pos <= end() && !(last < first)); + copy_insert(const_cast(pos), first, last); + } + + // erase / clear + iterator erase(const_iterator pos); + iterator erase(const_iterator first, const_iterator last); + + void clear() { + erase(begin(), end()); + } + + // resize / reverse + void resize(size_type new_size) { + return resize(new_size, value_type()); + } + + void resize(size_type new_size, const value_type& value); + + void reverse() { + mystl::reverse(begin(), end()); + } + + // swap + void swap(vector& rhs) noexcept; + +private: + // helper functions + + // initialize / destroy + void try_init() noexcept; + + void init_space(size_type size, size_type cap); + + void fill_init(size_type n, const value_type& value); + template + void range_init(Iter first, Iter last); + + void destroy_and_recover(iterator first, iterator last, size_type n); + + // calculate the growth size + size_type get_new_cap(size_type add_size); + + // assign + + void fill_assign(size_type n, const value_type& value); + + template + void copy_assign(IIter first, IIter last, input_iterator_tag); + + template + void copy_assign(FIter first, FIter last, forward_iterator_tag); + + // reallocate + + template + void reallocate_emplace(iterator pos, Args&&... args); + void reallocate_insert(iterator pos, const value_type& value); + + // insert + + iterator fill_insert(iterator pos, size_type n, const value_type& value); + template + void copy_insert(iterator pos, IIter first, IIter last); + + // shrink_to_fit + + void reinsert(size_type size); +}; + +/*****************************************************************************************/ + +// 复制赋值操作符 +template +vector& vector::operator=(const vector& rhs) { + if (this != &rhs) { + const auto len = rhs.size(); + if (len > capacity()) { + vector tmp(rhs.begin(), rhs.end()); + swap(tmp); + } + else if (size() >= len) { + auto i = mystl::copy(rhs.begin(), rhs.end(), begin()); + data_allocator::destroy(i, end_); + end_ = begin_ + len; + } + else { + mystl::copy(rhs.begin(), rhs.begin() + size(), begin_); + mystl::uninitialized_copy(rhs.begin() + size(), rhs.end(), end_); + cap_ = end_ = begin_ + len; + } + } + return *this; +} + +// 移动赋值操作符 +template +vector& vector::operator=(vector&& rhs) noexcept { + destroy_and_recover(begin_, end_, cap_ - begin_); + begin_ = rhs.begin_; + end_ = rhs.end_; + cap_ = rhs.cap_; + rhs.begin_ = nullptr; + rhs.end_ = nullptr; + rhs.cap_ = nullptr; + return *this; +} + +// 预留空间大小,当原容量小于要求大小时,才会重新分配 +template +void vector::reserve(size_type n) { + if (capacity() < n) { + THROW_LENGTH_ERROR_IF( + n > max_size(), + "n can not larger than max_size() in vector::reserve(n)"); + const auto old_size = size(); + auto tmp = data_allocator::allocate(n); + mystl::uninitialized_move(begin_, end_, tmp); + data_allocator::deallocate(begin_, cap_ - begin_); + begin_ = tmp; + end_ = tmp + old_size; + cap_ = begin_ + n; + } +} + +// 放弃多余的容量 +template +void vector::shrink_to_fit() { + if (end_ < cap_) { + reinsert(size()); + } +} + +// 在 pos 位置就地构造元素,避免额外的复制或移动开销 +template +template +typename vector::iterator +vector::emplace(const_iterator pos, Args&&... args) { + MYSTL_DEBUG(pos >= begin() && pos <= end()); + iterator xpos = const_cast(pos); + const size_type n = xpos - begin_; + if (end_ != cap_ && xpos == end_) { + data_allocator::construct(mystl::address_of(*end_), + mystl::forward(args)...); + ++end_; + } + else if (end_ != cap_) { + auto new_end = end_; + data_allocator::construct(mystl::address_of(*end_), *(end_ - 1)); + ++new_end; + mystl::copy_backward(xpos, end_ - 1, end_); + *xpos = value_type(mystl::forward(args)...); + } + else { + reallocate_emplace(xpos, mystl::forward(args)...); + } + return begin() + n; +} + +// 在尾部就地构造元素,避免额外的复制或移动开销 +template +template +void vector::emplace_back(Args&&... args) { + if (end_ < cap_) { + data_allocator::construct(mystl::address_of(*end_), + mystl::forward(args)...); + ++end_; + } + else { + reallocate_emplace(end_, mystl::forward(args)...); + } +} + +// 在尾部插入元素 +template +void vector::push_back(const value_type& value) { + if (end_ != cap_) { + data_allocator::construct(mystl::address_of(*end_), value); + ++end_; + } + else { + reallocate_insert(end_, value); + } +} + +// 弹出尾部元素 +template +void vector::pop_back() { + MYSTL_DEBUG(!empty()); + data_allocator::destroy(end_ - 1); + --end_; +} + +// 在 pos 处插入元素 +template +typename vector::iterator +vector::insert(const_iterator pos, const value_type& value) { + MYSTL_DEBUG(pos >= begin() && pos <= end()); + iterator xpos = const_cast(pos); + const size_type n = pos - begin_; + if (end_ != cap_ && xpos == end_) { + data_allocator::construct(mystl::address_of(*end_), value); + ++end_; + } + else if (end_ != cap_) { + auto new_end = end_; + data_allocator::construct(mystl::address_of(*end_), *(end_ - 1)); + ++new_end; + auto value_copy = value; // 避免元素因以下复制操作而被改变 + mystl::copy_backward(xpos, end_ - 1, end_); + *xpos = mystl::move(value_copy); + end_ = new_end; + } + else { + reallocate_insert(xpos, value); + } + return begin_ + n; +} + +// 删除 pos 位置上的元素 +template +typename vector::iterator vector::erase(const_iterator pos) { + MYSTL_DEBUG(pos >= begin() && pos < end()); + iterator xpos = begin_ + (pos - begin()); + mystl::move(xpos + 1, end_, xpos); + data_allocator::destroy(end_ - 1); + --end_; + return xpos; +} + +// 删除[first, last)上的元素 +template +typename vector::iterator +vector::erase(const_iterator first, const_iterator last) { + MYSTL_DEBUG(first >= begin() && last <= end() && !(last < first)); + const auto n = first - begin(); + iterator r = begin_ + (first - begin()); + data_allocator::destroy(mystl::move(r + (last - first), end_, r), end_); + end_ = end_ - (last - first); + return begin_ + n; +} + +// 重置容器大小 +template +void vector::resize(size_type new_size, const value_type& value) { + if (new_size < size()) { + erase(begin() + new_size, end()); + } + else { + insert(end(), new_size - size(), value); + } +} + +// 与另一个 vector 交换 +template +void vector::swap(vector& rhs) noexcept { + if (this != &rhs) { + mystl::swap(begin_, rhs.begin_); + mystl::swap(end_, rhs.end_); + mystl::swap(cap_, rhs.cap_); + } +} + +/*****************************************************************************************/ +// helper function + +// try_init 函数,若分配失败则忽略,不抛出异常 +template +void vector::try_init() noexcept { + try { + begin_ = data_allocator::allocate(16); + end_ = begin_; + cap_ = begin_ + 16; + } catch (...) { + begin_ = nullptr; + end_ = nullptr; + cap_ = nullptr; + } +} + +// init_space 函数 +template +void vector::init_space(size_type size, size_type cap) { + try { + begin_ = data_allocator::allocate(cap); + end_ = begin_ + size; + cap_ = begin_ + cap; + } catch (...) { + begin_ = nullptr; + end_ = nullptr; + cap_ = nullptr; + throw; + } +} + +// fill_init 函数 +template +void vector::fill_init(size_type n, const value_type& value) { + const size_type init_size = mystl::max(static_cast(16), n); + init_space(n, init_size); + mystl::uninitialized_fill_n(begin_, n, value); +} + +// range_init 函数 +template +template +void vector::range_init(Iter first, Iter last) { + const size_type init_size = mystl::max(static_cast(last - first), + static_cast(16)); + init_space(static_cast(last - first), init_size); + mystl::uninitialized_copy(first, last, begin_); +} + +// destroy_and_recover 函数 +template +void vector::destroy_and_recover(iterator first, iterator last, + size_type n) { + data_allocator::destroy(first, last); + data_allocator::deallocate(first, n); +} + +// get_new_cap 函数 +template +typename vector::size_type vector::get_new_cap(size_type add_size) { + const auto old_size = capacity(); + THROW_LENGTH_ERROR_IF(old_size > max_size() - add_size, + "vector's size too big"); + if (old_size > max_size() - old_size / 2) { + return old_size + add_size > max_size() - 16 ? old_size + add_size + : old_size + add_size + 16; + } + const size_type new_size + = old_size == 0 + ? mystl::max(add_size, static_cast(16)) + : mystl::max(old_size + old_size / 2, old_size + add_size); + return new_size; +} + +// fill_assign 函数 +template +void vector::fill_assign(size_type n, const value_type& value) { + if (n > capacity()) { + vector tmp(n, value); + swap(tmp); + } + else if (n > size()) { + mystl::fill(begin(), end(), value); + end_ = mystl::uninitialized_fill_n(end_, n - size(), value); + } + else { + erase(mystl::fill_n(begin_, n, value), end_); + } +} + +// copy_assign 函数 +template +template +void vector::copy_assign(IIter first, IIter last, input_iterator_tag) { + auto cur = begin_; + for (; first != last && cur != end_; ++first, ++cur) { + *cur = *first; + } + if (first == last) { + erase(cur, end_); + } + else { + insert(end_, first, last); + } +} + +// 用 [first, last) 为容器赋值 +template +template +void vector::copy_assign(FIter first, FIter last, forward_iterator_tag) { + const size_type len = mystl::distance(first, last); + if (len > capacity()) { + vector tmp(first, last); + swap(tmp); + } + else if (size() >= len) { + auto new_end = mystl::copy(first, last, begin_); + data_allocator::destroy(new_end, end_); + end_ = new_end; + } + else { + auto mid = first; + mystl::advance(mid, size()); + mystl::copy(first, mid, begin_); + auto new_end = mystl::uninitialized_copy(mid, last, end_); + end_ = new_end; + } +} + +// 重新分配空间并在 pos 处就地构造元素 +template +template +void vector::reallocate_emplace(iterator pos, Args&&... args) { + const auto new_size = get_new_cap(1); + auto new_begin = data_allocator::allocate(new_size); + auto new_end = new_begin; + try { + new_end = mystl::uninitialized_move(begin_, pos, new_begin); + data_allocator::construct(mystl::address_of(*new_end), + mystl::forward(args)...); + ++new_end; + new_end = mystl::uninitialized_move(pos, end_, new_end); + } catch (...) { + data_allocator::deallocate(new_begin, new_size); + throw; + } + destroy_and_recover(begin_, end_, cap_ - begin_); + begin_ = new_begin; + end_ = new_end; + cap_ = new_begin + new_size; +} + +// 重新分配空间并在 pos 处插入元素 +template +void vector::reallocate_insert(iterator pos, const value_type& value) { + const auto new_size = get_new_cap(1); + auto new_begin = data_allocator::allocate(new_size); + auto new_end = new_begin; + const value_type& value_copy = value; + try { + new_end = mystl::uninitialized_move(begin_, pos, new_begin); + data_allocator::construct(mystl::address_of(*new_end), value_copy); + ++new_end; + new_end = mystl::uninitialized_move(pos, end_, new_end); + } catch (...) { + data_allocator::deallocate(new_begin, new_size); + throw; + } + destroy_and_recover(begin_, end_, cap_ - begin_); + begin_ = new_begin; + end_ = new_end; + cap_ = new_begin + new_size; +} + +// fill_insert 函数 +template +typename vector::iterator +vector::fill_insert(iterator pos, size_type n, const value_type& value) { + if (n == 0) { + return pos; + } + const size_type xpos = pos - begin_; + const value_type value_copy = value; // 避免被覆盖 + if (static_cast(cap_ - end_) + >= n) { // 如果备用空间大于等于增加的空间 + const size_type after_elems = end_ - pos; + auto old_end = end_; + if (after_elems > n) { + mystl::uninitialized_copy(end_ - n, end_, end_); + end_ += n; + mystl::move_backward(pos, old_end - n, old_end); + mystl::uninitialized_fill_n(pos, n, value_copy); + } + else { + end_ + = mystl::uninitialized_fill_n(end_, n - after_elems, value_copy); + end_ = mystl::uninitialized_move(pos, old_end, end_); + mystl::uninitialized_fill_n(pos, after_elems, value_copy); + } + } + else { // 如果备用空间不足 + const auto new_size = get_new_cap(n); + auto new_begin = data_allocator::allocate(new_size); + auto new_end = new_begin; + try { + new_end = mystl::uninitialized_move(begin_, pos, new_begin); + new_end = mystl::uninitialized_fill_n(new_end, n, value); + new_end = mystl::uninitialized_move(pos, end_, new_end); + } catch (...) { + destroy_and_recover(new_begin, new_end, new_size); + throw; + } + data_allocator::deallocate(begin_, cap_ - begin_); + begin_ = new_begin; + end_ = new_end; + cap_ = begin_ + new_size; + } + return begin_ + xpos; +} + +// copy_insert 函数 +template +template +void vector::copy_insert(iterator pos, IIter first, IIter last) { + if (first == last) { + return; + } + const auto n = mystl::distance(first, last); + if ((cap_ - end_) >= n) { // 如果备用空间大小足够 + const auto after_elems = end_ - pos; + auto old_end = end_; + if (after_elems > n) { + end_ = mystl::uninitialized_copy(end_ - n, end_, end_); + mystl::move_backward(pos, old_end - n, old_end); + mystl::uninitialized_copy(first, last, pos); + } + else { + auto mid = first; + mystl::advance(mid, after_elems); + end_ = mystl::uninitialized_copy(mid, last, end_); + end_ = mystl::uninitialized_move(pos, old_end, end_); + mystl::uninitialized_copy(first, mid, pos); + } + } + else { // 备用空间不足 + const auto new_size = get_new_cap(n); + auto new_begin = data_allocator::allocate(new_size); + auto new_end = new_begin; + try { + new_end = mystl::uninitialized_move(begin_, pos, new_begin); + new_end = mystl::uninitialized_copy(first, last, new_end); + new_end = mystl::uninitialized_move(pos, end_, new_end); + } catch (...) { + destroy_and_recover(new_begin, new_end, new_size); + throw; + } + data_allocator::deallocate(begin_, cap_ - begin_); + begin_ = new_begin; + end_ = new_end; + cap_ = begin_ + new_size; + } +} + +// reinsert 函数 +template +void vector::reinsert(size_type size) { + auto new_begin = data_allocator::allocate(size); + try { + mystl::uninitialized_move(begin_, end_, new_begin); + } catch (...) { + data_allocator::deallocate(new_begin, size); + throw; + } + data_allocator::deallocate(begin_, cap_ - begin_); + begin_ = new_begin; + end_ = begin_ + size; + cap_ = begin_ + size; +} + +/*****************************************************************************************/ +// 重载比较操作符 + +template +bool operator==(const vector& lhs, const vector& rhs) { + return lhs.size() == rhs.size() + && mystl::equal(lhs.begin(), lhs.end(), rhs.begin()); +} + +template +bool operator<(const vector& lhs, const vector& rhs) { + return mystl::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), + lhs.end()); +} + +template +bool operator!=(const vector& lhs, const vector& rhs) { + return !(lhs == rhs); +} + +template +bool operator>(const vector& lhs, const vector& rhs) { + return rhs < lhs; +} + +template +bool operator<=(const vector& lhs, const vector& rhs) { + return !(rhs < lhs); +} + +template +bool operator>=(const vector& lhs, const vector& rhs) { + return !(lhs < rhs); +} + +// 重载 mystl 的 swap +template +void swap(vector& lhs, vector& rhs) { + lhs.swap(rhs); +} + +}; // namespace mystl + +#endif /* SIMPLEKERNEL_VECTOR */ diff --git a/src/libcxx/src/__dso_handle.S b/src/libcxx/src/__dso_handle.S new file mode 100644 index 000000000..88a752e8e --- /dev/null +++ b/src/libcxx/src/__dso_handle.S @@ -0,0 +1,18 @@ + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# Based on https://android.googlesource.com/platform/bionic.git/+/gingerbread/libc/private/__dso_handle.S +# __dso_handle.S for Simple-XX/SimpleKernel. + +# The __dso_handle global variable is used by static +# C++ constructors and destructors in the binary. +# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor + +.section .bss +.align 4 +#ifndef CRT_LEGACY_WORKAROUND +.hidden __dso_handle +#endif +.global __dso_handle +__dso_handle: + .long 0 diff --git a/src/libcxx/src/cxxabi.cpp b/src/libcxx/src/cxxabi.cpp new file mode 100644 index 000000000..088cda876 --- /dev/null +++ b/src/libcxx/src/cxxabi.cpp @@ -0,0 +1,264 @@ + +/** + * @file cxxabi.cpp + * @brief C++ abi 支持 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://wiki.osdev.org/C%2B%2B + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cxxabi.h" + +#define ATEXIT_MAX_FUNCS 128 + +typedef void (*ctor_t)(void); +// 在 link.ld 中定义 +extern ctor_t __init_array_start[]; +extern ctor_t __init_array_end[]; + +typedef unsigned uarch_t; + +struct atexit_func_entry_t { + /* + * Each member is at least 4 bytes large. Such that each entry is + 12bytes. + * 128 * 12 = 1.5KB exact. + **/ + void (*destructor_func)(void*); + void* obj_ptr; + void* dso_handle; +}; + +void cpp_init(void) { + ctor_t* f; + for (f = __init_array_start; f < __init_array_end; f++) { + (*f)(); + } + return; +} + +void __cxa_pure_virtual(void) { + return; +} + +atexit_func_entry_t __atexit_funcs[ATEXIT_MAX_FUNCS]; +uarch_t __atexit_func_count = 0; + +extern void* __dso_handle; + +void __cxa_rethrow() { + return; +} + +void _Unwind_Resume() { + return; +} + +void __cxa_begin_catch() { + return; +} + +void __cxa_end_catch() { + return; +} + +void __gxx_personality_v0() { + return; +} + +int __cxa_atexit(void (*f)(void*), void* objptr, void* dso) { + if (__atexit_func_count >= ATEXIT_MAX_FUNCS) { + return -1; + }; + __atexit_funcs[__atexit_func_count].destructor_func = f; + __atexit_funcs[__atexit_func_count].obj_ptr = objptr; + __atexit_funcs[__atexit_func_count].dso_handle = dso; + __atexit_func_count++; + return 0; +}; + +int __aeabi_atexit(void (*f)(void*), void* objptr, void* dso) { + if (__atexit_func_count >= ATEXIT_MAX_FUNCS) { + return -1; + }; + __atexit_funcs[__atexit_func_count].destructor_func = f; + __atexit_funcs[__atexit_func_count].obj_ptr = objptr; + __atexit_funcs[__atexit_func_count].dso_handle = dso; + __atexit_func_count++; + return 0; +}; + +void __cxa_finalize(void* f) { + uarch_t i = __atexit_func_count; + if (!f) { + /* + * According to the Itanium C++ ABI, if __cxa_finalize is called + *without a function ptr, then it means that we should destroy + *EVERYTHING MUAHAHAHA!! + * + * TODO: + * Note well, however, that deleting a function from here that + *contains a __dso_handle means that one link to a shared object + *file has been terminated. In other words, We should monitor this + *list (optional, of course), since it tells us how many links to an + *object file exist at runtime in a particular application. This can + *be used to tell when a shared object is no longer in use. It is + *one of many methods, however. + **/ + // You may insert a printf() here to tell you whether or not the + // function gets called. Testing is CRITICAL! + while (i--) { + if (__atexit_funcs[i].destructor_func) { + /* ^^^ That if statement is a safeguard... + * To make sure we don't call any entries that have already + *been called and unset at runtime. Those will contain a + *value of 0, and calling a function with value 0 will cause + *undefined behaviour. Remember that linear address 0, in a + *non-virtual address space (physical) contains the IVT and + *BDA. + * + * In a virtual environment, the kernel will receive a page + *fault, and then probably map in some trash, or a blank + *page, or something stupid like that. This will result in + *the processor executing trash, and...we don't want that. + **/ + (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + }; + }; + return; + }; + + while (i--) { + /* + * The ABI states that multiple calls to the + *__cxa_finalize(destructor_func_ptr) function should not destroy + *objects multiple times. Only one call is needed to eliminate + *multiple entries with the same address. + * + * FIXME: + * This presents the obvious problem: all destructors must be stored + *in the order they were placed in the list. I.e: the last + *initialized object's destructor must be first in the list of + *destructors to be called. But removing a destructor from the list + *at runtime creates holes in the table with unfilled entries. + *Remember that the insertion algorithm in __cxa_atexit simply + *inserts the next destructor at the end of the table. So, we have + *holes with our current algorithm This function should be modified + *to move all the destructors above the one currently being called + *and removed one place down in the list, so as to cover up the + *hole. Otherwise, whenever a destructor is called and removed, an + *entire space in the table is wasted. + **/ + if (__atexit_funcs[i].destructor_func == f) { + /* + * Note that in the next line, not every destructor function is + *a class destructor. It is perfectly legal to register a non + *class destructor function as a simple cleanup function to be + *called on program termination, in which case, it would not + *NEED an object This pointer. A smart programmer may even take + *advantage of this and register a C function in the table with + *the address of some structure containing data about what to + *clean up on exit. In the case of a function that takes no + *arguments, it will simply be ignore within the function + *itself. No worries. + **/ + (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + __atexit_funcs[i].destructor_func = 0; + + /* + * Notice that we didn't decrement __atexit_func_count: this is + *because this algorithm requires patching to deal with the + *FIXME outlined above. + **/ + }; + }; +}; + +namespace __cxxabiv1 { +/* guard variables */ + +/* The ABI requires a 64-bit type. */ +__extension__ typedef int __guard __attribute__((mode(__DI__))); + +int __cxa_guard_acquire(__guard*); +void __cxa_guard_release(__guard*); +void __cxa_guard_abort(__guard*); + +int __cxa_guard_acquire(__guard* g) { + return !*(char*)(g); +} + +void __cxa_guard_release(__guard* g) { + *(char*)g = 1; +} + +void __cxa_guard_abort(__guard*) { +} +} // namespace __cxxabiv1 + +#ifdef __cplusplus +}; +#endif + +namespace std { +type_info::type_info(const type_info& arg) : tname(arg.tname) { + return; +} + +type_info::type_info(const char* pname) : tname(pname) { + return; +} + +type_info::~type_info(void) { + return; +} + +const char* type_info::name(void) const { + return tname; +} + +bool type_info::operator==(const type_info& arg) const { + return tname == arg.tname; +} + +bool type_info::operator!=(const type_info& arg) const { + return tname != arg.tname; +} +} // namespace std + +namespace __cxxabiv1 { + +#define ADD_CXX_TYPEINFO_SOURCE(t) \ + t::t(const char* n) : std::type_info(n) { \ + return; \ + } \ + t::~t(void) { \ + return; \ + } + +ADD_CXX_TYPEINFO_SOURCE(__fundamental_type_info) +ADD_CXX_TYPEINFO_SOURCE(__array_type_info) +ADD_CXX_TYPEINFO_SOURCE(__function_type_info) +ADD_CXX_TYPEINFO_SOURCE(__enum_type_info) +ADD_CXX_TYPEINFO_SOURCE(__pbase_type_info) +ADD_CXX_TYPEINFO_SOURCE(__pointer_type_info) +ADD_CXX_TYPEINFO_SOURCE(__pointer_to_member_type_info) +ADD_CXX_TYPEINFO_SOURCE(__class_type_info) +ADD_CXX_TYPEINFO_SOURCE(__si_class_type_info) +ADD_CXX_TYPEINFO_SOURCE(__vmi_class_type_info) + +#undef ADD_CXX_TYPEINFO_SOURCE + +} // namespace __cxxabiv1 diff --git a/src/libcxx/src/iostream.cpp b/src/libcxx/src/iostream.cpp new file mode 100755 index 000000000..bdd8a3c9d --- /dev/null +++ b/src/libcxx/src/iostream.cpp @@ -0,0 +1,48 @@ + +/** + * @file iostream + * @brief C++ 输入输出 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2021-09-18 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/MRNIU/MiniCRT + * @par change log: + * + *
DateAuthorDescription + *
2021-09-18digmouse233迁移到 doxygen + *
+ */ + +#include "iostream" +#include "cstdio" + +namespace std { +ostream::ostream(void) { + return; +} + +ostream::~ostream(void) { + return; +} + +ostream& ostream::operator<<(char c) { + printf("%c", c); + return *this; +} + +ostream& ostream::operator<<(int n) { + printf("%d", n); + return *this; +} + +ostream& ostream::operator<<(const char* lhs) { + printf("%s", lhs); + return *this; +} + +ostream& ostream::operator<<(ostream& (*manip)(ostream&)) { + return manip(*this); +} +}; // namespace std diff --git a/src/libcxx/src/new.cpp b/src/libcxx/src/new.cpp new file mode 100644 index 000000000..eed7a9ee7 --- /dev/null +++ b/src/libcxx/src/new.cpp @@ -0,0 +1,87 @@ + +/** + * @file new.cpp + * @brief 内存分配实现 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-03-31 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * @par change log: + * + *
DateAuthorDescription + *
2023-03-31Zone.N迁移到 doxygen + *
+ */ + +#include "new" +#include "cstdlib" + +void* operator new(size_t _size) { + return kmalloc(_size); +} + +void* operator new[](size_t _size) { + return kmalloc(_size); +} + +void operator delete(void* _p) { + kfree(_p); +} + +void operator delete(void* _p, size_t) { + kfree(_p); +} + +void operator delete[](void* _p) { + kfree(_p); +} + +void operator delete[](void* _p, size_t) { + kfree(_p); +} + +void* operator new(size_t, void* _p) throw() { + return _p; +} + +void* operator new[](size_t, void* _p) throw() { + return _p; +} + +void operator delete(void*, void*) throw() { + return; +} + +void operator delete[](void*, void*) throw() { + return; +} + +// TODO +void* operator new(size_t _size, std::align_val_t) { + return kmalloc(_size); +} + +void operator delete(void* _p, std::align_val_t) { + kfree(_p); + return; +} + +void* operator new[](size_t _size, std::align_val_t) { + return kmalloc(_size); +} + +void operator delete[](void* _p, std::align_val_t) { + kfree(_p); + return; +} + +void operator delete(void* _p, size_t, std::align_val_t) { + kfree(_p); + return; +} + +void operator delete[](void* _p, size_t, std::align_val_t) { + kfree(_p); + return; +} diff --git a/src/libcxx/src/stack_chk.cpp b/src/libcxx/src/stack_chk.cpp new file mode 100644 index 000000000..e0ac0623d --- /dev/null +++ b/src/libcxx/src/stack_chk.cpp @@ -0,0 +1,32 @@ + +/** + * @file stack_chk.cpp + * @brief 栈保护 + * @author Zone.N (Zone.Niuzh@hotmail.com) + * @version 1.0 + * @date 2023-05-08 + * @copyright MIT LICENSE + * https://github.com/Simple-XX/SimpleKernel + * Based on https://github.com/MRNIU/MiniCRT + * @par change log: + * + *
DateAuthorDescription + *
2023-05-08Zone.N创建文件 + *
+ */ + +#include "cstdint" +#include "cstdio" + +#if UINT32_MAX == UINTPTR_MAX +# define STACK_CHK_GUARD 0xe2dee396 +#else +# define STACK_CHK_GUARD 0x595e9fbd94fda766 +#endif + +uintptr_t __stack_chk_guard = STACK_CHK_GUARD; + +void __stack_chk_fail(void) { + err("Stack smashing detected\n"); + return; +} diff --git a/tools/.Clion_usage.assets/2022-01-16 22.41.38.png b/tools/.Clion_usage.assets/2022-01-16 22.41.38.png new file mode 100644 index 000000000..f83a47fd2 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.41.38.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.42.21.png b/tools/.Clion_usage.assets/2022-01-16 22.42.21.png new file mode 100644 index 000000000..ef47d0703 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.42.21.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.42.56.png b/tools/.Clion_usage.assets/2022-01-16 22.42.56.png new file mode 100644 index 000000000..0ecf20bb7 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.42.56.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.44.30.png b/tools/.Clion_usage.assets/2022-01-16 22.44.30.png new file mode 100644 index 000000000..41b75fd61 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.44.30.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.45.14.png b/tools/.Clion_usage.assets/2022-01-16 22.45.14.png new file mode 100644 index 000000000..e33558f96 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.45.14.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.48.24.png b/tools/.Clion_usage.assets/2022-01-16 22.48.24.png new file mode 100644 index 000000000..f3b6d2478 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.48.24.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.52.00.png b/tools/.Clion_usage.assets/2022-01-16 22.52.00.png new file mode 100644 index 000000000..34031a37b Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.52.00.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.54.02.png b/tools/.Clion_usage.assets/2022-01-16 22.54.02.png new file mode 100644 index 000000000..e52a45b1f Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.54.02.png differ diff --git a/tools/.Clion_usage.assets/2022-01-16 22.56.43.png b/tools/.Clion_usage.assets/2022-01-16 22.56.43.png new file mode 100644 index 000000000..4a0e3186c Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-16 22.56.43.png differ diff --git a/tools/.Clion_usage.assets/2022-01-17 16.29.12.png b/tools/.Clion_usage.assets/2022-01-17 16.29.12.png new file mode 100644 index 000000000..72a0efd0d Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-17 16.29.12.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.49.01.png b/tools/.Clion_usage.assets/2022-01-22 19.49.01.png new file mode 100644 index 000000000..833d4503e Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.49.01.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.49.07.png b/tools/.Clion_usage.assets/2022-01-22 19.49.07.png new file mode 100644 index 000000000..93fd8d4e6 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.49.07.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.53.12.png b/tools/.Clion_usage.assets/2022-01-22 19.53.12.png new file mode 100644 index 000000000..78bdc053e Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.53.12.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.53.34-2852427.png b/tools/.Clion_usage.assets/2022-01-22 19.53.34-2852427.png new file mode 100644 index 000000000..e10b13a07 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.53.34-2852427.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.53.34.png b/tools/.Clion_usage.assets/2022-01-22 19.53.34.png new file mode 100644 index 000000000..e10b13a07 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.53.34.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.54.15.png b/tools/.Clion_usage.assets/2022-01-22 19.54.15.png new file mode 100644 index 000000000..f2ac78474 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.54.15.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.55.16.png b/tools/.Clion_usage.assets/2022-01-22 19.55.16.png new file mode 100644 index 000000000..62405faa5 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.55.16.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.56.23.png b/tools/.Clion_usage.assets/2022-01-22 19.56.23.png new file mode 100644 index 000000000..41ce15989 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.56.23.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.56.31.png b/tools/.Clion_usage.assets/2022-01-22 19.56.31.png new file mode 100644 index 000000000..5313e0f21 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.56.31.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.57.31.png b/tools/.Clion_usage.assets/2022-01-22 19.57.31.png new file mode 100644 index 000000000..73ae65416 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.57.31.png differ diff --git a/tools/.Clion_usage.assets/2022-01-22 19.58.14.png b/tools/.Clion_usage.assets/2022-01-22 19.58.14.png new file mode 100644 index 000000000..02bd5f769 Binary files /dev/null and b/tools/.Clion_usage.assets/2022-01-22 19.58.14.png differ diff --git "a/tools/Clion \344\275\277\347\224\250\350\257\264\346\230\216.md" "b/tools/Clion \344\275\277\347\224\250\350\257\264\346\230\216.md" new file mode 100644 index 000000000..b01dc729d --- /dev/null +++ "b/tools/Clion \344\275\277\347\224\250\350\257\264\346\230\216.md" @@ -0,0 +1,110 @@ + +# CLion 配置及使用 + +## 配置 + +导入配置 + +![2022-01-17 16.29.12](.Clion_usage.assets/2022-01-17%2016.29.12.png) + +![2022-01-22 19.49.01](.Clion_usage.assets/2022-01-22%2019.49.01.png) + +![2022-01-22 19.49.07](.Clion_usage.assets/2022-01-22%2019.49.07.png) + +## 使用 + +osx+QEMU+RISCV64 + +1. 生成 CMake + + ![2022-01-16 22.41.38](.Clion_usage.assets/2022-01-16%2022.41.38.png) + + 执行后会在根目录生成三个文件夹,用于存放生成的文件 + + ![2022-01-16 22.42.21](.Clion_usage.assets/2022-01-16%2022.42.21.png) + + CLion 输出 + + ![2022-01-16 22.42.56](.Clion_usage.assets/2022-01-16%2022.42.56.png) + +2. 构建 kernel.elf + + ![2022-01-22 19.53.12](.Clion_usage.assets/2022-01-22%2019.53.12.png) + +3. 选择你需要构建的版本 + + ![2022-01-22 19.53.34](.Clion_usage.assets/2022-01-22%2019.53.34-2852427.png) + +4. 构建 + + ![2022-01-22 19.54.15](.Clion_usage.assets/2022-01-22%2019.54.15.png) + + 正常输出为 + + ![2022-01-16 22.44.30](.Clion_usage.assets/2022-01-16%2022.44.30.png) + + 同时会在 build_riscv64/bin 文件夹内生成文件 + + ![2022-01-16 22.45.14](.Clion_usage.assets/2022-01-16%2022.45.14.png) + + +5. 运行 + + ![2022-01-22 19.55.16](.Clion_usage.assets/2022-01-22%2019.55.16.png) + + + 虚拟机串口输出 + + ![2022-01-16 22.48.24](.Clion_usage.assets/2022-01-16%2022.48.24.png) + +--- + +osx+Bochs+i386 + +1. 生成 CMake + + ![2022-01-16 22.41.38](.Clion_usage.assets/2022-01-16%2022.41.38.png) + + 执行后会在根目录生成三个文件夹,用于存放生成的文件 + + ![2022-01-16 22.42.21](.Clion_usage.assets/2022-01-16%2022.42.21.png) + + CLion 输出 + + ![2022-01-16 22.52.00](.Clion_usage.assets/2022-01-16%2022.52.00.png) + + + +2. 构建 kernel.elf + + ![2022-01-22 19.56.23](.Clion_usage.assets/2022-01-22%2019.56.23.png) + + + + +3. 选择你需要构建的版本 + + ![2022-01-22 19.56.31](.Clion_usage.assets/2022-01-22%2019.56.31.png) + + + +4. 构建 + + ![2022-01-22 19.57.31](.Clion_usage.assets/2022-01-22%2019.57.31.png) + + 正常输出为 + + ![2022-01-16 22.54.02](.Clion_usage.assets/2022-01-16%2022.54.02.png) + + 同时会在 build_i386/bin 文件夹内生成文件 + + ![2022-01-16 22.45.14](.Clion_usage.assets/2022-01-16%2022.45.14.png) + + +5. 运行 + + ![2022-01-22 19.58.14](.Clion_usage.assets/2022-01-22%2019.58.14.png) + + 输出 + + ![2022-01-16 22.56.43](.Clion_usage.assets/2022-01-16%2022.56.43.png) \ No newline at end of file diff --git "a/tools/Git Commit \350\247\204\350\214\203.pdf" "b/tools/Git Commit \350\247\204\350\214\203.pdf" new file mode 100644 index 000000000..0cb973f07 Binary files /dev/null and "b/tools/Git Commit \350\247\204\350\214\203.pdf" differ diff --git a/tools/bochs.sh b/tools/bochs.sh deleted file mode 100644 index a5b56d603..000000000 --- a/tools/bochs.sh +++ /dev/null @@ -1,52 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# bochs.sh for MRNIU/SimpleKernel. - -#!/usr/bin/env bash - -if ! [ -x "$(command -v pkg-config)" ]; then - echo 'Error: pkg-config is not installed.' - exit 1 -elif ! [ -x "$(command -v sdl2)" ]; then - echo 'Error: sdl2 is not installed.' - exit 1 -elif ! [ -x "$(command -v wget)" ]; then - echo 'Error: wget is not installed.' - exit 1 -elif ! [ -x "$(command -v tar)" ]; then - echo 'Error: tar is not installed.' - exit 1 -else - wget https://downloads.sourceforge.net/project/bochs/bochs/2.6.9/bochs-2.6.9.tar.gz - tar zxvf bochs-2.6.9.tar.gz - cd bochs-2.6.9 - ./configure \ - --with-nogui \ - --enable-disasm \ - --disable-docbook \ - --enable-x86-64 \ - --enable-pci \ - --enable-all-optimizations \ - --enable-plugins \ - --enable-cdrom \ - --enable-a20-pin \ - --enable-fpu \ - --enable-alignment-check \ - --enable-large-ramfile \ - --enable-debugger-gui \ - --enable-readline \ - --enable-iodebug \ - --enable-show-ips \ - --enable-logging \ - --enable-usb \ - --enable-cpu-level=6 \ - --enable-clgd54xx \ - --enable-avx \ - --enable-vmx=2 \ - --enable-long-phy-address \ - --with-term \ - --with-sdl2 - make - make install -fi diff --git a/tools/env.sh b/tools/env.sh new file mode 100644 index 000000000..bc0bc33bd --- /dev/null +++ b/tools/env.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# setup.sh for Simple-XX/SimpleKernel. +# 指定要运行的 ARCH,并设置相关数据 + + +# 指定要编译的目标架构 ARCH: i386, x86_64, riscv64 +# ARCH="i386" +# ARCH="x86_64" +ARCH="riscv64" + +DEBUG=0 + +# 内核映像 +kernel='./build_'${ARCH}'/bin/kernel.elf' +iso_boot_grub='./iso/boot/grub' +iso_boot='./iso/boot/' +iso='./simplekernel.iso' +iso_folder='./iso/' +# 判断操作系统类型 +OS=`uname -s` +# toolchain +if [ "${OS}" == "Linux" ]; then + if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; then + TOOLS="toolchain_linux_x86_64.cmake" + elif [ "${ARCH}" == "aarch64" ]; then + TOOLS="toolchain_linux_aarch64.cmake" + elif [ "${ARCH}" == "riscv64" ]; then + TOOLS="toolchain_linux_riscv.cmake" + TOOLCHAIN_PREFIX=riscv64-linux-gnu- + fi + OPENSBI="$(pwd)/tools/opensbi/build/platform/generic/firmware/fw_jump.elf" + GRUB_PATH="$(dirname $(which grub-file))" +elif [ "${OS}" == "Darwin" ]; then + if [ "${ARCH}" == "i386" ] || [ "${ARCH}" == "x86_64" ]; then + TOOLS="toolchain_mac_x86_64.cmake" + elif [ "${ARCH}" == "aarch64" ]; then + TOOLS="toolchain_mac_aarch64.cmake" + elif [ "${ARCH}" == "riscv64" ]; then + TOOLS="toolchain_mac_riscv.cmake" + TOOLCHAIN_PREFIX=riscv64-unknown-elf- + fi + OPENSBI="$(pwd)/tools/opensbi/build/platform/generic/firmware/fw_jump.elf" + GRUB_PATH="$(pwd)/tools/grub-2.04/build/grub/bin" +fi diff --git a/tools/gdbinit b/tools/gdbinit new file mode 100644 index 000000000..f4c3a7510 --- /dev/null +++ b/tools/gdbinit @@ -0,0 +1,4028 @@ +# INSTALL INSTRUCTIONS: save as ~/.gdbinit +# +# DESCRIPTION: A user-friendly gdb configuration file, for x86/x86_64 and ARM platforms. +# +# REVISION : 9.0 (23/06/2019) +# +# CONTRIBUTORS: mammon_, elaine, pusillus, mong, zhang le, l0kit, +# truthix the cyberpunk, fG!, gln +# +# FEEDBACK: https://reverse.put.as - reverser@put.as +# GITHUB: https://github.com/gdbinit/Gdbinit +# +# NOTES: 'help user' in gdb will list the commands/descriptions in this file +# 'context on' now enables auto-display of context screen +# +# MAC OS X NOTES: If you are using this on Mac OS X, you must either attach gdb to a process +# or launch gdb without any options and then load the binary file you want to analyse with "exec-file" option +# If you load the binary from the command line, like $gdb binary-name, this will not work as it should +# For more information, read it here https://reverse.put.as/2008/11/28/apples-gdb-bug/ +# +# UPDATE: This bug can be fixed in gdb source. Refer to https://reverse.put.as/2009/08/10/fix-for-apples-gdb-bug-or-why-apple-forks-are-bad/ +# and https://reverse.put.as/2009/08/26/gdb-patches/ (if you want the fixed binary for i386) +# +# An updated version of the patch and binary is available at https://reverse.put.as/2011/02/21/update-to-gdb-patches-fix-a-new-bug/ +# +# iOS NOTES: iOS gdb from Cydia (and Apple's) suffer from the same OS X bug. +# If you are using this on Mac OS X or iOS, you must either attach gdb to a process +# or launch gdb without any options and then load the binary file you want to analyse with "exec-file" option +# If you load the binary from the command line, like $gdb binary-name, this will not work as it should +# For more information, read it here https://reverse.put.as/2008/11/28/apples-gdb-bug/ +# +# CHANGELOG: (older changes at the end of the file) +# +# Version 9.0 +# Fixes to make everything work with GNU/GDB 8.3+ +# +# TODO: +# + +# __________________gdb options_________________ + +# set to 1 to have ARM target debugging as default, use the "arm" command to switch inside gdb +set $ARM = 0 +# set to 0 if you have problems with the colorized prompt - reported by Plouj with Ubuntu gdb 7.2 +set $COLOREDPROMPT = 1 +# color the first line of the disassembly - default is green, if you want to change it search for +# SETCOLOR1STLINE and modify it :-) +set $SETCOLOR1STLINE = 0 +# set to 0 to remove disassembly display (useful for scripted commands mass dumping) +set $SHOWDISASM = 1 +# set to 0 to remove display of objectivec messages (default is 1) +set $SHOWOBJECTIVEC = 1 +# set to 0 to remove display of cpu registers (default is 1) +set $SHOWCPUREGISTERS = 1 +# set to 1 to enable display of stack (default is 0) +set $SHOWSTACK = 0 +# set to 1 to enable display of data window (default is 0) +set $SHOWDATAWIN = 0 +# set to 0 to disable colored display of changed registers +set $SHOWREGCHANGES = 1 +# set to 1 so skip command to execute the instruction at the new location +# by default it EIP/RIP will be modified and update the new context but not execute the instruction +set $SKIPEXECUTE = 0 +# if $SKIPEXECUTE is 1 configure the type of execution +# 1 = use stepo (do not get into calls), 0 = use stepi (step into calls) +set $SKIPSTEP = 1 +# show the ARM opcodes - change to 0 if you don't want such thing (in x/i command) +set $ARMOPCODES = 0 +# x86 disassembly flavor: 0 for Intel, 1 for AT&T +set $X86FLAVOR = 0 +# use colorized output or not +set $USECOLOR = 1 +# to use with remote KDP +set $KDP64BITS = -1 +set $64BITS = 0 + +# macOS version works better with this setting off +set startup-with-shell off + +set confirm off +set verbose off +set history filename ~/.gdb_history +set history save + +set output-radix 0x10 +set input-radix 0x10 + +# These make gdb never pause in its output +set height 0 +set width 0 + +set $SHOW_CONTEXT = 1 +set $SHOW_NEST_INSN = 0 + +set $CONTEXTSIZE_STACK = 6 +set $CONTEXTSIZE_DATA = 8 +set $CONTEXTSIZE_CODE = 8 + +# __________________end gdb options_________________ +# + +# __________________color functions_________________ +# +# color codes +set $BLACK = 0 +set $RED = 1 +set $GREEN = 2 +set $YELLOW = 3 +set $BLUE = 4 +set $MAGENTA = 5 +set $CYAN = 6 +set $WHITE = 7 + +# CHANGME: If you want to modify the "theme" change the colors here +# or just create a ~/.gdbinit.local and set these variables there +set $COLOR_REGNAME = $GREEN +set $COLOR_REGVAL = $BLACK +set $COLOR_REGVAL_MODIFIED = $RED +set $COLOR_SEPARATOR = $BLUE +set $COLOR_CPUFLAGS = $RED + +# this is ugly but there's no else if available :-( +define color + if $USECOLOR == 1 + # BLACK + if $arg0 == 0 + echo \033[30m + else + # RED + if $arg0 == 1 + echo \[\e[0;31m\] + else + # GREEN + if $arg0 == 2 + echo \033[32m + else + # YELLOW + if $arg0 == 3 + echo \033[33m + else + # BLUE + if $arg0 == 4 + echo \033[34m + else + # MAGENTA + if $arg0 == 5 + echo \033[35m + else + # CYAN + if $arg0 == 6 + echo \033[36m + else + # WHITE + if $arg0 == 7 + echo \033[37m + end + end + end + end + end + end + end + end + end +end + +define color_reset + if $USECOLOR == 1 + echo \033[0m + end +end + +define color_bold + if $USECOLOR == 1 + #echo \033[1m + echo \[\e[1m\] + end +end + +define color_underline + if $USECOLOR == 1 + echo \033[4m + end +end + +# this way anyone can have their custom prompt - argp's idea :-) +# can also be used to redefine anything else in particular the colors aka theming +# just remap the color variables defined above +source ~/.gdbinit.local + +# can't use the color functions because we are using the set command +if $COLOREDPROMPT == 1 + set extended-prompt \[\e[0;31m\]gdb$ \[\e[0m\] +end + +# Initialize these variables else comparisons will fail for coloring +# we must initialize all of them at once, 32 and 64 bits, and ARM. +set $oldrax = 0 +set $oldrbx = 0 +set $oldrcx = 0 +set $oldrdx = 0 +set $oldrsi = 0 +set $oldrdi = 0 +set $oldrbp = 0 +set $oldrsp = 0 +set $oldr8 = 0 +set $oldr9 = 0 +set $oldr10 = 0 +set $oldr11 = 0 +set $oldr12 = 0 +set $oldr13 = 0 +set $oldr14 = 0 +set $oldr15 = 0 +set $oldeax = 0 +set $oldebx = 0 +set $oldecx = 0 +set $oldedx = 0 +set $oldesi = 0 +set $oldedi = 0 +set $oldebp = 0 +set $oldesp = 0 +set $oldr0 = 0 +set $oldr1 = 0 +set $oldr2 = 0 +set $oldr3 = 0 +set $oldr4 = 0 +set $oldr5 = 0 +set $oldr6 = 0 +set $oldr7 = 0 +set $oldsp = 0 +set $oldlr = 0 + +# used by ptraceme/rptraceme +set $ptrace_bpnum = 0 + +# ______________window size control___________ +define contextsize-stack + if $argc != 1 + help contextsize-stack + else + set $CONTEXTSIZE_STACK = $arg0 + end +end +document contextsize-stack +Syntax: contextsize-stack NUM +| Set stack dump window size to NUM lines. +end + + +define contextsize-data + if $argc != 1 + help contextsize-data + else + set $CONTEXTSIZE_DATA = $arg0 + end +end +document contextsize-data +Syntax: contextsize-data NUM +| Set data dump window size to NUM lines. +end + + +define contextsize-code + if $argc != 1 + help contextsize-code + else + set $CONTEXTSIZE_CODE = $arg0 + end +end +document contextsize-code +Syntax: contextsize-code NUM +| Set code window size to NUM lines. +end + + +# _____________breakpoint aliases_____________ +define bpl + info breakpoints +end +document bpl +Syntax: bpl +| List all breakpoints. +end + + +define bp + if $argc != 1 + help bp + else + if $ASLR != 0 + break ($arg0 + $ASLR) + else + break $arg0 + end + end +end +document bp +Syntax: bp LOCATION +| Set breakpoint. +| LOCATION may be a line number, function name, or "*" and an address. +| To break on a symbol you must enclose symbol name inside "". +| Example: +| bp "[NSControl stringValue]" +| Or else you can use directly the break command (break [NSControl stringValue]) +end + + +define bpc + if $argc != 1 + help bpc + else + clear $arg0 + end +end +document bpc +Syntax: bpc LOCATION +| Clear breakpoint. +| LOCATION may be a line number, function name, or "*" and an address. +end + + +define bpe + if $argc != 1 + help bpe + else + enable $arg0 + end +end +document bpe +Syntax: bpe NUM +| Enable breakpoint with number NUM. +end + + +define bpd + if $argc != 1 + help bpd + else + disable $arg0 + end +end +document bpd +Syntax: bpd NUM +| Disable breakpoint with number NUM. +end + + +define bpt + if $argc != 1 + help bpt + else + tbreak $arg0 + end +end +document bpt +Syntax: bpt LOCATION +| Set a temporary breakpoint. +| This breakpoint will be automatically deleted when hit!. +| LOCATION may be a line number, function name, or "*" and an address. +end + + +define bpm + if $argc != 1 + help bpm + else + awatch $arg0 + end +end +document bpm +Syntax: bpm EXPRESSION +| Set a read/write breakpoint on EXPRESSION, e.g. *address. +end + + +define bhb + if $argc != 1 + help bhb + else + hb $arg0 + end +end +document bhb +Syntax: bhb LOCATION +| Set hardware assisted breakpoint. +| LOCATION may be a line number, function name, or "*" and an address. +end + + +define bht + if $argc != 1 + help bht + else + thbreak $arg0 + end +end +document bht +Usage: bht LOCATION +| Set a temporary hardware breakpoint. +| This breakpoint will be automatically deleted when hit! +| LOCATION may be a line number, function name, or "*" and an address. +end + + +# ______________process information____________ +define argv + show args +end +document argv +Syntax: argv +| Print program arguments. +end + + +define stack + if $argc == 0 + info stack + end + if $argc == 1 + info stack $arg0 + end + if $argc > 1 + help stack + end +end +document stack +Syntax: stack +| Print backtrace of the call stack, or innermost COUNT frames. +end + + +define frame + info frame + info args + info locals +end +document frame +Syntax: frame +| Print stack frame. +end + + +define flagsarm +# conditional flags are +# negative/less than (N), bit 31 of CPSR +# zero (Z), bit 30 +# Carry/Borrow/Extend (C), bit 29 +# Overflow (V), bit 28 + # negative/less than (N), bit 31 of CPSR + if (($cpsr >> 0x1f) & 1) + printf "N " + set $_n_flag = 1 + else + printf "n " + set $_n_flag = 0 + end + # zero (Z), bit 30 + if (($cpsr >> 0x1e) & 1) + printf "Z " + set $_z_flag = 1 + else + printf "z " + set $_z_flag = 0 + end + # Carry/Borrow/Extend (C), bit 29 + if (($cpsr >> 0x1d) & 1) + printf "C " + set $_c_flag = 1 + else + printf "c " + set $_c_flag = 0 + end + # Overflow (V), bit 28 + if (($cpsr >> 0x1c) & 1) + printf "V " + set $_v_flag = 1 + else + printf "v " + set $_v_flag = 0 + end + # Sticky overflow (Q), bit 27 + if (($cpsr >> 0x1b) & 1) + printf "Q " + set $_q_flag = 1 + else + printf "q " + set $_q_flag = 0 + end + # Java state bit (J), bit 24 + # When T=1: + # J = 0 The processor is in Thumb state. + # J = 1 The processor is in ThumbEE state. + if (($cpsr >> 0x18) & 1) + printf "J " + set $_j_flag = 1 + else + printf "j " + set $_j_flag = 0 + end + # Data endianness bit (E), bit 9 + if (($cpsr >> 9) & 1) + printf "E " + set $_e_flag = 1 + else + printf "e " + set $_e_flag = 0 + end + # Imprecise abort disable bit (A), bit 8 + # The A bit is set to 1 automatically. It is used to disable imprecise data aborts. + # It might not be writable in the Nonsecure state if the AW bit in the SCR register is reset. + if (($cpsr >> 8) & 1) + printf "A " + set $_a_flag = 1 + else + printf "a " + set $_a_flag = 0 + end + # IRQ disable bit (I), bit 7 + # When the I bit is set to 1, IRQ interrupts are disabled. + if (($cpsr >> 7) & 1) + printf "I " + set $_i_flag = 1 + else + printf "i " + set $_i_flag = 0 + end + # FIQ disable bit (F), bit 6 + # When the F bit is set to 1, FIQ interrupts are disabled. + # FIQ can be nonmaskable in the Nonsecure state if the FW bit in SCR register is reset. + if (($cpsr >> 6) & 1) + printf "F " + set $_f_flag = 1 + else + printf "f " + set $_f_flag = 0 + end + # Thumb state bit (F), bit 5 + # if 1 then the processor is executing in Thumb state or ThumbEE state depending on the J bit + if (($cpsr >> 5) & 1) + printf "T " + set $_t_flag = 1 + else + printf "t " + set $_t_flag = 0 + end + # TODO: GE bit ? +end +document flagsarm +Syntax: flagsarm +| Auxiliary function to set ARM cpu flags. +end + + +define flagsx86 + # OF (overflow) flag + if (((unsigned int)$eflags >> 0xB) & 1) + printf "O " + set $_of_flag = 1 + else + printf "o " + set $_of_flag = 0 + end + # DF (direction) flag + if (((unsigned int)$eflags >> 0xA) & 1) + printf "D " + else + printf "d " + end + # IF (interrupt enable) flag + if (((unsigned int)$eflags >> 9) & 1) + printf "I " + else + printf "i " + end + # TF (trap) flag + if (((unsigned int)$eflags >> 8) & 1) + printf "T " + else + printf "t " + end + # SF (sign) flag + if (((unsigned int)$eflags >> 7) & 1) + printf "S " + set $_sf_flag = 1 + else + printf "s " + set $_sf_flag = 0 + end + # ZF (zero) flag + if (((unsigned int)$eflags >> 6) & 1) + printf "Z " + set $_zf_flag = 1 + else + printf "z " + set $_zf_flag = 0 + end + # AF (adjust) flag + if (((unsigned int)$eflags >> 4) & 1) + printf "A " + else + printf "a " + end + # PF (parity) flag + if (((unsigned int)$eflags >> 2) & 1) + printf "P " + set $_pf_flag = 1 + else + printf "p " + set $_pf_flag = 0 + end + # CF (carry) flag + if ((unsigned int)$eflags & 1) + printf "C " + set $_cf_flag = 1 + else + printf "c " + set $_cf_flag = 0 + end + printf "\n" +end +document flagsx86 +Syntax: flagsx86 +| Auxiliary function to set X86/X64 cpu flags. +end + + +define flags + # call the auxiliary functions based on target cpu + if $ARM == 1 + flagsarm + else + flagsx86 + end +end +document flags +Syntax: flags +| Print flags register. +end + + +define eflags + if $ARM == 1 + # http://www.heyrick.co.uk/armwiki/The_Status_register + printf " N <%d> Z <%d> C <%d> V <%d>",\ + (($cpsr >> 0x1f) & 1), (($cpsr >> 0x1e) & 1), \ + (($cpsr >> 0x1d) & 1), (($cpsr >> 0x1c) & 1) + printf " Q <%d> J <%d> GE <%d> E <%d> A <%d>",\ + (($cpsr >> 0x1b) & 1), (($cpsr >> 0x18) & 1),\ + (($cpsr >> 0x10) & 7), (($cpsr >> 9) & 1), (($cpsr >> 8) & 1) + printf " I <%d> F <%d> T <%d> \n",\ + (($cpsr >> 7) & 1), (($cpsr >> 6) & 1), \ + (($cpsr >> 5) & 1) + else + printf " OF <%d> DF <%d> IF <%d> TF <%d>",\ + (((unsigned int)$eflags >> 0xB) & 1), (((unsigned int)$eflags >> 0xA) & 1), \ + (((unsigned int)$eflags >> 9) & 1), (((unsigned int)$eflags >> 8) & 1) + printf " SF <%d> ZF <%d> AF <%d> PF <%d> CF <%d>\n",\ + (((unsigned int)$eflags >> 7) & 1), (((unsigned int)$eflags >> 6) & 1),\ + (((unsigned int)$eflags >> 4) & 1), (((unsigned int)$eflags >> 2) & 1), ((unsigned int)$eflags & 1) + printf " ID <%d> VIP <%d> VIF <%d> AC <%d>",\ + (((unsigned int)$eflags >> 0x15) & 1), (((unsigned int)$eflags >> 0x14) & 1), \ + (((unsigned int)$eflags >> 0x13) & 1), (((unsigned int)$eflags >> 0x12) & 1) + printf " VM <%d> RF <%d> NT <%d> IOPL <%d>\n",\ + (((unsigned int)$eflags >> 0x11) & 1), (((unsigned int)$eflags >> 0x10) & 1),\ + (((unsigned int)$eflags >> 0xE) & 1), (((unsigned int)$eflags >> 0xC) & 3) + end +end +document eflags +Syntax: eflags +| Print eflags register. +end + + +define cpsr + eflags +end +document cpsr +Syntax: cpsr +| Print cpsr register. +end + +define regarm + printf " " + # R0 + color $COLOR_REGNAME + printf "R0:" + if ($r0 != $oldr0 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r0 + # R1 + color $COLOR_REGNAME + printf "R1:" + if ($r1 != $oldr1 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r1 + # R2 + color $COLOR_REGNAME + printf "R2:" + if ($r2 != $oldr2 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r2 + # R3 + color $COLOR_REGNAME + printf "R3:" + if ($r3 != $oldr3 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X\n", $r3 + printf " " + # R4 + color $COLOR_REGNAME + printf "R4:" + if ($r4 != $oldr4 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r4 + # R5 + color $COLOR_REGNAME + printf "R5:" + if ($r5 != $oldr5 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r5 + # R6 + color $COLOR_REGNAME + printf "R6:" + if ($r6 != $oldr6 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r6 + # R7 + color $COLOR_REGNAME + printf "R7:" + if ($r7 != $oldr7 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X\n", $r7 + printf " " + # R8 + color $COLOR_REGNAME + printf "R8:" + if ($r8 != $oldr8 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r8 + # R9 + color $COLOR_REGNAME + printf "R9:" + if ($r9 != $oldr9 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r9 + # R10 + color $COLOR_REGNAME + printf "R10:" + if ($r10 != $oldr10 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r10 + # R11 + color $COLOR_REGNAME + printf "R11:" + if ($r11 != $oldr11 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $r11 + dumpjump + printf "\n" + # R12 + color $COLOR_REGNAME + printf " R12:" + if ($r12 != $oldr12 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X", $r12 + printf " " + # SP + color $COLOR_REGNAME + printf "SP:" + if ($sp != $oldsp && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $sp + # LR + color $COLOR_REGNAME + printf "LR:" + if ($lr != $oldlr && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $lr + # PC + color $COLOR_REGNAME + printf "PC:" + color $COLOR_REGVAL_MODIFIED + printf " 0x%08X ", $pc + color_bold + color_underline + color $COLOR_CPUFLAGS + flags + color_reset + printf "\n" +end +document regarm +Syntax: regarm +| Auxiliary function to display ARM registers. +end + +define regx64 + # 64bits stuff + printf " " + # RAX + color $COLOR_REGNAME + printf "RAX:" + if ($rax != $oldrax && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rax + # RBX + color $COLOR_REGNAME + printf "RBX:" + if ($rbx != $oldrbx && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rbx + # RBP + color $COLOR_REGNAME + printf "RBP:" + if ($rbp != $oldrbp && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rbp + # RSP + color $COLOR_REGNAME + printf "RSP:" + if ($rsp != $oldrsp && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rsp + color_bold + color_underline + color $COLOR_CPUFLAGS + flags + color_reset + printf " " + # RDI + color $COLOR_REGNAME + printf "RDI:" + if ($rdi != $oldrdi && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rdi + # RSI + color $COLOR_REGNAME + printf "RSI:" + if ($rsi != $oldrsi && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rsi + # RDX + color $COLOR_REGNAME + printf "RDX:" + if ($rdx != $oldrdx && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rdx + # RCX + color $COLOR_REGNAME + printf "RCX:" + if ($rcx != $oldrcx && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $rcx + # RIP + color $COLOR_REGNAME + printf "RIP:" + color $COLOR_REGVAL_MODIFIED + printf " 0x%016lX\n ", $rip + # R8 + color $COLOR_REGNAME + printf "R8 :" + if ($r8 != $oldr8 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $r8 + # R9 + color $COLOR_REGNAME + printf "R9 :" + if ($r9 != $oldr9 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $r9 + # R10 + color $COLOR_REGNAME + printf "R10:" + if ($r10 != $oldr10 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $r10 + # R11 + color $COLOR_REGNAME + printf "R11:" + if ($r11 != $oldr11 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $r11 + # R12 + color $COLOR_REGNAME + printf "R12:" + if ($r12 != $oldr12 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX\n ", $r12 + # R13 + color $COLOR_REGNAME + printf "R13:" + if ($r13 != $oldr13 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $r13 + # R14 + color $COLOR_REGNAME + printf "R14:" + if ($r14 != $oldr14 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX ", $r14 + # R15 + color $COLOR_REGNAME + printf "R15:" + if ($r15 != $oldr15 && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%016lX\n ", $r15 + color $COLOR_REGNAME + printf "CS:" + color $COLOR_REGVAL + printf " %04X ", $cs + color $COLOR_REGNAME + printf "DS:" + color $COLOR_REGVAL + printf " %04X ", $ds + color $COLOR_REGNAME + printf "ES:" + color $COLOR_REGVAL + printf " %04X ", $es + color $COLOR_REGNAME + printf "FS:" + color $COLOR_REGVAL + printf " %04X ", $fs + color $COLOR_REGNAME + printf "GS:" + color $COLOR_REGVAL + printf " %04X ", $gs + color $COLOR_REGNAME + printf "SS:" + color $COLOR_REGVAL + printf " %04X", $ss + color_reset +end +document regx64 +Syntax: regx64 +| Auxiliary function to display X86_64 registers. +end + + +define regx86 + printf " " + # EAX + color $COLOR_REGNAME + printf "EAX:" + if ($eax != $oldeax && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $eax + # EBX + color $COLOR_REGNAME + printf "EBX:" + if ($ebx != $oldebx && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $ebx + # ECX + color $COLOR_REGNAME + printf "ECX:" + if ($ecx != $oldecx && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $ecx + # EDX + color $COLOR_REGNAME + printf "EDX:" + if ($edx != $oldedx && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $edx + color_bold + color_underline + color $COLOR_CPUFLAGS + flags + color_reset + printf " " + # ESI + color $COLOR_REGNAME + printf "ESI:" + if ($esi != $oldesi && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $esi + # EDI + color $COLOR_REGNAME + printf "EDI:" + if ($edi != $oldedi && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $edi + # EBP + color $COLOR_REGNAME + printf "EBP:" + if ($ebp != $oldebp && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $ebp + # ESP + color $COLOR_REGNAME + printf "ESP:" + if ($esp != $oldesp && $SHOWREGCHANGES == 1) + color $COLOR_REGVAL_MODIFIED + else + color $COLOR_REGVAL + end + printf " 0x%08X ", $esp + # EIP + color $COLOR_REGNAME + printf "EIP:" + color $COLOR_REGVAL_MODIFIED + printf " 0x%08X\n ", $eip + color $COLOR_REGNAME + printf "CS:" + color $COLOR_REGVAL + printf " %04X ", $cs + color $COLOR_REGNAME + printf "DS:" + color $COLOR_REGVAL + printf " %04X ", $ds + color $COLOR_REGNAME + printf "ES:" + color $COLOR_REGVAL + printf " %04X ", $es + color $COLOR_REGNAME + printf "FS:" + color $COLOR_REGVAL + printf " %04X ", $fs + color $COLOR_REGNAME + printf "GS:" + color $COLOR_REGVAL + printf " %04X ", $gs + color $COLOR_REGNAME + printf "SS:" + color $COLOR_REGVAL + printf " %04X", $ss + color_reset +end +document regx86 +Syntax: regx86 +| Auxiliary function to display X86 registers. +end + + +define reg + if $ARM == 1 + regarm + if ($SHOWREGCHANGES == 1) + set $oldr0 = $r0 + set $oldr1 = $r1 + set $oldr2 = $r2 + set $oldr3 = $r3 + set $oldr4 = $r4 + set $oldr5 = $r5 + set $oldr6 = $r6 + set $oldr7 = $r7 + set $oldr8 = $r8 + set $oldr9 = $r9 + set $oldr10 = $r10 + set $oldr11 = $r11 + set $oldr12 = $r12 + set $oldsp = $sp + set $oldlr = $lr + end + else + if ($64BITS == 1) + regx64 + else + regx86 + end + # call smallregisters + smallregisters + # display conditional jump routine + if ($64BITS == 1) + printf "\t\t\t\t" + end + dumpjump + printf "\n" + if ($SHOWREGCHANGES == 1) + if ($64BITS == 1) + set $oldrax = $rax + set $oldrbx = $rbx + set $oldrcx = $rcx + set $oldrdx = $rdx + set $oldrsi = $rsi + set $oldrdi = $rdi + set $oldrbp = $rbp + set $oldrsp = $rsp + set $oldr8 = $r8 + set $oldr9 = $r9 + set $oldr10 = $r10 + set $oldr11 = $r11 + set $oldr12 = $r12 + set $oldr13 = $r13 + set $oldr14 = $r14 + set $oldr15 = $r15 + else + set $oldeax = $eax + set $oldebx = $ebx + set $oldecx = $ecx + set $oldedx = $edx + set $oldesi = $esi + set $oldedi = $edi + set $oldebp = $ebp + set $oldesp = $esp + end + end + end +end +document reg +Syntax: reg +| Print CPU registers. +end + + +define smallregisters + if ($64BITS == 1) + #64bits stuff + # from rax + set $eax = $rax & 0xffffffff + set $ax = $rax & 0xffff + set $al = $ax & 0xff + set $ah = $ax >> 8 + # from rbx + set $ebx = $rbx & 0xffffffff + set $bx = $rbx & 0xffff + set $bl = $bx & 0xff + set $bh = $bx >> 8 + # from rcx + set $ecx = $rcx & 0xffffffff + set $cx = $rcx & 0xffff + set $cl = $cx & 0xff + set $ch = $cx >> 8 + # from rdx + set $edx = $rdx & 0xffffffff + set $dx = $rdx & 0xffff + set $dl = $dx & 0xff + set $dh = $dx >> 8 + # from rsi + set $esi = $rsi & 0xffffffff + set $si = $rsi & 0xffff + # from rdi + set $edi = $rdi & 0xffffffff + set $di = $rdi & 0xffff + #32 bits stuff + else + # from eax + set $ax = $eax & 0xffff + set $al = $ax & 0xff + set $ah = $ax >> 8 + # from ebx + set $bx = $ebx & 0xffff + set $bl = $bx & 0xff + set $bh = $bx >> 8 + # from ecx + set $cx = $ecx & 0xffff + set $cl = $cx & 0xff + set $ch = $cx >> 8 + # from edx + set $dx = $edx & 0xffff + set $dl = $dx & 0xff + set $dh = $dx >> 8 + # from esi + set $si = $esi & 0xffff + # from edi + set $di = $edi & 0xffff + end +end +document smallregisters +Syntax: smallregisters +| Create the 16 and 8 bit cpu registers (gdb doesn't have them by default). +| And 32bits if we are dealing with 64bits binaries. +end + + +define func + if $argc == 0 + info functions + end + if $argc == 1 + info functions $arg0 + end + if $argc > 1 + help func + end +end +document func +Syntax: func +| Print all function names in target, or those matching REGEXP. +end + + +define var + if $argc == 0 + info variables + end + if $argc == 1 + info variables $arg0 + end + if $argc > 1 + help var + end +end +document var +Syntax: var +| Print all global and static variable names (symbols), or those matching REGEXP. +end + + +define lib + info sharedlibrary +end +document lib +Syntax: lib +| Print shared libraries linked to target. +end + + +define sig + if $argc == 0 + info signals + end + if $argc == 1 + info signals $arg0 + end + if $argc > 1 + help sig + end +end +document sig +Syntax: sig +| Print what debugger does when program gets various signals. +| Specify a SIGNAL as argument to print info on that signal only. +end + + +define threads + info threads +end +document threads +Syntax: threads +| Print threads in target. +end + + +define dis + if $argc == 0 + disassemble + end + if $argc == 1 + disassemble $arg0 + end + if $argc == 2 + disassemble $arg0 $arg1 + end + if $argc > 2 + help dis + end +end +document dis +Syntax: dis +| Disassemble a specified section of memory. +| Default is to disassemble the function surrounding the PC (program counter) of selected frame. +| With one argument, ADDR1, the function surrounding this address is dumped. +| Two arguments are taken as a range of memory to dump. +end + + +# __________hex/ascii dump an address_________ +define ascii_char + if $argc != 1 + help ascii_char + else + # thanks elaine :) + set $_c = *(unsigned char *)($arg0) + if ($_c < 0x20 || $_c > 0x7E) + printf "." + else + printf "%c", $_c + end + end +end +document ascii_char +Syntax: ascii_char ADDR +| Print ASCII value of byte at address ADDR. +| Print "." if the value is unprintable. +end + + +define hex_quad + if $argc != 1 + help hex_quad + else + printf "%02X %02X %02X %02X %02X %02X %02X %02X", \ + *(unsigned char*)($arg0), *(unsigned char*)($arg0 + 1), \ + *(unsigned char*)($arg0 + 2), *(unsigned char*)($arg0 + 3), \ + *(unsigned char*)($arg0 + 4), *(unsigned char*)($arg0 + 5), \ + *(unsigned char*)($arg0 + 6), *(unsigned char*)($arg0 + 7) + end +end +document hex_quad +Syntax: hex_quad ADDR +| Print eight hexadecimal bytes starting at address ADDR. +end + + +define hexdump + if $argc == 1 + hexdump_aux $arg0 + else + if $argc == 2 + set $_count = 0 + while ($_count < $arg1) + set $_i = ($_count * 0x10) + hexdump_aux $arg0+$_i + set $_count++ + end + else + help hexdump + end + end +end +document hexdump +Syntax: hexdump ADDR +| Display a 16-byte hex/ASCII dump of memory starting at address ADDR. +| Optional parameter is the number of lines to display if you want more than one. +end + + +define hexdump_aux + if $argc != 1 + help hexdump_aux + else + color_bold + if ($64BITS == 1) + printf "0x%016lX : ", $arg0 + else + printf "0x%08X : ", $arg0 + end + color_reset + hex_quad $arg0 + color_bold + printf " - " + color_reset + hex_quad $arg0+8 + printf " " + color_bold + ascii_char $arg0+0x0 + ascii_char $arg0+0x1 + ascii_char $arg0+0x2 + ascii_char $arg0+0x3 + ascii_char $arg0+0x4 + ascii_char $arg0+0x5 + ascii_char $arg0+0x6 + ascii_char $arg0+0x7 + ascii_char $arg0+0x8 + ascii_char $arg0+0x9 + ascii_char $arg0+0xA + ascii_char $arg0+0xB + ascii_char $arg0+0xC + ascii_char $arg0+0xD + ascii_char $arg0+0xE + ascii_char $arg0+0xF + color_reset + printf "\n" + end +end +document hexdump_aux +Syntax: hexdump_aux ADDR +| Display a 16-byte hex/ASCII dump of memory at address ADDR. +end + + +# _______________data window__________________ +define ddump + if $argc != 1 + help ddump + else + color $COLOR_SEPARATOR + if $ARM == 1 + printf "[0x%08X]", $data_addr + else + if ($64BITS == 1) + printf "[0x%04X:0x%016lX]", $ds, $data_addr + else + printf "[0x%04X:0x%08X]", $ds, $data_addr + end + end + + color $COLOR_SEPARATOR + printf "------------------------" + printf "-------------------------------" + if ($64BITS == 1) + printf "-------------------------------------" + end + color_bold + color $COLOR_SEPARATOR + printf "[data]\n" + color_reset + set $_count = 0 + while ($_count < $arg0) + set $_i = ($_count * 0x10) + hexdump $data_addr+$_i + set $_count++ + end + end +end +document ddump +Syntax: ddump NUM +| Display NUM lines of hexdump for address in $data_addr global variable. +end + + +define dd + if $argc != 1 + help dd + else + set $data_addr = $arg0 + ddump 0x10 + end +end +document dd +Syntax: dd ADDR +| Display 16 lines of a hex dump of address starting at ADDR. +end + + +define datawin + if $ARM == 1 + if ((($r0 >> 0x18) == 0x40) || (($r0 >> 0x18) == 0x08) || (($r0 >> 0x18) == 0xBF)) + set $data_addr = $r0 + else + if ((($r1 >> 0x18) == 0x40) || (($r1 >> 0x18) == 0x08) || (($r1 >> 0x18) == 0xBF)) + set $data_addr = $r1 + else + if ((($r2 >> 0x18) == 0x40) || (($r2 >> 0x18) == 0x08) || (($r2 >> 0x18) == 0xBF)) + set $data_addr = $r2 + else + set $data_addr = $sp + end + end + end +################################# X86 + else + if ($64BITS == 1) + if ((($rsi >> 0x18) == 0x40) || (($rsi >> 0x18) == 0x08) || (($rsi >> 0x18) == 0xBF)) + set $data_addr = $rsi + else + if ((($rdi >> 0x18) == 0x40) || (($rdi >> 0x18) == 0x08) || (($rdi >> 0x18) == 0xBF)) + set $data_addr = $rdi + else + if ((($rax >> 0x18) == 0x40) || (($rax >> 0x18) == 0x08) || (($rax >> 0x18) == 0xBF)) + set $data_addr = $rax + else + set $data_addr = $rsp + end + end + end + else + if ((($esi >> 0x18) == 0x40) || (($esi >> 0x18) == 0x08) || (($esi >> 0x18) == 0xBF)) + set $data_addr = $esi + else + if ((($edi >> 0x18) == 0x40) || (($edi >> 0x18) == 0x08) || (($edi >> 0x18) == 0xBF)) + set $data_addr = $edi + else + if ((($eax >> 0x18) == 0x40) || (($eax >> 0x18) == 0x08) || (($eax >> 0x18) == 0xBF)) + set $data_addr = $eax + else + set $data_addr = $esp + end + end + end + end + end + ddump $CONTEXTSIZE_DATA +end +document datawin +Syntax: datawin +| Display valid address from one register in data window. +| Registers to choose are: esi, edi, eax, or esp. +end + + +################################ +##### ALERT ALERT ALERT ######## +################################ +# Huge mess going here :) HAHA # +################################ +define dumpjump + if $ARM == 1 + ## Most ARM and Thumb instructions are conditional! + # each instruction is 32 bits long + # 4 bits are for condition codes (16 in total) (bits 31:28 in ARM contain the condition or 1111 if instruction is unconditional) + # 2x4 bits for destination and first operand registers + # one for the set-status flag + # an assorted number for other stuff + # 12 bits for any immediate value + # $_t_flag == 0 => ARM mode + # $_t_flag == 1 => Thumb or ThumbEE + # State bit (T), bit 5 + if (($cpsr >> 5) & 1) + set $_t_flag = 1 + else + set $_t_flag = 0 + end + + if $_t_flag == 0 + set $_lastbyte = *(unsigned char *)($pc+3) + #set $_bit31 = ($_lastbyte >> 7) & 1 + #set $_bit30 = ($_lastbyte >> 6) & 1 + #set $_bit29 = ($_lastbyte >> 5) & 1 + #set $_bit28 = ($_lastbyte >> 4) & 1 + set $_conditional = $_lastbyte >> 4 + dumpjumphelper + else + # if bits 15-12 (opcode in Thumb instructions) are equal to 1 1 0 1 (0xD) then we have a conditional branch + # bits 11-8 for the conditional execution code (check ARMv7 manual A8.3) + if ( (*(unsigned char *)($pc+1) >> 4) == 0xD ) + set $_conditional = *(unsigned char *)($pc+1) ^ 0xD0 + dumpjumphelper + end + end +##################### X86 + else + ## grab the first two bytes from the instruction so we can determine the jump instruction + set $_byte1 = *(unsigned char *)$pc + set $_byte2 = *(unsigned char *)($pc+1) + ## and now check what kind of jump we have (in case it's a jump instruction) + ## I changed the flags routine to save the flag into a variable, so we don't need to repeat the process :) (search for "define flags") + + ## opcode 0x77: JA, JNBE (jump if CF=0 and ZF=0) + ## opcode 0x0F87: JNBE, JA + if ( ($_byte1 == 0x77) || ($_byte1 == 0x0F && $_byte2 == 0x87) ) + # cf=0 and zf=0 + if ($_cf_flag == 0 && $_zf_flag == 0) + color $RED + printf " Jump is taken (c=0 and z=0)" + else + # cf != 0 or zf != 0 + color $RED + printf " Jump is NOT taken (c!=0 or z!=0)" + end + end + ## opcode 0x73: JAE, JNB, JNC (jump if CF=0) + ## opcode 0x0F83: JNC, JNB, JAE (jump if CF=0) + if ( ($_byte1 == 0x73) || ($_byte1 == 0x0F && $_byte2 == 0x83) ) + # cf=0 + if ($_cf_flag == 0) + color $RED + printf " Jump is taken (c=0)" + else + # cf != 0 + color $RED + printf " Jump is NOT taken (c!=0)" + end + end + ## opcode 0x72: JB, JC, JNAE (jump if CF=1) + ## opcode 0x0F82: JNAE, JB, JC + if ( ($_byte1 == 0x72) || ($_byte1 == 0x0F && $_byte2 == 0x82) ) + # cf=1 + if ($_cf_flag == 1) + color $RED + printf " Jump is taken (c=1)" + else + # cf != 1 + color $RED + printf " Jump is NOT taken (c!=1)" + end + end + ## opcode 0x76: JBE, JNA (jump if CF=1 or ZF=1) + ## opcode 0x0F86: JBE, JNA + if ( ($_byte1 == 0x76) || ($_byte1 == 0x0F && $_byte2 == 0x86) ) + # cf=1 or zf=1 + if (($_cf_flag == 1) || ($_zf_flag == 1)) + color $RED + printf " Jump is taken (c=1 or z=1)" + else + # cf != 1 or zf != 1 + color $RED + printf " Jump is NOT taken (c!=1 or z!=1)" + end + end + ## opcode 0xE3: JCXZ, JECXZ, JRCXZ (jump if CX=0 or ECX=0 or RCX=0) + if ($_byte1 == 0xE3) + # cx=0 or ecx=0 + if (($ecx == 0) || ($cx == 0)) + color $RED + printf " Jump is taken (cx=0 or ecx=0)" + else + color $RED + printf " Jump is NOT taken (cx!=0 or ecx!=0)" + end + end + ## opcode 0x74: JE, JZ (jump if ZF=1) + ## opcode 0x0F84: JZ, JE, JZ (jump if ZF=1) + if ( ($_byte1 == 0x74) || ($_byte1 == 0x0F && $_byte2 == 0x84) ) + # ZF = 1 + if ($_zf_flag == 1) + color $RED + printf " Jump is taken (z=1)" + else + # ZF = 0 + color $RED + printf " Jump is NOT taken (z!=1)" + end + end + ## opcode 0x7F: JG, JNLE (jump if ZF=0 and SF=OF) + ## opcode 0x0F8F: JNLE, JG (jump if ZF=0 and SF=OF) + if ( ($_byte1 == 0x7F) || ($_byte1 == 0x0F && $_byte2 == 0x8F) ) + # zf = 0 and sf = of + if (($_zf_flag == 0) && ($_sf_flag == $_of_flag)) + color $RED + printf " Jump is taken (z=0 and s=o)" + else + color $RED + printf " Jump is NOT taken (z!=0 or s!=o)" + end + end + ## opcode 0x7D: JGE, JNL (jump if SF=OF) + ## opcode 0x0F8D: JNL, JGE (jump if SF=OF) + if ( ($_byte1 == 0x7D) || ($_byte1 == 0x0F && $_byte2 == 0x8D) ) + # sf = of + if ($_sf_flag == $_of_flag) + color $RED + printf " Jump is taken (s=o)" + else + color $RED + printf " Jump is NOT taken (s!=o)" + end + end + ## opcode: 0x7C: JL, JNGE (jump if SF != OF) + ## opcode: 0x0F8C: JNGE, JL (jump if SF != OF) + if ( ($_byte1 == 0x7C) || ($_byte1 == 0x0F && $_byte2 == 0x8C) ) + # sf != of + if ($_sf_flag != $_of_flag) + color $RED + printf " Jump is taken (s!=o)" + else + color $RED + printf " Jump is NOT taken (s=o)" + end + end + ## opcode 0x7E: JLE, JNG (jump if ZF = 1 or SF != OF) + ## opcode 0x0F8E: JNG, JLE (jump if ZF = 1 or SF != OF) + if ( ($_byte1 == 0x7E) || ($_byte1 == 0x0F && $_byte2 == 0x8E) ) + # zf = 1 or sf != of + if (($_zf_flag == 1) || ($_sf_flag != $_of_flag)) + color $RED + printf " Jump is taken (zf=1 or sf!=of)" + else + color $RED + printf " Jump is NOT taken (zf!=1 or sf=of)" + end + end + ## opcode 0x75: JNE, JNZ (jump if ZF = 0) + ## opcode 0x0F85: JNE, JNZ (jump if ZF = 0) + if ( ($_byte1 == 0x75) || ($_byte1 == 0x0F && $_byte2 == 0x85) ) + # ZF = 0 + if ($_zf_flag == 0) + color $RED + printf " Jump is taken (z=0)" + else + # ZF = 1 + color $RED + printf " Jump is NOT taken (z!=0)" + end + end + ## opcode 0x71: JNO (OF = 0) + ## opcode 0x0F81: JNO (OF = 0) + if ( ($_byte1 == 0x71) || ($_byte1 == 0x0F && $_byte2 == 0x81) ) + # OF = 0 + if ($_of_flag == 0) + color $RED + printf " Jump is taken (o=0)" + else + # OF != 0 + color $RED + printf " Jump is NOT taken (o!=0)" + end + end + ## opcode 0x7B: JNP, JPO (jump if PF = 0) + ## opcode 0x0F8B: JPO (jump if PF = 0) + if ( ($_byte1 == 0x7B) || ($_byte1 == 0x0F && $_byte2 == 0x8B) ) + # PF = 0 + if ($_pf_flag == 0) + color $RED + printf " Jump is NOT taken (p=0)" + else + # PF != 0 + color $RED + printf " Jump is taken (p!=0)" + end + end + ## opcode 0x79: JNS (jump if SF = 0) + ## opcode 0x0F89: JNS (jump if SF = 0) + if ( ($_byte1 == 0x79) || ($_byte1 == 0x0F && $_byte2 == 0x89) ) + # SF = 0 + if ($_sf_flag == 0) + color $RED + printf " Jump is taken (s=0)" + else + # SF != 0 + color $RED + printf " Jump is NOT taken (s!=0)" + end + end + ## opcode 0x70: JO (jump if OF=1) + ## opcode 0x0F80: JO (jump if OF=1) + if ( ($_byte1 == 0x70) || ($_byte1 == 0x0F && $_byte2 == 0x80) ) + # OF = 1 + if ($_of_flag == 1) + color $RED + printf " Jump is taken (o=1)" + else + # OF != 1 + color $RED + printf " Jump is NOT taken (o!=1)" + end + end + ## opcode 0x7A: JP, JPE (jump if PF=1) + ## opcode 0x0F8A: JP, JPE (jump if PF=1) + if ( ($_byte1 == 0x7A) || ($_byte1 == 0x0F && $_byte2 == 0x8A) ) + # PF = 1 + if ($_pf_flag == 1) + color $RED + printf " Jump is taken (p=1)" + else + # PF = 0 + color $RED + printf " Jump is NOT taken (p!=1)" + end + end + ## opcode 0x78: JS (jump if SF=1) + ## opcode 0x0F88: JS (jump if SF=1) + if ( ($_byte1 == 0x78) || ($_byte1 == 0x0F && $_byte2 == 0x88) ) + # SF = 1 + if ($_sf_flag == 1) + color $RED + printf " Jump is taken (s=1)" + else + # SF != 1 + color $RED + printf " Jump is NOT taken (s!=1)" + end + end + end +end +document dumpjump +Syntax: dumpjump +| Display if conditional jump will be taken or not. +end + +define dumpjumphelper + # 0000 - EQ: Z == 1 + if ($_conditional == 0x0) + if ($_z_flag == 1) + color $RED + printf " Jump is taken (z==1)" + else + color $RED + printf " Jump is NOT taken (z!=1)" + end + end + # 0001 - NE: Z == 0 + if ($_conditional == 0x1) + if ($_z_flag == 0) + color $RED + printf " Jump is taken (z==0)" + else + color $RED + printf " Jump is NOT taken (z!=0)" + end + end + # 0010 - CS: C == 1 + if ($_conditional == 0x2) + if ($_c_flag == 1) + color $RED + printf " Jump is taken (c==1)" + else + color $RED + printf " Jump is NOT taken (c!=1)" + end + end + # 0011 - CC: C == 0 + if ($_conditional == 0x3) + if ($_c_flag == 0) + color $RED + printf " Jump is taken (c==0)" + else + color $RED + printf " Jump is NOT taken (c!=0)" + end + end + # 0100 - MI: N == 1 + if ($_conditional == 0x4) + if ($_n_flag == 1) + color $RED + printf " Jump is taken (n==1)" + else + color $RED + printf " Jump is NOT taken (n!=1)" + end + end + # 0101 - PL: N == 0 + if ($_conditional == 0x5) + if ($_n_flag == 0) + color $RED + printf " Jump is taken (n==0)" + else + color $RED + printf " Jump is NOT taken (n!=0)" + end + end + # 0110 - VS: V == 1 + if ($_conditional == 0x6) + if ($_v_flag == 1) + color $RED + printf " Jump is taken (v==1)" + else + color $RED + printf " Jump is NOT taken (v!=1)" + end + end + # 0111 - VC: V == 0 + if ($_conditional == 0x7) + if ($_v_flag == 0) + color $RED + printf " Jump is taken (v==0)" + else + color $RED + printf " Jump is NOT taken (v!=0)" + end + end + # 1000 - HI: C == 1 and Z == 0 + if ($_conditional == 0x8) + if ($_c_flag == 1 && $_z_flag == 0) + color $RED + printf " Jump is taken (c==1 and z==0)" + else + color $RED + printf " Jump is NOT taken (c!=1 or z!=0)" + end + end + # 1001 - LS: C == 0 or Z == 1 + if ($_conditional == 0x9) + if ($_c_flag == 0 || $_z_flag == 1) + color $RED + printf " Jump is taken (c==0 or z==1)" + else + color $RED + printf " Jump is NOT taken (c!=0 or z!=1)" + end + end + # 1010 - GE: N == V + if ($_conditional == 0xA) + if ($_n_flag == $_v_flag) + color $RED + printf " Jump is taken (n==v)" + else + color $RED + printf " Jump is NOT taken (n!=v)" + end + end + # 1011 - LT: N != V + if ($_conditional == 0xB) + if ($_n_flag != $_v_flag) + color $RED + printf " Jump is taken (n!=v)" + else + color $RED + printf " Jump is NOT taken (n==v)" + end + end + # 1100 - GT: Z == 0 and N == V + if ($_conditional == 0xC) + if ($_z_flag == 0 && $_n_flag == $_v_flag) + color $RED + printf " Jump is taken (z==0 and n==v)" + else + color $RED + printf " Jump is NOT taken (z!=0 or n!=v)" + end + end + # 1101 - LE: Z == 1 or N != V + if ($_conditional == 0xD) + if ($_z_flag == 1 || $_n_flag != $_v_flag) + color $RED + printf " Jump is taken (z==1 or n!=v)" + else + color $RED + printf " Jump is NOT taken (z!=1 or n==v)" + end + end +end +document dumpjumphelper +Syntax: dumpjumphelper +| Helper function to decide if conditional jump will be taken or not, for ARM and Thumb. +end + + +# _______________process context______________ +# initialize variable +set $displayobjectivec = 0 + +define context + color $COLOR_SEPARATOR + if $SHOWCPUREGISTERS == 1 + printf "----------------------------------------" + printf "----------------------------------" + if ($64BITS == 1) + printf "---------------------------------------------" + end + color $COLOR_SEPARATOR + color_bold + printf "[regs]\n" + color_reset + reg + color $CYAN + end + if $SHOWSTACK == 1 + color $COLOR_SEPARATOR + if $ARM == 1 + printf "[0x%08X]", $sp + else + if ($64BITS == 1) + printf "[0x%04X:0x%016lX]", $ss, $rsp + else + printf "[0x%04X:0x%08X]", $ss, $esp + end + end + color $COLOR_SEPARATOR + printf "-------------------------" + printf "-----------------------------" + if ($64BITS == 1) + printf "-------------------------------------" + end + color $COLOR_SEPARATOR + color_bold + printf "[stack]\n" + color_reset + set $context_i = $CONTEXTSIZE_STACK + while ($context_i > 0) + set $context_t = $sp + 0x10 * ($context_i - 1) + hexdump $context_t + set $context_i-- + end + end + # show the objective C message being passed to msgSend + if $SHOWOBJECTIVEC == 1 + #FIXME: X64 and ARM + # What a piece of crap that's going on here :) + # detect if it's the correct opcode we are searching for + if $ARM == 0 + set $__byte1 = *(unsigned char *)$pc + set $__byte = *(int *)$pc + if ($__byte == 0x4244489) + set $objectivec = $eax + set $displayobjectivec = 1 + end + + if ($__byte == 0x4245489) + set $objectivec = $edx + set $displayobjectivec = 1 + end + + if ($__byte == 0x4244c89) + set $objectivec = $ecx + set $displayobjectivec = 1 + end + else + set $__byte1 = 0 + end + # and now display it or not (we have no interest in having the info displayed after the call) + if $__byte1 == 0xE8 + if $displayobjectivec == 1 + color $COLOR_SEPARATOR + printf "--------------------------------------------------------------------" + if ($64BITS == 1) + printf "---------------------------------------------" + end + color $COLOR_SEPARATOR + color_bold + printf "[ObjectiveC]\n" + color_reset + color $BLACK + x/s $objectivec + end + set $displayobjectivec = 0 + end + if $displayobjectivec == 1 + color $COLOR_SEPARATOR + printf "--------------------------------------------------------------------" + if ($64BITS == 1) + printf "---------------------------------------------" + end + color $COLOR_SEPARATOR + color_bold + printf "[ObjectiveC]\n" + color_reset + color $BLACK + x/s $objectivec + end + end + color_reset +# and this is the end of this little crap + + if $SHOWDATAWIN == 1 + datawin + end + if $SHOWDISASM == 1 + color $COLOR_SEPARATOR + printf "--------------------------------------------------------------------------" + if ($64BITS == 1) + printf "---------------------------------------------" + end + color $COLOR_SEPARATOR + color_bold + printf "[code]\n" + color_reset + set $context_i = $CONTEXTSIZE_CODE + if ($context_i > 0) + if ($SETCOLOR1STLINE == 1) + color $GREEN + if ($ARM == 1) + # | $cpsr.t (Thumb flag) + x/i (unsigned int)$pc | (($cpsr >> 5) & 1) + else + x/i $pc + end + color_reset + else + if ($ARM == 1) + # | $cpsr.t (Thumb flag) + x/i (unsigned int)$pc | (($cpsr >> 5) & 1) + else + x/i $pc + end + end + set $context_i-- + end + while ($context_i > 0) + x /i + set $context_i-- + end + end + color $COLOR_SEPARATOR + printf "----------------------------------------" + printf "----------------------------------------" + if ($64BITS == 1) + printf "---------------------------------------------\n" + else + printf "\n" + end + color_reset +end +document context +Syntax: context +| Print context window, i.e. regs, stack, ds:esi and disassemble cs:eip. +end + + +define context-on + set $SHOW_CONTEXT = 1 + printf "Displaying of context is now ON\n" +end +document context-on +Syntax: context-on +| Enable display of context on every program break. +end + + +define context-off + set $SHOW_CONTEXT = 0 + printf "Displaying of context is now OFF\n" +end +document context-off +Syntax: context-off +| Disable display of context on every program break. +end + + +# _______________process control______________ +define n + if $argc == 0 + nexti + end + if $argc == 1 + nexti $arg0 + end + if $argc > 1 + help n + end +end +document n +Syntax: n +| Step one instruction, but proceed through subroutine calls. +| If NUM is given, then repeat it NUM times or till program stops. +| This is alias for nexti. +end + + +define go + if $argc == 0 + stepi + end + if $argc == 1 + stepi $arg0 + end + if $argc > 1 + help go + end +end +document go +Syntax: go +| Step one instruction exactly. +| If NUM is given, then repeat it NUM times or till program stops. +| This is alias for stepi. +end + + +define pret + finish +end +document pret +Syntax: pret +| Execute until selected stack frame returns (step out of current call). +| Upon return, the value returned is printed and put in the value history. +end + + +define init + set $SHOW_NEST_INSN = 0 + tbreak _init + r +end +document init +Syntax: init +| Run program and break on _init(). +end + + +define start + set $SHOW_NEST_INSN = 0 + tbreak _start + r +end +document start +Syntax: start +| Run program and break on _start(). +end + + +define sstart + set $SHOW_NEST_INSN = 0 + tbreak __libc_start_main + r +end +document sstart +Syntax: sstart +| Run program and break on __libc_start_main(). +| Useful for stripped executables. +end + + +define main + set $SHOW_NEST_INSN = 0 + tbreak main + r +end +document main +Syntax: main +| Run program and break on main(). +end + + +# FIXME64 +#### WARNING ! WARNING !! +#### More more messy stuff starting !!! +#### I was thinking about how to do this and then it ocurred me that it could be as simple as this ! :) +define stepoframework + if $ARM == 1 + # bl and bx opcodes + # bx Rn => ARM bits 27-20: 0 0 0 1 0 0 1 0 , bits 7-4: 0 0 0 1 ; Thumb bits: 15-7: 0 1 0 0 0 1 1 1 0 + # blx Rn => ARM bits 27-20: 0 0 0 1 0 0 1 0 , bits 7-4: 0 0 1 1 ; Thumb bits: 15-7: 0 1 0 0 0 1 1 1 1 + # bl # => ARM bits 27-24: 1 0 1 1 ; Thumb bits: 15-11: 1 1 1 1 0 + # blx # => ARM bits 31-25: 1 1 1 1 1 0 1 ; Thumb bits: 15-11: 1 1 1 1 0 + set $_nextaddress = 0 + + # ARM Mode + if ($_t_flag == 0) + set $_branchesint = *(unsigned int*)$pc + set $_bit31 = ($_branchesint >> 0x1F) & 1 + set $_bit30 = ($_branchesint >> 0x1E) & 1 + set $_bit29 = ($_branchesint >> 0x1D) & 1 + set $_bit28 = ($_branchesint >> 0x1C) & 1 + set $_bit27 = ($_branchesint >> 0x1B) & 1 + set $_bit26 = ($_branchesint >> 0x1A) & 1 + set $_bit25 = ($_branchesint >> 0x19) & 1 + set $_bit24 = ($_branchesint >> 0x18) & 1 + set $_bit23 = ($_branchesint >> 0x17) & 1 + set $_bit22 = ($_branchesint >> 0x16) & 1 + set $_bit21 = ($_branchesint >> 0x15) & 1 + set $_bit20 = ($_branchesint >> 0x14) & 1 + set $_bit7 = ($_branchesint >> 0x7) & 1 + set $_bit6 = ($_branchesint >> 0x6) & 1 + set $_bit5 = ($_branchesint >> 0x5) & 1 + set $_bit4 = ($_branchesint >> 0x4) & 1 + + # set $_lastbyte = *(unsigned char *)($pc+3) + # set $_bits2724 = $_lastbyte & 0x1 + # set $_bits3128 = $_lastbyte >> 4 + # if ($_bits3128 == 0xF) + # set $_bits2724 = $_lastbyte & 0xA + # set $_bits2724 = $_bits2724 >> 1 + # end + # set $_previousbyte = *(unsigned char *)($pc+2) + # set $_bits2320 = $_previousbyte >> 4 + # printf "bits2724: %x bits2320: %x\n", $_bits2724, $_bits2320 + + if ($_bit27 == 0 && $_bit26 == 0 && $_bit25 == 0 && $_bit24 == 1 && $_bit23 == 0 && $_bit22 == 0 && $_bit21 == 1 && $_bit20 == 0 && $_bit7 == 0 && $_bit6 == 0 && $_bit5 == 0 && $_bit4 == 1) + printf "Found a bx Rn\n" + set $_nextaddress = $pc+0x4 + end + if ($_bit27 == 0 && $_bit26 == 0 && $_bit25 == 0 && $_bit24 == 1 && $_bit23 == 0 && $_bit22 == 0 && $_bit21 == 1 && $_bit20 == 0 && $_bit7 == 0 && $_bit6 == 0 && $_bit5 == 1 && $_bit4 == 1) + printf "Found a blx Rn\n" + set $_nextaddress = $pc+0x4 + end + if ($_bit27 == 1 && $_bit26 == 0 && $_bit25 == 1 && $_bit24 == 1) + printf "Found a bl #\n" + set $_nextaddress = $pc+0x4 + end + if ($_bit31 == 1 && $_bit30 == 1 && $_bit29 == 1 && $_bit28 == 1 && $_bit27 == 1 && $_bit26 == 0 && $_bit25 == 1) + printf "Found a blx #\n" + set $_nextaddress = $pc+0x4 + end + # Thumb Mode + else + # 32 bits instructions in Thumb are divided into two half words + set $_hw1 = *(unsigned short*)($pc) + set $_hw2 = *(unsigned short*)($pc+2) + + # bl/blx (immediate) + # hw1: bits 15-11: 1 1 1 1 0 + # hw2: bits 15-14: 1 1 ; BL bit 12: 1 ; BLX bit 12: 0 + if ( ($_hw1 >> 0xC) == 0xF && (($_hw1 >> 0xB) & 1) == 0) + if ( ((($_hw2 >> 0xF) & 1) == 1) && ((($_hw2 >> 0xE) & 1) == 1) ) + set $_nextaddress = $pc+0x4 + end + end + end + # if we have found a call to bypass we set a temporary breakpoint on next instruction and continue + if ($_nextaddress != 0) + tbreak *$_nextaddress + continue + printf "[StepO] Next address will be %x\n", $_nextaddress + # else we just single step + else + nexti + end +###################################### X86 + else + ## we know that an opcode starting by 0xE8 has a fixed length + ## for the 0xFF opcodes, we can enumerate what is possible to have + # first we grab the first 3 bytes from the current program counter + set $_byte1 = *(unsigned char *)$pc + set $_byte2 = *(unsigned char *)($pc+1) + set $_byte3 = *(unsigned char *)($pc+2) + # and start the fun + # if it's a 0xE8 opcode, the total instruction size will be 5 bytes + # so we can simply calculate the next address and use a temporary breakpoint ! Voila :) + set $_nextaddress = 0 + # this one is the must useful for us !!! + if ($_byte1 == 0xE8) + set $_nextaddress = $pc + 0x5 + else + # just other cases we might be interested in... maybe this should be removed since the 0xE8 opcode is the one we will use more + # this is a big fucking mess and can be improved for sure :) I don't like the way it is ehehehe + if ($_byte1 == 0xFF) + # call *%eax (0xFFD0) || call *%edx (0xFFD2) || call *(%ecx) (0xFFD1) || call (%eax) (0xFF10) || call *%esi (0xFFD6) || call *%ebx (0xFFD3) || call DWORD PTR [edx] (0xFF12) + if ($_byte2 == 0xD0 || $_byte2 == 0xD1 || $_byte2 == 0xD2 || $_byte2 == 0xD3 || $_byte2 == 0xD6 || $_byte2 == 0x10 || $_byte2 == 0x11 || $_byte2 == 0xD7 || $_byte2 == 0x12) + set $_nextaddress = $pc + 0x2 + end + # call *0x??(%ebp) (0xFF55??) || call *0x??(%esi) (0xFF56??) || call *0x??(%edi) (0xFF5F??) || call *0x??(%ebx) + # call *0x??(%edx) (0xFF52??) || call *0x??(%ecx) (0xFF51??) || call *0x??(%edi) (0xFF57??) || call *0x??(%eax) (0xFF50??) + if ($_byte2 == 0x55 || $_byte2 == 0x56 || $_byte2 == 0x5F || $_byte2 == 0x53 || $_byte2 == 0x52 || $_byte2 == 0x51 || $_byte2 == 0x57 || $_byte2 == 0x50) + set $_nextaddress = $pc + 0x3 + end + # call *0x????????(%ebx) (0xFF93????????) || + if ($_byte2 == 0x93 || $_byte2 == 0x94 || $_byte2 == 0x90 || $_byte2 == 0x92 || $_byte2 == 0x95 || $_byte2 == 0x15) + set $_nextaddress = $pc + 6 + end + # call *0x????????(%ebx,%eax,4) (0xFF94??????????) + if ($_byte2 == 0x94) + set $_nextaddress = $pc + 7 + end + end + # FIXME: still missing a few? + if ($_byte1 == 0x41 || $_byte1 == 0x40) + if ($_byte2 == 0xFF) + if ($_byte3 == 0xD0 || $_byte3 == 0xD1 || $_byte3 == 0xD2 || $_byte3 == 0xD3 || $_byte3 == 0xD4 || $_byte3 == 0xD5 || $_byte3 == 0xD6 || $_byte3 == 0xD7) + set $_nextaddress = $pc + 0x3 + end + end + end + end + # if we have found a call to bypass we set a temporary breakpoint on next instruction and continue + if ($_nextaddress != 0) + if ($arg0 == 1) + thbreak *$_nextaddress + else + tbreak *$_nextaddress + end + continue + # else we just single step + else + nexti + end + end +end +document stepoframework +Syntax: stepoframework +| Auxiliary function to stepo command. +end + +define stepo + stepoframework 0 +end +document stepo +Syntax: stepo +| Step over calls (interesting to bypass the ones to msgSend). +| This function will set a temporary breakpoint on next instruction after the call so the call will be bypassed. +| You can safely use it instead nexti or n since it will single step code if it's not a call instruction (unless you want to go into the call function). +end + + +define stepoh + stepoframework 1 +end +document stepoh +Syntax: stepoh +| Same as stepo command but uses temporary hardware breakpoints. +end + + +# FIXME: ARM +define skip + x/2i $pc + set $instruction_size = (int)($_ - $pc) + set $pc = $pc + $instruction_size + if ($SKIPEXECUTE == 1) + if ($SKIPSTEP == 1) + stepo + else + stepi + end + else + context + end +end +document skip +Syntax: skip +| Skip over the instruction located at EIP/RIP. By default, the instruction will not be executed! +| Some configurable options are available on top of gdbinit to override this. +end + + +# _______________eflags commands______________ +# conditional flags are +# negative/less than (N), bit 31 of CPSR +# zero (Z), bit 30 +# Carry/Borrow/Extend (C), bit 29 +# Overflow (V), bit 28 + +# negative/less than (N), bit 31 of CPSR +define cfn + if $ARM == 1 + set $tempflag = $cpsr->n + if ($tempflag & 1) + set $cpsr->n = $tempflag&~0x1 + else + set $cpsr->n = $tempflag|0x1 + end + end +end +document cfn +Syntax: cfn +| Change Negative/Less Than Flag. +end + + +define cfc +# Carry/Borrow/Extend (C), bit 29 + if $ARM == 1 + set $tempflag = $cpsr->c + if ($tempflag & 1) + set $cpsr->c = $tempflag&~0x1 + else + set $cpsr->c = $tempflag|0x1 + end + else + if ((unsigned int)$eflags & 1) + set $eflags = (unsigned int)$eflags&~0x1 + else + set $eflags = (unsigned int)$eflags|0x1 + end + end +end +document cfc +Syntax: cfc +| Change Carry Flag. +end + + +define cfp + if (((unsigned int)$eflags >> 2) & 1) + set $eflags = (unsigned int)$eflags&~0x4 + else + set $eflags = (unsigned int)$eflags|0x4 + end +end +document cfp +Syntax: cfp +| Change Parity Flag. +end + + +define cfa + if (((unsigned int)$eflags >> 4) & 1) + set $eflags = (unsigned int)$eflags&~0x10 + else + set $eflags = (unsigned int)$eflags|0x10 + end +end +document cfa +Syntax: cfa +| Change Auxiliary Carry Flag. +end + + +define cfz +# zero (Z), bit 30 + if $ARM == 1 + set $tempflag = $cpsr->z + if ($tempflag & 1) + set $cpsr->z = $tempflag&~0x1 + else + set $cpsr->z = $tempflag|0x1 + end + else + if (((unsigned int)$eflags >> 6) & 1) + set $eflags = (unsigned int)$eflags&~0x40 + else + set $eflags = (unsigned int)$eflags|0x40 + end + end +end +document cfz +Syntax: cfz +| Change Zero Flag. +end + + +define cfs + if (((unsigned int)$eflags >> 7) & 1) + set $eflags = (unsigned int)$eflags&~0x80 + else + set $eflags = (unsigned int)$eflags|0x80 + end +end +document cfs +Syntax: cfs +| Change Sign Flag. +end + + +define cft + if (((unsigned int)$eflags >>8) & 1) + set $eflags = (unsigned int)$eflags&~0x100 + else + set $eflags = (unsigned int)$eflags|0x100 + end +end +document cft +Syntax: cft +| Change Trap Flag. +end + + +define cfi + if (((unsigned int)$eflags >> 9) & 1) + set $eflags = (unsigned int)$eflags&~0x200 + else + set $eflags = (unsigned int)$eflags|0x200 + end +end +document cfi +Syntax: cfi +| Change Interrupt Flag. +| Only privileged applications (usually the OS kernel) may modify IF. +| This only applies to protected mode (real mode code may always modify IF). +end + + +define cfd + if (((unsigned int)$eflags >>0xA) & 1) + set $eflags = (unsigned int)$eflags&~0x400 + else + set $eflags = (unsigned int)$eflags|0x400 + end +end +document cfd +Syntax: cfd +| Change Direction Flag. +end + + +define cfo + if (((unsigned int)$eflags >> 0xB) & 1) + set $eflags = (unsigned int)$eflags&~0x800 + else + set $eflags = (unsigned int)$eflags|0x800 + end +end +document cfo +Syntax: cfo +| Change Overflow Flag. +end + + +# Overflow (V), bit 28 +define cfv + if $ARM == 1 + set $tempflag = $cpsr->v + if ($tempflag & 1) + set $cpsr->v = $tempflag&~0x1 + else + set $cpsr->v = $tempflag|0x1 + end + end +end +document cfv +Syntax: cfv +| Change Overflow Flag. +end + + +# ____________________patch___________________ +# the usual nops are mov r0,r0 for arm (0xe1a00000) +# and mov r8,r8 in Thumb (0x46c0) +# armv7 has other nops +# FIXME: make sure that the interval fits the 32bits address for arm and 16bits for thumb +# status: works, fixme +define nop + if ($argc > 2 || $argc == 0) + help nop + end + + if $ARM == 1 + if ($argc == 1) + if ($cpsr->t &1) + # thumb + set *(short *)$arg0 = 0x46c0 + else + # arm + set *(int *)$arg0 = 0xe1a00000 + end + else + set $addr = $arg0 + if ($cpsr->t & 1) + # thumb + while ($addr < $arg1) + set *(short *)$addr = 0x46c0 + set $addr = $addr + 2 + end + else + # arm + while ($addr < $arg1) + set *(int *)$addr = 0xe1a00000 + set $addr = $addr + 4 + end + end + end + else + if ($argc == 1) + set *(unsigned char *)$arg0 = 0x90 + else + set $addr = $arg0 + while ($addr < $arg1) + set *(unsigned char *)$addr = 0x90 + set $addr = $addr + 1 + end + end + end +end +document nop +Syntax: nop ADDR1 [ADDR2] +| Patch a single byte at address ADDR1, or a series of bytes between ADDR1 and ADDR2 to a NOP (0x90) instruction. +| ARM or Thumb code will be patched accordingly. +end + + +define null + if ( $argc >2 || $argc == 0) + help null + end + + if ($argc == 1) + set *(unsigned char *)$arg0 = 0 + else + set $addr = $arg0 + while ($addr < $arg1) + set *(unsigned char *)$addr = 0 + set $addr = $addr +1 + end + end +end +document null +Syntax: null ADDR1 [ADDR2] +| Patch a single byte at address ADDR1 to NULL (0x00), or a series of bytes between ADDR1 and ADDR2. +end + +# FIXME: thumb breakpoint ? +define int3 + if $argc != 1 + help int3 + else + if $ARM == 1 + set $ORIGINAL_INT3 = *(unsigned int *)$arg0 + set $ORIGINAL_INT3ADDRESS = $arg0 + set *(unsigned int*)$arg0 = 0xe7ffdefe + else + # save original bytes and address + set $ORIGINAL_INT3 = *(unsigned char *)$arg0 + set $ORIGINAL_INT3ADDRESS = $arg0 + # patch + set *(unsigned char *)$arg0 = 0xCC + end + end +end +document int3 +Syntax int3 ADDR +| Patch byte at address ADDR to an INT3 (0xCC) instruction or the equivalent software breakpoint for ARM. +end + + +define rint3 + if $ARM == 1 + set *(unsigned int *)$ORIGINAL_INT3ADDRESS = $ORIGINAL_INT3 + set $pc = $ORIGINAL_INT3ADDRESS + else + set *(unsigned char *)$ORIGINAL_INT3ADDRESS = $ORIGINAL_INT3 + if ($64BITS == 1) + set $rip = $ORIGINAL_INT3ADDRESS + else + set $eip = $ORIGINAL_INT3ADDRESS + end + end +end +document rint3 +Syntax: rint3 +| Restore the original byte previous to int3 patch issued with "int3" command. +end + +define patch + if $argc != 3 + help patch + end + set $patchaddr = $arg0 + set $patchbytes = $arg1 + set $patchsize = $arg2 + + if ($patchsize == 1) + set *(unsigned char*)$patchaddr = $patchbytes + end + if ($patchsize == 2) + set $lendianbytes = (unsigned short)(($patchbytes << 8) | ($patchbytes >> 8)) + set *(unsigned short*)$patchaddr = $lendianbytes + end + if ($patchsize == 4) + set $lendianbytes = (unsigned int)( (($patchbytes << 8) & 0xFF00FF00 ) | (($patchbytes >> 8) & 0xFF00FF )) + set $lendianbytes = (unsigned int)($lendianbytes << 0x10 | $lendianbytes >> 0x10) + set *(unsigned int*)$patchaddr = $lendianbytes + end + if ($patchsize == 8) + set $lendianbytes = (unsigned long long)( (($patchbytes << 8) & 0xFF00FF00FF00FF00ULL ) | (($patchbytes >> 8) & 0x00FF00FF00FF00FFULL ) ) + set $lendianbytes = (unsigned long long)( (($lendianbytes << 0x10) & 0xFFFF0000FFFF0000ULL ) | (($lendianbytes >> 0x10) & 0x0000FFFF0000FFFFULL ) ) + set $lendianbytes = (unsigned long long)( ($lendianbytes << 0x20) | ($lendianbytes >> 0x20) ) + set *(unsigned long long*)$patchaddr = $lendianbytes + end +end +document patch +Syntax: patch address bytes size +| Patch a given address, converting the bytes to little-endian. +| Assumes input bytes are unsigned values and should be in hexadecimal format (0x...). +| Size must be 1, 2, 4, 8 bytes. +| Main purpose is to be used with the output from the asm commands. +end + +# ____________________cflow___________________ +define print_insn_type + if $argc != 1 + help print_insn_type + else + if ($arg0 < 0 || $arg0 > 5) + printf "UNDEFINED/WRONG VALUE" + end + if ($arg0 == 0) + printf "UNKNOWN" + end + if ($arg0 == 1) + printf "JMP" + end + if ($arg0 == 2) + printf "JCC" + end + if ($arg0 == 3) + printf "CALL" + end + if ($arg0 == 4) + printf "RET" + end + if ($arg0 == 5) + printf "INT" + end + end +end +document print_insn_type +Syntax: print_insn_type INSN_TYPE_NUMBER +| Print human-readable mnemonic for the instruction type (usually $INSN_TYPE). +end + + +define get_insn_type + if $argc != 1 + help get_insn_type + else + set $INSN_TYPE = 0 + set $_byte1 = *(unsigned char *)$arg0 + if ($_byte1 == 0x9A || $_byte1 == 0xE8) + # "call" + set $INSN_TYPE = 3 + end + if ($_byte1 >= 0xE9 && $_byte1 <= 0xEB) + # "jmp" + set $INSN_TYPE = 1 + end + if ($_byte1 >= 0x70 && $_byte1 <= 0x7F) + # "jcc" + set $INSN_TYPE = 2 + end + if ($_byte1 >= 0xE0 && $_byte1 <= 0xE3 ) + # "jcc" + set $INSN_TYPE = 2 + end + if ($_byte1 == 0xC2 || $_byte1 == 0xC3 || $_byte1 == 0xCA || \ + $_byte1 == 0xCB || $_byte1 == 0xCF) + # "ret" + set $INSN_TYPE = 4 + end + if ($_byte1 >= 0xCC && $_byte1 <= 0xCE) + # "int" + set $INSN_TYPE = 5 + end + if ($_byte1 == 0x0F ) + # two-byte opcode + set $_byte2 = *(unsigned char *)($arg0 + 1) + if ($_byte2 >= 0x80 && $_byte2 <= 0x8F) + # "jcc" + set $INSN_TYPE = 2 + end + end + if ($_byte1 == 0xFF) + # opcode extension + set $_byte2 = *(unsigned char *)($arg0 + 1) + set $_opext = ($_byte2 & 0x38) + if ($_opext == 0x10 || $_opext == 0x18) + # "call" + set $INSN_TYPE = 3 + end + if ($_opext == 0x20 || $_opext == 0x28) + # "jmp" + set $INSN_TYPE = 1 + end + end + end +end +document get_insn_type +Syntax: get_insn_type ADDR +| Recognize instruction type at address ADDR. +| Take address ADDR and set the global $INSN_TYPE variable to +| 0, 1, 2, 3, 4, 5 if the instruction at that address is +| unknown, a jump, a conditional jump, a call, a return, or an interrupt. +end + + +define step_to_call + set $_saved_ctx = $SHOW_CONTEXT + set $SHOW_CONTEXT = 0 + set $SHOW_NEST_INSN = 0 + + set logging file /dev/null + set logging redirect on + set logging on + + set $_cont = 1 + while ($_cont > 0) + stepi + get_insn_type $pc + if ($INSN_TYPE == 3) + set $_cont = 0 + end + end + + set logging off + + if ($_saved_ctx > 0) + context + end + + set $SHOW_CONTEXT = $_saved_ctx + set $SHOW_NEST_INSN = 0 + + set logging file ~/gdb.txt + set logging redirect off + set logging on + + printf "step_to_call command stopped at:\n " + x/i $pc + printf "\n" + set logging off + +end +document step_to_call +Syntax: step_to_call +| Single step until a call instruction is found. +| Stop before the call is taken. +| Log is written into the file ~/gdb.txt. +end + + +define trace_calls + + printf "Tracing...please wait...\n" + + set $_saved_ctx = $SHOW_CONTEXT + set $SHOW_CONTEXT = 0 + set $SHOW_NEST_INSN = 0 + set $_nest = 1 + set listsize 0 + + set logging overwrite on + set logging file ~/gdb_trace_calls.txt + set logging on + set logging off + set logging overwrite off + + while ($_nest > 0) + get_insn_type $pc + # handle nesting + if ($INSN_TYPE == 3) + set $_nest = $_nest + 1 + else + if ($INSN_TYPE == 4) + set $_nest = $_nest - 1 + end + end + # if a call, print it + if ($INSN_TYPE == 3) + set logging file ~/gdb_trace_calls.txt + set logging redirect off + set logging on + + set $x = $_nest - 2 + while ($x > 0) + printf "\t" + set $x = $x - 1 + end + x/i $pc + end + + set logging off + set logging file /dev/null + set logging redirect on + set logging on + stepi + set logging redirect off + set logging off + end + + set $SHOW_CONTEXT = $_saved_ctx + set $SHOW_NEST_INSN = 0 + + printf "Done, check ~/gdb_trace_calls.txt\n" +end +document trace_calls +Syntax: trace_calls +| Create a runtime trace of the calls made by target. +| Log overwrites(!) the file ~/gdb_trace_calls.txt. +end + + +define trace_run + + printf "Tracing...please wait...\n" + + set $_saved_ctx = $SHOW_CONTEXT + set $SHOW_CONTEXT = 0 + set $SHOW_NEST_INSN = 1 + set logging overwrite on + set logging file ~/gdb_trace_run.txt + set logging redirect on + set logging on + set $_nest = 1 + + while ( $_nest > 0 ) + + get_insn_type $pc + # jmp, jcc, or cll + if ($INSN_TYPE == 3) + set $_nest = $_nest + 1 + else + # ret + if ($INSN_TYPE == 4) + set $_nest = $_nest - 1 + end + end + stepi + end + + printf "\n" + + set $SHOW_CONTEXT = $_saved_ctx + set $SHOW_NEST_INSN = 0 + set logging redirect off + set logging off + + # clean up trace file + shell grep -v ' at ' ~/gdb_trace_run.txt > ~/gdb_trace_run.1 + shell grep -v ' in ' ~/gdb_trace_run.1 > ~/gdb_trace_run.txt + shell rm -f ~/gdb_trace_run.1 + printf "Done, check ~/gdb_trace_run.txt\n" +end +document trace_run +Syntax: trace_run +| Create a runtime trace of target. +| Log overwrites(!) the file ~/gdb_trace_run.txt. +end + +define entry_point + + set logging redirect on + set logging file /tmp/gdb-entry_point + set logging on + + info files + + set logging off + + shell entry_point="$(/usr/bin/grep 'Entry point:' /tmp/gdb-entry_point | /usr/bin/awk '{ print $3 }')"; echo "$entry_point"; echo 'set $entry_point_address = '"$entry_point" > /tmp/gdb-entry_point + source /tmp/gdb-entry_point + shell /bin/rm -f /tmp/gdb-entry_point +end +document entry_point +Syntax: entry_point +| Prints the entry point address of the target and stores it in the variable entry_point. +end + +define break_entrypoint + entry_point + break *$entry_point_address +end +document break_entrypoint +Syntax: break_entrypoint +| Sets a breakpoint on the entry point of the target. +end + +define objc_symbols + + set logging redirect on + set logging file /tmp/gdb-objc_symbols + set logging on + + info target + + set logging off + # XXX: define paths for objc-symbols and SymTabCreator + shell target="$(/usr/bin/head -1 /tmp/gdb-objc_symbols | /usr/bin/head -1 | /usr/bin/awk -F '"' '{ print $2 }')"; objc-symbols "$target" | SymTabCreator -o /tmp/gdb-symtab + + set logging on + add-symbol-file /tmp/gdb-symtab + set logging off + shell /bin/rm -f /tmp/gdb-objc_symbols +end +document objc_symbols +Syntax: objc_symbols +| Loads stripped objc symbols into gdb using objc-symbols and SymTabCreator +| See http://stackoverflow.com/questions/17554070/import-class-dump-info-into-gdb +| and https://github.com/0xced/class-dump/tree/objc-symbols (for the required utils) +end + +#define ptraceme +# catch syscall ptrace +# commands +# if ($64BITS == 0) +# if ($ebx == 0) +# set $eax = 0 +# continue +# end +# else +# if ($rdi == 0) +# set $rax = 0 +# continue +# end +# end +# end +# set $ptrace_bpnum = $bpnum +#end +#document ptraceme +#Syntax: ptraceme +#| Hook ptrace to bypass PTRACE_TRACEME anti debugging technique +#end + +define rptraceme + if ($ptrace_bpnum != 0) + delete $ptrace_bpnum + set $ptrace_bpnum = 0 + end +end +document rptraceme +Syntax: rptraceme +| Remove ptrace hook. +end + + +# ____________________misc____________________ +define hook-stop + if (sizeof(void*) == 8) + set $64BITS = 1 + else + set $64BITS = 0 + end + + if ($KDP64BITS != -1) + if ($KDP64BITS == 0) + set $64BITS = 0 + else + set $64BITS = 1 + end + end + + # Display instructions formats + if $ARM == 1 + if $ARMOPCODES == 1 + set arm show-opcode-bytes 1 + end + else + if $X86FLAVOR == 0 + set disassembly-flavor intel + else + set disassembly-flavor att + end + end + + # this makes 'context' be called at every BP/step + if ($SHOW_CONTEXT > 0) + context + end + if ($SHOW_NEST_INSN > 0) + set $x = $_nest + while ($x > 0) + printf "\t" + set $x = $x - 1 + end + end +end +document hook-stop +Syntax: hook-stop +| !!! FOR INTERNAL USE ONLY - DO NOT CALL !!! +end + + +# original by Tavis Ormandy (http://my.opera.com/taviso/blog/index.dml/tag/gdb) (great fix!) +# modified to work with Mac OS X by fG! +# seems nasm shipping with Mac OS X has problems accepting input from stdin or heredoc +# input is read into a variable and sent to a temporary file which nasm can read +define assemble + # dont enter routine again if user hits enter + dont-repeat + if ($argc) + if (*$arg0 = *$arg0) + # check if we have a valid address by dereferencing it, + # if we havnt, this will cause the routine to exit. + end + printf "Instructions will be written to %#x.\n", $arg0 + else + printf "Instructions will be written to stdout.\n" + end + printf "Type instructions, one per line." + color_bold + printf " Do not forget to use NASM assembler syntax!\n" + color_reset + printf "End with a line saying just \"end\".\n" + + if ($argc) + if ($64BITS == 1) + # argument specified, assemble instructions into memory at address specified. + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 64\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/local/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/bin/hexdump -ve '1/1 "set *((unsigned char *) $arg0 + %#2_ax) = %#02x\n"' >/tmp/gdbassemble ; /bin/rm -f /tmp/$GDBASMFILENAME + source /tmp/gdbassemble + # all done. clean the temporary file + shell /bin/rm -f /tmp/gdbassemble + else + # argument specified, assemble instructions into memory at address specified. + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 32\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/bin/hexdump -ve '1/1 "set *((unsigned char *) $arg0 + %#2_ax) = %#02x\n"' >/tmp/gdbassemble ; /bin/rm -f /tmp/$GDBASMFILENAME + source /tmp/gdbassemble + # all done. clean the temporary file + shell /bin/rm -f /tmp/gdbassemble + end + else + if ($64BITS == 1) + # no argument, assemble instructions to stdout + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 64\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/local/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/local/bin/ndisasm -i -b64 /dev/stdin ; \ + /bin/rm -f /tmp/$GDBASMFILENAME + else + # no argument, assemble instructions to stdout + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 32\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/bin/ndisasm -i -b32 /dev/stdin ; \ + /bin/rm -f /tmp/$GDBASMFILENAME + end + end +end +document assemble +Syntax: assemble +| Assemble instructions using nasm. +| Type a line containing "end" to indicate the end. +| If an address is specified, insert/modify instructions at that address. +| If no address is specified, assembled instructions are printed to stdout. +| Use the pseudo instruction "org ADDR" to set the base address. +end + +define assemble32 + # dont enter routine again if user hits enter + dont-repeat + if ($argc) + if (*$arg0 = *$arg0) + # check if we have a valid address by dereferencing it, + # if we havnt, this will cause the routine to exit. + end + printf "Instructions will be written to %#x.\n", $arg0 + else + printf "Instructions will be written to stdout.\n" + end + printf "Type instructions, one per line." + color_bold + printf " Do not forget to use NASM assembler syntax!\n" + color_reset + printf "End with a line saying just \"end\".\n" + + if ($argc) + # argument specified, assemble instructions into memory at address specified. + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 32\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/bin/hexdump -ve '1/1 "set *((unsigned char *) $arg0 + %#2_ax) = %#02x\n"' >/tmp/gdbassemble ; /bin/rm -f /tmp/$GDBASMFILENAME + source /tmp/gdbassemble + # all done. clean the temporary file + shell /bin/rm -f /tmp/gdbassemble + else + # no argument, assemble instructions to stdout + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 32\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/bin/ndisasm -i -b32 /dev/stdin ; \ + /bin/rm -f /tmp/$GDBASMFILENAME + end +end +document assemble32 +Syntax: assemble32 +| Assemble 32 bits instructions using nasm. +| Type a line containing "end" to indicate the end. +| If an address is specified, insert/modify instructions at that address. +| If no address is specified, assembled instructions are printed to stdout. +| Use the pseudo instruction "org ADDR" to set the base address. +end + +define assemble64 + # dont enter routine again if user hits enter + dont-repeat + if ($argc) + if (*$arg0 = *$arg0) + # check if we have a valid address by dereferencing it, + # if we havnt, this will cause the routine to exit. + end + printf "Instructions will be written to %#x.\n", $arg0 + else + printf "Instructions will be written to stdout.\n" + end + printf "Type instructions, one per line." + color_bold + printf " Do not forget to use NASM assembler syntax!\n" + color_reset + printf "End with a line saying just \"end\".\n" + + if ($argc) + # argument specified, assemble instructions into memory at address specified. + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 64\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/local/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/bin/hexdump -ve '1/1 "set *((unsigned char *) $arg0 + %#2_ax) = %#02x\n"' >/tmp/gdbassemble ; /bin/rm -f /tmp/$GDBASMFILENAME + source /tmp/gdbassemble + # all done. clean the temporary file + shell /bin/rm -f /tmp/gdbassemble + else + # no argument, assemble instructions to stdout + shell ASMOPCODE="$(while read -ep '>' r && test "$r" != end ; do echo -E "$r"; done)" ; GDBASMFILENAME=$RANDOM; \ + echo -e "BITS 64\n$ASMOPCODE" >/tmp/$GDBASMFILENAME ; /usr/local/bin/nasm -f bin -o /dev/stdout /tmp/$GDBASMFILENAME | /usr/local/bin/ndisasm -i -b64 /dev/stdin ; \ + /bin/rm -f /tmp/$GDBASMFILENAME + end +end +document assemble64 +Syntax: assemble64 +| Assemble 64 bits instructions using nasm. +| Type a line containing "end" to indicate the end. +| If an address is specified, insert/modify instructions at that address. +| If no address is specified, assembled instructions are printed to stdout. +| Use the pseudo instruction "org ADDR" to set the base address. +end + +define asm + if $argc == 1 + assemble $arg0 + else + assemble + end +end +document asm +Syntax: asm +| Shortcut to the asssemble command. +end + +define asm32 + if $argc == 1 + assemble32 $arg0 + else + assemble32 + end +end +document asm32 +Syntax: asm32 +| Shortcut to the assemble32 command. +end + +define asm64 + if $argc == 1 + assemble64 $arg0 + else + assemble64 + end +end +document asm64 +Syntax: asm64 +| Shortcut to the assemble64 command. +end + +define assemble_gas + printf "\nType code to assemble and hit Ctrl-D when finished.\n" + printf "You must use GNU assembler (AT&T) syntax.\n" + + shell filename=$(mktemp); \ + binfilename=$(mktemp); \ + echo -e "Writing into: ${filename}\n"; \ + cat > $filename; echo ""; \ + as -o $binfilename < $filename; \ + objdump -d -j .text $binfilename; \ + rm -f $binfilename; \ + rm -f $filename; \ + echo -e "temporaly files deleted.\n" +end +document assemble_gas +Syntax: assemble_gas +| Assemble instructions to binary opcodes. Uses GNU as and objdump. +end + + +define dump_hexfile + dump ihex memory $arg0 $arg1 $arg2 +end +document dump_hexfile +Syntax: dump_hexfile FILENAME ADDR1 ADDR2 +| Write a range of memory to a file in Intel ihex (hexdump) format. +| The range is specified by ADDR1 and ADDR2 addresses. +end + + +define dump_binfile + dump memory $arg0 $arg1 $arg2 +end +document dump_binfile +Syntax: dump_binfile FILENAME ADDR1 ADDR2 +| Write a range of memory to a binary file. +| The range is specified by ADDR1 and ADDR2 addresses. +end + + +define dumpmacho + if $argc != 2 + help dumpmacho + end + set $headermagic = *$arg0 + # the || operator isn't working as it should, wtf!!! + if $headermagic != 0xfeedface + if $headermagic != 0xfeedfacf + printf "[Error] Target address doesn't contain a valid Mach-O binary!\n" + help dumpmacho + end + end + set $headerdumpsize = *($arg0+0x14) + if $headermagic == 0xfeedface + dump memory $arg1 $arg0 ($arg0+0x1c+$headerdumpsize) + end + if $headermagic == 0xfeedfacf + dump memory $arg1 $arg0 ($arg0+0x20+$headerdumpsize) + end +end +document dumpmacho +Syntax: dumpmacho STARTADDRESS FILENAME +| Dump the Mach-O header to a file. +| You need to input the start address (use info shared command to find it). +end + + +define cls + shell clear +end +document cls +Syntax: cls +| Clear screen. +end + + +define search + set $start = (char *) $arg0 + set $end = (char *) $arg1 + set $pattern = (short) $arg2 + set $p = $start + while $p < $end + if (*(short *) $p) == $pattern + printf "pattern 0x%hx found at 0x%x\n", $pattern, $p + end + set $p++ + end +end +document search +Syntax: search +| Search for the given pattern beetween $start and $end address. +end + + +# _________________user tips_________________ +# The 'tips' command is used to provide tutorial-like info to the user +define tips + printf "Tip Topic Commands:\n" + printf "\ttip_display : Automatically display values on each break\n" + printf "\ttip_patch : Patching binaries\n" + printf "\ttip_strip : Dealing with stripped binaries\n" + printf "\ttip_syntax : AT&T vs Intel syntax\n" +end +document tips +Syntax: tips +| Provide a list of tips from users on various topics. +end + + +define tip_patch + printf "\n" + printf " PATCHING MEMORY\n" + printf "Any address can be patched using the 'set' command:\n" + printf "\t`set ADDR = VALUE` \te.g. `set *0x8049D6E = 0x90`\n" + printf "\n" + printf " PATCHING BINARY FILES\n" + printf "Use `set write` in order to patch the target executable\n" + printf "directly, instead of just patching memory\n" + printf "\t`set write on` \t`set write off`\n" + printf "Note that this means any patches to the code or data segments\n" + printf "will be written to the executable file\n" + printf "When either of these commands has been issued,\n" + printf "the file must be reloaded.\n" + printf "\n" +end +document tip_patch +Syntax: tip_patch +| Tips on patching memory and binary files. +end + + +define tip_strip + printf "\n" + printf " STOPPING BINARIES AT ENTRY POINT\n" + printf "Stripped binaries have no symbols, and are therefore tough to\n" + printf "start automatically. To debug a stripped binary, use\n" + printf "\tinfo file\n" + printf "to get the entry point of the file\n" + printf "The first few lines of output will look like this:\n" + printf "\tSymbols from '/tmp/a.out'\n" + printf "\tLocal exec file:\n" + printf "\t `/tmp/a.out', file type elf32-i386.\n" + printf "\t Entry point: 0x80482e0\n" + printf "Use this entry point to set an entry point:\n" + printf "\t`tbreak *0x80482e0`\n" + printf "The breakpoint will delete itself after the program stops as\n" + printf "the entry point\n" + printf "\n" +end +document tip_strip +Syntax: tip_strip +| Tips on dealing with stripped binaries. +end + + +define tip_syntax + printf "\n" + printf "\t INTEL SYNTAX AT&T SYNTAX\n" + printf "\tmnemonic dest, src, imm mnemonic src, dest, imm\n" + printf "\t[base+index*scale+disp] disp(base, index, scale)\n" + printf "\tregister: eax register: %%eax\n" + printf "\timmediate: 0xFF immediate: $0xFF\n" + printf "\tdereference: [addr] dereference: addr(,1)\n" + printf "\tabsolute addr: addr absolute addr: *addr\n" + printf "\tbyte insn: mov byte ptr byte insn: movb\n" + printf "\tword insn: mov word ptr word insn: movw\n" + printf "\tdword insn: mov dword ptr dword insn: movd\n" + printf "\tfar call: call far far call: lcall\n" + printf "\tfar jump: jmp far far jump: ljmp\n" + printf "\n" + printf "Note that order of operands in reversed, and that AT&T syntax\n" + printf "requires that all instructions referencing memory operands \n" + printf "use an operand size suffix (b, w, d, q)\n" + printf "\n" +end +document tip_syntax +Syntax: tip_syntax +| Summary of Intel and AT&T syntax differences. +end + + +define tip_display + printf "\n" + printf "Any expression can be set to automatically be displayed every time\n" + printf "the target stops. The commands for this are:\n" + printf "\t`display expr' : automatically display expression 'expr'\n" + printf "\t`display' : show all displayed expressions\n" + printf "\t`undisplay num' : turn off autodisplay for expression # 'num'\n" + printf "Examples:\n" + printf "\t`display/x *(int *)$esp` : print top of stack\n" + printf "\t`display/x *(int *)($ebp+8)` : print first parameter\n" + printf "\t`display (char *)$esi` : print source string\n" + printf "\t`display (char *)$edi` : print destination string\n" + printf "\n" +end +document tip_display +Syntax: tip_display +| Tips on automatically displaying values when a program stops. +end + +# bunch of semi-useless commands + +# enable and disable shortcuts for stop-on-solib-events fantastic trick! +define enablesolib + set stop-on-solib-events 1 + printf "Stop-on-solib-events is enabled!\n" +end +document enablesolib +Syntax: enablesolib +| Shortcut to enable stop-on-solib-events trick. +end + + +define disablesolib + set stop-on-solib-events 0 + printf "Stop-on-solib-events is disabled!\n" +end +document disablesolib +Syntax: disablesolib +| Shortcut to disable stop-on-solib-events trick. +end + + +# enable commands for different displays +define enabledisasm + set $SHOWDISASM = 1 +end +document enabledisasm +Syntax: enabledisasm +| Enable disassembly display. +end + +define enableobjectivec + set $SHOWOBJECTIVEC = 1 +end +document enableobjectivec +Syntax: enableobjectivec +| Enable display of objective-c information in the context window. +end + + +define enablecpuregisters + set $SHOWCPUREGISTERS = 1 +end +document enablecpuregisters +Syntax: enablecpuregisters +| Enable display of cpu registers in the context window. +end + + +define enablestack + set $SHOWSTACK = 1 +end +document enablestack +Syntax: enablestack +| Enable display of stack in the context window. +end + + +define enabledatawin + set $SHOWDATAWIN = 1 +end +document enabledatawin +Syntax: enabledatawin +| Enable display of data window in the context window. +end + + +# disable commands for different displays +define disabledisasm + set $SHOWDISASM = 0 +end +document disabledisasm +Syntax: disabledisasm +| Disable disassembly display. +end + +define disableobjectivec + set $SHOWOBJECTIVEC = 0 +end +document disableobjectivec +Syntax: disableobjectivec +| Disable display of objective-c information in the context window. +end + + +define disablecpuregisters + set $SHOWCPUREGISTERS = 0 +end +document disablecpuregisters +Syntax: disablecpuregisters +| Disable display of cpu registers in the context window. +end + + +define disablestack + set $SHOWSTACK = 0 +end +document disablestack +Syntax: disablestack +| Disable display of stack information in the context window. +end + + +define disabledatawin + set $SHOWDATAWIN = 0 +end +document disabledatawin +Syntax: disabledatawin +| Disable display of data window in the context window. +end + + +define arm + if $ARMOPCODES == 1 + set arm show-opcode-bytes 1 + end + set $ARM = 1 +end +document arm +Syntax: arm +| Set gdb to work with ARM binaries. +end + +define ioskdp + set $SHOW_CONTEXT = 0 + set $SHOW_NEST_INSN = 0 +end +document ioskdp +Syntax: ioskdp +| Disable dumping context information for iOS KDP debugging +end + +define intelsyntax + if $ARM == 0 + set disassembly-flavor intel + set $X86FLAVOR = 0 + end +end +document intelsyntax +Syntax: intelsyntax +| Change disassembly syntax to intel flavor. +end + + +define attsyntax + if $ARM == 0 + set disassembly-flavor att + set $X86FLAVOR = 1 + end +end +document attsyntax +Syntax: attsyntax +| Change disassembly syntax to at&t flavor. +end + +define kernel32 + if $argc != 0 + # try to load kgmacros files + # failure is silent if non-existent... + source $arg0 + set architecture i386 + if $argc == 2 + target remote localhost:$arg1 + else + target remote localhost:8832 + end + else + help kernel32 + end +end +document kernel32 +Syntax: kernel32 PATH_TO_KGMACROS +| Attach to VMware gdb stub for 32 bits kernel. +| The path to kgmacros must be supplied as first parameter. +| If you don't want to load kgmacros just put something as the first parameter. +| Optional parameter is the port to connect to, in case you are not using the default 8832 +| or want to kernel debug more than one active virtual machine. +| By supplying a bogus kgmacros this command should be compatible with any OS. +end + +define kernel64 + if $argc != 0 + # try to load kgmacros files + # failure is silent if non-existent... + source $arg0 + set architecture i386:x86-64 + if $argc == 2 + target remote localhost:$arg1 + else + target remote localhost:8864 + end + else + help kernel64 + end +end +document kernel64 +Syntax: kernel64 PATH_TO_KGMACROS +| Attach to VMware gdb stub for 64 bits kernel. +| The path to kgmacros must be supplied as first parameter. +| If you don't want to load kgmacros just put something as the first parameter. +| Optional parameter is the port to connect to, in case you are not using the default 8864 +| or want to kernel debug more than one active virtual machine. +| By supplying a bogus kgmacros this command should be compatible with any OS. +end + +define 32bits + set $KDP64BITS = 0 + set $64BITS = 0 +end + +define 64bits + set $KDP64BITS = 1 + set $64BITS = 1 +end + +define resetkdp + set $KDP64BITS = -1 +end + +define header + if $argc != 1 + help header + else + dump memory /tmp/gdbinit_header_dump $arg0 $arg0 + 4096 + shell /usr/bin/otool -h /tmp/gdbinit_header_dump + shell /bin/rm -f /tmp/gdbinit_header_dump + end +end +document header +Syntax: header MACHO_HEADER_START_ADDRESS +| Dump the Mach-O header located at given address +end + +define loadcmds + if $argc != 1 + help loadcmds + else + # this size should be good enough for most binaries + dump memory /tmp/gdbinit_header_dump $arg0 $arg0 + 4096 * 10 + shell /usr/bin/otool -l /tmp/gdbinit_header_dump + shell /bin/rm -f /tmp/gdbinit_header_dump + end +end +document loadcmds +Syntax: loadcmds MACHO_HEADER_START_ADDRESS +| Dump the Mach-O load commands +end + +# defining it here doesn't get the space #$#$%"#! +define disablecolorprompt + set prompt gdb$ +end +document disablecolorprompt +| Remove color from prompt +end + +define enablecolorprompt + set prompt \033[31mgdb$ \033[0m +end +document enablecolorprompt +| Enable color prompt +end + +#EOF + +# Older change logs: +# Version 8.0.6 (05/09/2013) +# - Add patch command to convert bytes to little-endian and patch memory +# +# Version 8.0.5 (18/08/2013) +# - Add commands header and loadcmds to dump Mach-O header information +# - Other fixes and additions from previous commits +# +# Version 8.0.4 (08/05/2013) +# - Detect automatically 32 or 64 bits archs using sizeof(void*). +# Thanks to Tyilo for the simple but very effective idea! +# - Typo in hexdump command also fixed by vuquangtrong. +# - Add shortcuts to attach to VMware kernel debugging gdb stub (kernel32 and kernel64) +# +# Version 8.0.3 (21/03/2013) +# - Add option to colorize or not output (thanks to argp and skier for the request and ideas!) +# - Convert the escape codes into functions so colors can be easily customized +# - Other enhancements available at git commit logs +# Thanks to Plouj, argp, xristos for their ideas and fixes! +# +# Version 8.0.2 (31/07/2012) +# - Merge pull request from mheistermann to support local modifications in a .gdbinit.local file +# - Add a missing opcode to the stepo command +# +# Version 8.0.1 (23/04/2012) +# - Small bug fix to the attsyntax and intelsyntax commands (changing X86 flavor variable was missing) +# +# Version 8.0 (13/04/2012) +# - Merged x86/x64 and ARM versions +# - Added commands intelsyntax and attsyntax to switch between x86 disassembly flavors +# - Added new configuration variables ARM, ARMOPCODES, and X86FLAVOR +# - Code cleanups and fixes to the indentation +# - Bug fixes to some ARM related code +# - Added the dumpmacho command to memory dump the mach-o header to a file +# +# Version 7.4.4 (02/01/2012) +# - Added the "skip" command. This will jump to the next instruction after EIP/RIP without executing the current one. +# Thanks to @bSr43 for the tip to retrieve the current instruction size. +# +# Version 7.4.3 (04/11/2011) +# - Modified "hexdump" command to support a variable number of lines (optional parameter) +# - Removed restrictions on type of addresses in the "dd" command - Thanks to Plouj for the warning :-) +# I don't know what was the original thinking behind those :-) +# - Modified the assemble command to support 64bits - You will need to recompile nasm since the version shipped with OS X doesn't supports 64bits (www.nasm.us). +# Assumes that the new binary is installed at /usr/local/bin - modify the variable at the top if you need so. +# It will assemble based on the target arch being debugged. If you want to use gdb for a quick asm just use the 32bits or 64bits commands to set your target. +# Thanks to snare for the warning and original patch :-) +# - Added "asm" command - it's a shortcut to the "assemble" command. +# - Added configuration variable for colorized prompt. Plouj reported some issues with Ubuntu's gdb 7.2 if prompt is colorized. +# +# Version 7.4.2 (11/08/2011) +# Small fix to a weird bug happening on FreeBSD 8.2. It doesn't like a "if(" instruction, needs to be "if (". Weird! +# Many thanks to Evan for reporting and sending the patch :-) +# Added the ptraceme/rptraceme commands to bypass PTRACE_TRACME anti-debugging technique. +# Grabbed this from http://falken.tuxfamily.org/?p=171 +# It's commented out due to a gdb problem in OS X (refer to http://reverse.put.as/2011/08/20/another-patch-for-apples-gdb-the-definecommands-problem/ ) +# Just uncomment it if you want to use in ptrace enabled systems. +# +# Version 7.4.1 (21/06/2011) - fG! +# Added patch sent by sbz, more than 1 year ago, which I forgot to add :-/ +# This will allow to search for a given pattern between start and end address. +# On sbz words: "It's usefull to find call, ret or everything like that." :-) +# New command is "search" +# +# Version 7.4 (20/06/2011) - fG! +# When registers change between instructions the color will change to red (like it happens in OllyDBG) +# This is the default behavior, if you don't like it, modify the variable SHOWREGCHANGES +# Added patch sent by Philippe Langlois +# color the first disassembly line - change the setting below on SETCOLOR1STLINE - by default it's disabled +# +# Version 7.3.2 (21/02/2011) - fG! +# Added the command rint3 and modified the int3 command. The new command will restore the byte in previous int3 patch. +# +# Version 7.3.1 (29/06/2010) - fG! +# Added enablelib/disablelib command to quickly set the stop-on-solib-events trick +# Implemented the stepoh command equivalent to the stepo but using hardware breakpoints +# More fixes to stepo +# +# Version 7.3 (16/04/2010) - fG! +# Support for 64bits targets. Default is 32bits, you should modify the variable or use the 32bits or 64bits to choose the mode. +# I couldn't find another way to recognize the type of binary… Testing the register doesn't work that well. +# TODO: fix objectivec messages and stepo for 64bits +# Version 7.2.1 (24/11/2009) - fG! +# Another fix to stepo (0xFF92 missing) +# +# Version 7.2 (11/10/2009) - fG! +# Added the smallregisters function to create 16 and 8 bit versions from the registers EAX, EBX, ECX, EDX +# Revised and fixed all the dumpjump stuff, following Intel manuals. There were some errors (thx to rev who pointed the jle problem). +# Small fix to stepo command (missed a few call types) +# +# Version 7.1.7 - fG! +# Added the possibility to modify what's displayed with the context window. You can change default options at the gdb options part. For example, kernel debugging is much slower if the stack display is enabled... +# New commands enableobjectivec, enablecpuregisters, enablestack, enabledatawin and their disable equivalents (to support realtime change of default options) +# Fixed problem with the assemble command. I was calling /bin/echo which doesn't support the -e option ! DUH ! Should have used bash internal version. +# Small fixes to colors... +# New commands enablesolib and disablesolib . Just shortcuts for the stop-on-solib-events fantastic trick ! Hey... I'm lazy ;) +# Fixed this: Possible removal of "u" command, info udot is missing in gdb 6.8-debian . Doesn't exist on OS X so bye bye !!! +# Displays affected flags in jump decisions +# +# Version 7.1.6 - fG! +# Added modified assemble command from Tavis Ormandy (further modified to work with Mac OS X) (shell commands used use full path name, working for Leopard, modify for others if necessary) +# Renamed thread command to threads because thread is an internal gdb command that allows to move between program threads +# +# Version 7.1.5 (04/01/2009) - fG! +# Fixed crash on Leopard ! There was a If Else condition where the else had no code and that made gdb crash on Leopard (CRAZY!!!!) +# Better code indention +# +# Version 7.1.4 (02/01/2009) - fG! +# Bug in show objective c messages with Leopard ??? +# Nop routine support for single address or range (contribution from gln [ghalen at hack.se]) +# Used the same code from nop to null routine +# +# Version 7.1.3 (31/12/2008) - fG! +# Added a new command 'stepo'. This command will step a temporary breakpoint on next instruction after the call, so you can skip over +# the call. Did this because normal commands not always skip over (mainly with objc_msgSend) +# +# Version 7.1.2 (31/12/2008) - fG! +# Support for the jump decision (will display if a conditional jump will be taken or not) +# +# Version 7.1.1 (29/12/2008) - fG! +# Moved gdb options to the beginning (makes more sense) +# Added support to dump message being sent to msgSend (easier to understand what's going on) +# +# Version 7.1 +# Fixed serious (and old) bug in dd and datawin, causing dereference of +# obviously invalid address. See below: +# gdb$ dd 0xffffffff +# FFFFFFFF : Cannot access memory at address 0xffffffff +# +# Version 7.0 +# Added cls command. +# Improved documentation of many commands. +# Removed bp_alloc, was neither portable nor usefull. +# Checking of passed argument(s) in these commands: +# contextsize-stack, contextsize-data, contextsize-code +# bp, bpc, bpe, bpd, bpt, bpm, bhb,... +# Fixed bp and bhb inconsistencies, look at * signs in Version 6.2 +# Bugfix in bhb command, changed "break" to "hb" command body +# Removed $SHOW_CONTEXT=1 from several commands, this variable +# should only be controlled globally with context-on and context-off +# Improved stack, func, var and sig, dis, n, go,... +# they take optional argument(s) now +# Fixed wrong $SHOW_CONTEXT assignment in context-off +# Fixed serious bug in cft command, forgotten ~ sign +# Fixed these bugs in step_to_call: +# 1) the correct logging sequence is: +# set logging file > set logging redirect > set logging on +# 2) $SHOW_CONTEXT is now correctly restored from $_saved_ctx +# Fixed these bugs in trace_calls: +# 1) the correct logging sequence is: +# set logging file > set logging overwrite > +# set logging redirect > set logging on +# 2) removed the "clean up trace file" part, which is not needed now, +# stepi output is properly redirected to /dev/null +# 3) $SHOW_CONTEXT is now correctly restored from $_saved_ctx +# Fixed bug in trace_run: +# 1) $SHOW_CONTEXT is now correctly restored from $_saved_ctx +# Fixed print_insn_type -- removed invalid semicolons!, wrong value checking, +# Added TODO entry regarding the "u" command +# Changed name from gas_assemble to assemble_gas due to consistency +# Output from assemble and assemble_gas is now similar, because i made +# both of them to use objdump, with respect to output format (AT&T|Intel). +# Whole code was checked and made more consistent, readable/maintainable. +# +# Version 6.2 +# Add global variables to allow user to control stack, data and code window sizes +# Increase readability for registers +# Some corrections (hexdump, ddump, context, cfp, assemble, gas_asm, tips, prompt) +# +# Version 6.1-color-user +# Took the Gentoo route and ran sed s/user/user/g +# +# Version 6.1-color +# Added color fixes from +# http://gnurbs.blogsome.com/2006/12/22/colorizing-mamons-gdbinit/ +# +# Version 6.1 +# Fixed filename in step_to_call so it points to /dev/null +# Changed location of logfiles from /tmp to ~ +# +# Version 6 +# Added print_insn_type, get_insn_type, context-on, context-off commands +# Added trace_calls, trace_run, step_to_call commands +# Changed hook-stop so it checks $SHOW_CONTEXT variable +# +# Version 5 +# Added bpm, dump_bin, dump_hex, bp_alloc commands +# Added 'assemble' by elaine, 'gas_asm' by mong +# Added Tip Topics for aspiring users ;) +# +# Version 4 +# Added eflags-changing insns by pusillus +# Added bp, nop, null, and int3 patch commands, also hook-stop +# +# Version 3 +# Incorporated elaine's if/else goodness into the hex/ascii dump +# +# Version 2 +# Radix bugfix by elaine \ No newline at end of file diff --git a/tools/grub.cfg b/tools/grub.cfg new file mode 100644 index 000000000..0dd855df6 --- /dev/null +++ b/tools/grub.cfg @@ -0,0 +1,5 @@ +set timeout=15 +set default=0 +menuentry "SimpleKernel" { + multiboot2 /boot/kernel.elf "KERNEL_ELF" +} diff --git a/tools/grub4mac.sh b/tools/grub4mac.sh new file mode 100644 index 000000000..58a983491 --- /dev/null +++ b/tools/grub4mac.sh @@ -0,0 +1,40 @@ + +# This file is a part of SimpleXX/SimpleKernel (https://github.com/SimpleXX/SimpleKernel). +# +# grub4mac.sh for SimpleXX/SimpleKernel. + +#!/bin/bash + +# set -x +set -e + +wget https://ftp.gnu.org/gnu/grub/grub-2.04.tar.xz +tar zxvf grub-2.04.tar.xz +cd grub-2.04 +if ! [ -x "$(command -v autoconf)" ]; then + echo 'Error: autoconf is not installed.' + echo 'Install autoconf...' + brew install autoconf +fi +if ! [ -x "$(command -v automake)" ]; then + echo 'Error: automake is not installed.' + echo 'Install automake...' + brew install automake +fi +./autogen.sh +mkdir -p build +cd build +../configure \ + --target=x86_64-elf \ + --prefix=$(pwd)/grub \ + --disable-werror \ + TARGET_CC=x86_64-elf-gcc \ + TARGET_OBJCOPY=x86_64-elf-objcopy \ + TARGET_STRIP=x86_64-elf-strip \ + TARGET_NM=x86_64-elf-nm \ + TARGET_RANLIB=x86_64-elf-ranlib + +sed -i "" "s/FILE_TYPE_NO_DECOMPRESS/GRUB_FILE_TYPE_NO_DECOMPRESS/g" $(pwd)/../grub-core/osdep/generic/blocklist.c + +make +make install diff --git a/tools/i386-elf-binutils.sh b/tools/i386-elf-binutils.sh deleted file mode 100644 index 2def71db8..000000000 --- a/tools/i386-elf-binutils.sh +++ /dev/null @@ -1,25 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# i386-elf-binutils.sh for MRNIU/SimpleKernel. - -#!/usr/bin/env bash - -if ! [ -x "$(command -v wget)" ]; then - echo 'Error: wget is not installed.' - exit 1 -elif ! [ -x "$(command -v tar)" ]; then - echo 'Error: tar is not installed.' - exit 1 -else - wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.1.tar.xz - tar xvJf binutils-2.31.1.tar.xz - cd binutils-2.31.1 - ./configure \ - --target=i386-elf \ - --disable-multilib \ - --disable-nls \ - --disable-werror - make - make install -fi diff --git a/tools/i386-elf-gcc.sh b/tools/i386-elf-gcc.sh deleted file mode 100644 index 8ee109765..000000000 --- a/tools/i386-elf-gcc.sh +++ /dev/null @@ -1,44 +0,0 @@ - -# This file is a part of MRNIU/SimpleKernel (https://github.com/MRNIU/SimpleKernel). - -# i386-elf-gcc.sh for MRNIU/SimpleKernel. - -#!/usr/bin/env bash - -if ! [ -x "$(command -v gmp)" ]; then - echo 'Error: gmp is not installed.' - exit 1 -elif ! [ -x "$(command -v i386-elf-binutils)" ]; then - echo 'Error: i386-elf-binutils is not installed.' - exit 1 -elif ! [ -x "$(command -v libmpc)" ]; then - echo 'Error: libmpc is not installed.' - exit 1 -elif ! [ -x "$(command -v mpfr)" ]; then - echo 'Error: mpfr is not installed.' - exit 1 -elif ! [ -x "$(command -v wget)" ]; then - echo 'Error: wget is not installed.' - exit 1 -elif ! [ -x "$(command -v tar)" ]; then - echo 'Error: tar is not installed.' - exit 1 -else - wget https://mirrors.nju.edu.cn/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.xz - tar zxvf gcc-8.2.0.tar.xz - cd gcc-8.2.0 - ./configure \ - --target=i386-elf \ - --without-isl \ - --disable-multilib \ - --disable-nls \ - --disable-werror \ - --without-headers \ - --with-as=i386-elf-as \ - --with-ld=i386-elf-ld \ - --enable-languages=c,c++ - make all-gcc - make install-gcc - make all-target-libgcc - make install-target-libgcc -fi diff --git a/tools/install.sh b/tools/install.sh new file mode 100644 index 000000000..e45b4fb51 --- /dev/null +++ b/tools/install.sh @@ -0,0 +1,186 @@ +#!/bin/bash + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# run.sh for Simple-XX/SimpleKernel. +# 在虚拟机中运行内核 + +# shell 执行出错时终止运行 +set -e +# 输出实际执行内容 +# set -x + +# 命令行使用方式 +help() { + echo "Usage:" + echo "run.sh [-t target arch] [-s simulator]" + echo "Description:" + echo "-t, 'riscv64', 'i386', 'x86_64', 'arm', 'aarch64'. riscv64 as default" + echo "-s, 'qemu'" + exit 1 +} + +# 如果没有传入参数或参数过多则退出 +if [ $# == 0 ] || [ $# -gt 4 ]; then + help + exit 1 +fi + +# 解析参数 +while getopts 't:s:h' opt; do + case $opt in + t) + TARGET="$OPTARG" + ;; + s) + SIMULATOR="$OPTARG" + ;; + h) + help + ;; + ?) + echo "missing options,pls check!" + exit 1 + ;; + esac +done + +# 如果没有确定必要参数则报错 +# 参数不为空 +if [ -z "$TARGET" ] || [ -z "$SIMULATOR" ]; then + help + exit 1 +fi + +# 判断是否合法 +# 目标架构 +targets=( +riscv64 +i386 +x86_64 +arm +aarch64 +) +if [[ ! "${targets[*]}" =~ $TARGET ]]; then + echo "$TARGET not exists" + help + exit 1 +fi +# 模拟器 +simulators=( +qemu +) +if [[ ! "${simulators[*]}" =~ $SIMULATOR ]]; then + echo "$SIMULATOR not exists" + help + exit 1 +fi + +# 宿主机器架构 +HOST_ARCH=$(uname -m) +# 宿主机器系统 +HOST_SYSTEM=$(uname -s) + +# 输出信息 +echo "host arch: $HOST_ARCH" +echo "host system: $HOST_SYSTEM" +echo "target arch: $TARGET" +echo "target simulator: $SIMULATOR" + +# 根据参数与机器信息确认依赖 +# 宿主机器为 x86_64 +if [ "${HOST_ARCH}" == "x86_64" ]; then + # 宿主机器为 linux + if [ "${HOST_SYSTEM}" == "Linux" ]; then + # target 为 riscv64 + if [ "${TARGET}" == "riscv64" ]; then + echo 1 + # target 为 arm/aarch64 + elif [ "${TARGET}" == "arm" ] || [ "${TARGET}" == "aarch64" ]; then + echo 1 + # target 为 i386/x86_64 + elif [ "${TARGET}" == "i386" ] || [ "${TARGET}" == "x86_64" ]; then + echo 1 + fi + # 宿主机器为 macos + elif [ "${HOST_SYSTEM}" == "Darwin" ]; then + # target 为 riscv64 + if [ "${TARGET}" == "riscv64" ]; then + echo 1 + # target 为 arm/aarch64 + elif [ "${TARGET}" == "arm" ] || [ "${TARGET}" == "aarch64" ]; then + echo 1 + # target 为 i386/x86_64 + elif [ "${TARGET}" == "i386" ] || [ "${TARGET}" == "x86_64" ]; then + echo 1 + fi + fi +# 宿主机器为 arm64 +elif [ "${HOST_ARCH}" == "arm64" ]; then + # 宿主机器为 linux + if [ "${HOST_SYSTEM}" == "Linux" ]; then + # target 为 riscv64 + if [ "${TARGET}" == "riscv64" ]; then + echo 1 + # target 为 arm/aarch64 + elif [ "${TARGET}" == "arm" ] || [ "${TARGET}" == "aarch64" ]; then + echo 1 + # target 为 i386/x86_64 + elif [ "${TARGET}" == "i386" ] || [ "${TARGET}" == "x86_64" ]; then + echo 1 + fi + # 宿主机器为 macos + elif [ "${HOST_SYSTEM}" == "Darwin" ]; then + # 安装通用依赖 + # make + if ! command -v make &> /dev/null; then + echo "make could not found." + echo "Installing make..." + # 安装 make + brew install make + echo "make installed." + fi + # cmake + if ! command -v cmake &> /dev/null; then + echo "cmake could not found." + echo "Installing cmake..." + # 安装 cmake + brew install cmake + echo "cmake installed." + fi + # qemu + if ! command -v qemu-system-riscv64 &> /dev/null; then + echo "qemu could not found." + echo "Installing qemu..." + # 安装 qemu + brew install qemu + echo "qemu installed." + fi + # target 为 riscv64 + if [ "${TARGET}" == "riscv64" ]; then + # riscv64-unknown-elf-gcc + if ! command -v riscv64-unknown-elf-gcc &> /dev/null; then + echo "riscv64-unknown-elf-gcc could not found." + echo "Installing riscv64-unknown-elf-gcc..." + # 安装 riscv64-unknown-elf-gcc + brew tap riscv-software-src/riscv + brew install riscv-software-src/riscv/riscv-gnu-toolchain + echo "riscv64-unknown-elf-gcc installed." + fi + # target 为 arm/aarch64 + elif [ "${TARGET}" == "arm" ] || [ "${TARGET}" == "aarch64" ]; then + echo 1 + # target 为 i386/x86_64 + elif [ "${TARGET}" == "i386" ] || [ "${TARGET}" == "x86_64" ]; then + # x86_64-elf-gcc + if ! command -v x86_64-elf-gcc &> /dev/null; then + echo "x86_64-elf-gcc could not found." + echo "Installing x86_64-elf-gcc..." + # 安装 x86_64-elf-gcc + brew install x86_64-elf-gcc + echo "x86_64-elf-gcc installed." + fi + fi + fi +fi diff --git a/tools/mkfatfs.sh b/tools/mkfatfs.sh new file mode 100644 index 000000000..c336aaae3 --- /dev/null +++ b/tools/mkfatfs.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# This file is a part of Simple-XX/SimpleKernel +# (https://github.com/Simple-XX/SimpleKernel). +# +# mkfatfs.sh for Simple-XX/SimpleKernel. + +# 制作 fatfs 镜像 + +# dst = /mnt space aside "=" is wrong!!! +dst=/mnt +# echo $dst +dd if=/dev/zero of=fatfs.img bs=512k count=96 +# echo $dst +mkfs.vfat -F 32 fatfs.img +# echo $dst +sudo mount fatfs.img $dst +# echo $dst +# echo hi +cd $dst +sudo mkdir dir1 +# pwd +sudo mkdir dir2 +sudo mkdir dir3 +sudo dash -c "echo hello world > file1" +cd dir1 +sudo mkdir dir4 +sudo sh -c "echo hi my bro! > file2" +cd dir4 +sudo sh -c "echo yes my girl! > file3" +cd / +sudo umount $dst diff --git a/tools/opensbi/.clang-format b/tools/opensbi/.clang-format new file mode 100644 index 000000000..c80c0aa98 --- /dev/null +++ b/tools/opensbi/.clang-format @@ -0,0 +1,16 @@ +AlignConsecutiveAssignments: true +AlignEscapedNewlines: Left +AlignTrailingComments: true +AllowShortFunctionsOnASingleLine: None +BraceWrapping: + AfterFunction: true +BreakBeforeBraces: Custom +BreakStringLiterals: false +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +IndentWidth: 8 +ReflowComments: false +SortIncludes: false +SpacesInContainerLiterals: false +TabWidth: 8 +UseTab: Always diff --git a/tools/opensbi/.gitignore b/tools/opensbi/.gitignore new file mode 100644 index 000000000..c11afd384 --- /dev/null +++ b/tools/opensbi/.gitignore @@ -0,0 +1,13 @@ +# Object files +*.o +*.a +*.dep + +#Build & install directories +build/ +install/ + +# Development friendly files +tags +cscope* +*.swp diff --git a/tools/opensbi/CONTRIBUTORS.md b/tools/opensbi/CONTRIBUTORS.md new file mode 100644 index 000000000..afae1251d --- /dev/null +++ b/tools/opensbi/CONTRIBUTORS.md @@ -0,0 +1,27 @@ + +List of OpenSBI Contributors (Alphabetically sorted) +==================================================== + +* **[Western Digital Corporation](https://www.wdc.com/)** + * Project initiator and maintainer + * Copyright (c) 2019 Western Digital Corporation or its affiliates + +* Alistair Francis + +* Andreas Schwab + +* Anup Patel + +* Atish Patra + +* Bin Meng + +* Damien Le Moal + +* Karsten Merker + +* Nick Kossifidis + +* Shawn Chang + +* Xiang Wang diff --git a/tools/opensbi/COPYING.BSD b/tools/opensbi/COPYING.BSD new file mode 100644 index 000000000..26972c8a4 --- /dev/null +++ b/tools/opensbi/COPYING.BSD @@ -0,0 +1,25 @@ +The 2-Clause BSD License +SPDX short identifier: BSD-2-Clause + +Copyright (c) 2019 Western Digital Corporation or its affiliates and other +contributors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tools/opensbi/Kconfig b/tools/opensbi/Kconfig new file mode 100644 index 000000000..acfc13888 --- /dev/null +++ b/tools/opensbi/Kconfig @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: BSD-2-Clause + +mainmenu "OpenSBI $(OPENSBI_PLATFORM) Configuration" + +config OPENSBI_SRC_DIR + string + option env="OPENSBI_SRC_DIR" + +config OPENSBI_PLATFORM + string + option env="OPENSBI_PLATFORM" + +config OPENSBI_PLATFORM_SRC_DIR + string + option env="OPENSBI_PLATFORM_SRC_DIR" + +menu "Platform Options" +source "$(OPENSBI_PLATFORM_SRC_DIR)/Kconfig" +endmenu + +source "$(OPENSBI_SRC_DIR)/lib/sbi/Kconfig" + +source "$(OPENSBI_SRC_DIR)/lib/utils/Kconfig" + +source "$(OPENSBI_SRC_DIR)/firmware/Kconfig" diff --git a/tools/opensbi/Makefile b/tools/opensbi/Makefile new file mode 100644 index 000000000..92203c5a2 --- /dev/null +++ b/tools/opensbi/Makefile @@ -0,0 +1,677 @@ +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2019 Western Digital Corporation or its affiliates. +# +# Authors: +# Anup Patel +# + +# Select Make Options: +# o Do not use make's built-in rules +# o Do not print "Entering directory ..."; +MAKEFLAGS += -r --no-print-directory + +# Readlink -f requires GNU readlink +ifeq ($(shell uname -s),Darwin) +READLINK ?= greadlink +else +READLINK ?= readlink +endif + +# Find out source, build, and install directories +src_dir=$(CURDIR) +ifdef O + build_dir=$(shell $(READLINK) -f $(O)) +else + build_dir=$(CURDIR)/build +endif +ifeq ($(build_dir),$(CURDIR)) +$(error Build directory is same as source directory.) +endif +install_root_dir_default=$(CURDIR)/install +ifdef I + install_root_dir=$(shell $(READLINK) -f $(I)) +else + install_root_dir=$(install_root_dir_default)/usr +endif +ifeq ($(install_root_dir),$(CURDIR)) +$(error Install root directory is same as source directory.) +endif +ifeq ($(install_root_dir),$(build_dir)) +$(error Install root directory is same as build directory.) +endif +ifdef PLATFORM_DIR + platform_dir_path=$(shell $(READLINK) -f $(PLATFORM_DIR)) + ifdef PLATFORM + platform_parent_dir=$(platform_dir_path) + else + PLATFORM=$(shell basename $(platform_dir_path)) + platform_parent_dir=$(shell realpath ${platform_dir_path}/..) + endif +else + platform_parent_dir=$(src_dir)/platform +endif +ifndef PLATFORM_DEFCONFIG +PLATFORM_DEFCONFIG=defconfig +endif + +# Check if verbosity is ON for build process +CMD_PREFIX_DEFAULT := @ +ifeq ($(V), 1) + CMD_PREFIX := +else + CMD_PREFIX := $(CMD_PREFIX_DEFAULT) +endif + +# Setup path of directories +export platform_subdir=$(PLATFORM) +export platform_src_dir=$(platform_parent_dir)/$(platform_subdir) +export platform_build_dir=$(build_dir)/platform/$(platform_subdir) +export include_dir=$(CURDIR)/include +export libsbi_dir=$(CURDIR)/lib/sbi +export libsbiutils_dir=$(CURDIR)/lib/utils +export firmware_dir=$(CURDIR)/firmware + +# Setup variables for kconfig +ifdef PLATFORM +export PYTHONDONTWRITEBYTECODE=1 +export KCONFIG_DIR=$(platform_build_dir)/kconfig +export KCONFIG_AUTOLIST=$(KCONFIG_DIR)/auto.list +export KCONFIG_AUTOHEADER=$(KCONFIG_DIR)/autoconf.h +export KCONFIG_AUTOCMD=$(KCONFIG_DIR)/auto.conf.cmd +export KCONFIG_CONFIG=$(KCONFIG_DIR)/.config +# Additional exports for include paths in Kconfig files +export OPENSBI_SRC_DIR=$(src_dir) +export OPENSBI_PLATFORM=$(PLATFORM) +export OPENSBI_PLATFORM_SRC_DIR=$(platform_src_dir) +endif + +# Find library version +OPENSBI_VERSION_MAJOR=`grep "define OPENSBI_VERSION_MAJOR" $(include_dir)/sbi/sbi_version.h | sed 's/.*MAJOR.*\([0-9][0-9]*\)/\1/'` +OPENSBI_VERSION_MINOR=`grep "define OPENSBI_VERSION_MINOR" $(include_dir)/sbi/sbi_version.h | sed 's/.*MINOR.*\([0-9][0-9]*\)/\1/'` +OPENSBI_VERSION_GIT=$(shell if [ -d $(src_dir)/.git ]; then git describe 2> /dev/null; fi) + +# Setup compilation commands +ifneq ($(LLVM),) +CC = clang +AR = llvm-ar +LD = ld.lld +OBJCOPY = llvm-objcopy +else +ifdef CROSS_COMPILE +CC = $(CROSS_COMPILE)gcc +AR = $(CROSS_COMPILE)ar +LD = $(CROSS_COMPILE)ld +OBJCOPY = $(CROSS_COMPILE)objcopy +else +CC ?= gcc +AR ?= ar +LD ?= ld +OBJCOPY ?= objcopy +endif +endif +CPP = $(CC) -E +AS = $(CC) +DTC = dtc + +ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),) +CC_IS_CLANG = y +else +CC_IS_CLANG = n +endif + +ifneq ($(shell $(LD) --version 2>&1 | head -n 1 | grep LLD),) +LD_IS_LLD = y +else +LD_IS_LLD = n +endif + +ifeq ($(CC_IS_CLANG),y) +ifneq ($(CROSS_COMPILE),) +CLANG_TARGET = --target=$(notdir $(CROSS_COMPILE:%-=%)) +endif +endif + +# Guess the compiler's XLEN +OPENSBI_CC_XLEN := $(shell TMP=`$(CC) $(CLANG_TARGET) -dumpmachine | sed 's/riscv\([0-9][0-9]\).*/\1/'`; echo $${TMP}) + +# Guess the compiler's ABI and ISA +ifneq ($(CC_IS_CLANG),y) +OPENSBI_CC_ABI := $(shell TMP=`$(CC) -v 2>&1 | sed -n 's/.*\(with\-abi=\([a-zA-Z0-9]*\)\).*/\2/p'`; echo $${TMP}) +OPENSBI_CC_ISA := $(shell TMP=`$(CC) -v 2>&1 | sed -n 's/.*\(with\-arch=\([a-zA-Z0-9]*\)\).*/\2/p'`; echo $${TMP}) +endif + +# Setup platform XLEN +ifndef PLATFORM_RISCV_XLEN + ifeq ($(OPENSBI_CC_XLEN), 32) + PLATFORM_RISCV_XLEN = 32 + else + PLATFORM_RISCV_XLEN = 64 + endif +endif + +ifeq ($(CC_IS_CLANG),y) +ifeq ($(CROSS_COMPILE),) +CLANG_TARGET = --target=riscv$(PLATFORM_RISCV_XLEN)-unknown-elf +endif +endif + +ifeq ($(LD_IS_LLD),y) +RELAX_FLAG = -mno-relax +USE_LD_FLAG = -fuse-ld=lld +else +USE_LD_FLAG = -fuse-ld=bfd +endif + +# Check whether the linker supports creating PIEs +OPENSBI_LD_PIE := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) $(USE_LD_FLAG) -fPIE -nostdlib -Wl,-pie -x c /dev/null -o /dev/null >/dev/null 2>&1 && echo y || echo n) + +# Check whether the compiler supports -m(no-)save-restore +CC_SUPPORT_SAVE_RESTORE := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib -mno-save-restore -x c /dev/null -o /dev/null 2>&1 | grep "\-save\-restore" >/dev/null && echo n || echo y) + +# Check whether the assembler and the compiler support the Zicsr and Zifencei extensions +CC_SUPPORT_ZICSR_ZIFENCEI := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib -march=rv$(OPENSBI_CC_XLEN)imafd_zicsr_zifencei -x c /dev/null -o /dev/null 2>&1 | grep "zicsr\|zifencei" > /dev/null && echo n || echo y) + +# Build Info: +# OPENSBI_BUILD_TIME_STAMP -- the compilation time stamp +# OPENSBI_BUILD_COMPILER_VERSION -- the compiler version info +BUILD_INFO ?= n +ifeq ($(BUILD_INFO),y) +OPENSBI_BUILD_DATE_FMT = +%Y-%m-%d %H:%M:%S %z +ifdef SOURCE_DATE_EPOCH + OPENSBI_BUILD_TIME_STAMP ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" \ + "$(OPENSBI_BUILD_DATE_FMT)" 2>/dev/null || \ + date -u -r "$(SOURCE_DATE_EPOCH)" \ + "$(OPENSBI_BUILD_DATE_FMT)" 2>/dev/null || \ + date -u "$(OPENSBI_BUILD_DATE_FMT)") +else + OPENSBI_BUILD_TIME_STAMP ?= $(shell date "$(OPENSBI_BUILD_DATE_FMT)") +endif +OPENSBI_BUILD_COMPILER_VERSION=$(shell $(CC) -v 2>&1 | grep ' version ' | \ + sed 's/[[:space:]]*$$//') +endif + +# Setup list of objects.mk files +ifdef PLATFORM +platform-object-mks=$(shell if [ -d $(platform_src_dir)/ ]; then find $(platform_src_dir) -iname "objects.mk" | sort -r; fi) +endif +libsbi-object-mks=$(shell if [ -d $(libsbi_dir) ]; then find $(libsbi_dir) -iname "objects.mk" | sort -r; fi) +libsbiutils-object-mks=$(shell if [ -d $(libsbiutils_dir) ]; then find $(libsbiutils_dir) -iname "objects.mk" | sort -r; fi) +firmware-object-mks=$(shell if [ -d $(firmware_dir) ]; then find $(firmware_dir) -iname "objects.mk" | sort -r; fi) + +# The "make all" rule should always be first rule +.PHONY: all +all: + +# Include platform specific .config +ifdef PLATFORM +.PHONY: menuconfig +menuconfig: $(platform_src_dir)/Kconfig $(src_dir)/Kconfig + $(CMD_PREFIX)mkdir -p $(KCONFIG_DIR) + $(CMD_PREFIX)$(src_dir)/scripts/Kconfiglib/menuconfig.py $(src_dir)/Kconfig + $(CMD_PREFIX)$(src_dir)/scripts/Kconfiglib/genconfig.py --header-path $(KCONFIG_AUTOHEADER) --sync-deps $(KCONFIG_DIR) --file-list $(KCONFIG_AUTOLIST) $(src_dir)/Kconfig + +.PHONY: savedefconfig +savedefconfig: $(platform_src_dir)/Kconfig $(src_dir)/Kconfig + $(CMD_PREFIX)mkdir -p $(KCONFIG_DIR) + $(CMD_PREFIX)$(src_dir)/scripts/Kconfiglib/savedefconfig.py --kconfig $(src_dir)/Kconfig --out $(KCONFIG_DIR)/defconfig + +$(KCONFIG_CONFIG): $(platform_src_dir)/configs/$(PLATFORM_DEFCONFIG) $(platform_src_dir)/Kconfig $(src_dir)/Kconfig + $(CMD_PREFIX)mkdir -p $(KCONFIG_DIR) + $(CMD_PREFIX)$(src_dir)/scripts/Kconfiglib/defconfig.py --kconfig $(src_dir)/Kconfig $(platform_src_dir)/configs/$(PLATFORM_DEFCONFIG) + $(CMD_PREFIX)$(src_dir)/scripts/Kconfiglib/genconfig.py --header-path $(KCONFIG_AUTOHEADER) --sync-deps $(KCONFIG_DIR) --file-list $(KCONFIG_AUTOLIST) $(src_dir)/Kconfig + +$(KCONFIG_AUTOCMD): $(KCONFIG_CONFIG) + $(CMD_PREFIX)mkdir -p $(KCONFIG_DIR) + $(CMD_PREFIX)printf "%s: " $(KCONFIG_CONFIG) > $(KCONFIG_AUTOCMD) + $(CMD_PREFIX)cat $(KCONFIG_AUTOLIST) | tr '\n' ' ' >> $(KCONFIG_AUTOCMD) + +include $(KCONFIG_CONFIG) +include $(KCONFIG_AUTOCMD) +endif + +# Include all objects.mk files +ifdef PLATFORM +include $(platform-object-mks) +endif +include $(libsbi-object-mks) +include $(libsbiutils-object-mks) +include $(firmware-object-mks) + +# Setup list of objects +libsbi-objs-path-y=$(foreach obj,$(libsbi-objs-y),$(build_dir)/lib/sbi/$(obj)) +ifdef PLATFORM +libsbiutils-objs-path-y=$(foreach obj,$(libsbiutils-objs-y),$(platform_build_dir)/lib/utils/$(obj)) +platform-objs-path-y=$(foreach obj,$(platform-objs-y),$(platform_build_dir)/$(obj)) +firmware-bins-path-y=$(foreach bin,$(firmware-bins-y),$(platform_build_dir)/firmware/$(bin)) +endif +firmware-elfs-path-y=$(firmware-bins-path-y:.bin=.elf) +firmware-objs-path-y=$(firmware-bins-path-y:.bin=.o) + +# Setup list of deps files for objects +deps-y=$(platform-objs-path-y:.o=.dep) +deps-y+=$(libsbi-objs-path-y:.o=.dep) +deps-y+=$(libsbiutils-objs-path-y:.o=.dep) +deps-y+=$(firmware-objs-path-y:.o=.dep) + +# Setup platform ABI, ISA and Code Model +ifndef PLATFORM_RISCV_ABI + ifneq ($(PLATFORM_RISCV_TOOLCHAIN_DEFAULT), 1) + ifeq ($(PLATFORM_RISCV_XLEN), 32) + PLATFORM_RISCV_ABI = ilp$(PLATFORM_RISCV_XLEN) + else + PLATFORM_RISCV_ABI = lp$(PLATFORM_RISCV_XLEN) + endif + else + PLATFORM_RISCV_ABI = $(OPENSBI_CC_ABI) + endif +endif +ifndef PLATFORM_RISCV_ISA + ifneq ($(PLATFORM_RISCV_TOOLCHAIN_DEFAULT), 1) + ifeq ($(CC_SUPPORT_ZICSR_ZIFENCEI), y) + PLATFORM_RISCV_ISA = rv$(PLATFORM_RISCV_XLEN)imafdc_zicsr_zifencei + else + PLATFORM_RISCV_ISA = rv$(PLATFORM_RISCV_XLEN)imafdc + endif + else + PLATFORM_RISCV_ISA = $(OPENSBI_CC_ISA) + endif +endif +ifndef PLATFORM_RISCV_CODE_MODEL + PLATFORM_RISCV_CODE_MODEL = medany +endif + +# Setup install directories +ifdef INSTALL_INCLUDE_PATH + install_include_path=$(INSTALL_INCLUDE_PATH) +else + install_include_path=include +endif +ifdef INSTALL_LIB_PATH + install_lib_path=$(INSTALL_LIB_PATH) +else + ifneq ($(origin INSTALL_LIB_SUBDIR), undefined) + install_lib_subdir=$(INSTALL_LIB_SUBDIR) + else + install_lib_subdir=$(PLATFORM_RISCV_ABI) + endif + install_lib_path=lib$(subst 32,,$(PLATFORM_RISCV_XLEN))/$(install_lib_subdir) +endif +ifdef INSTALL_FIRMWARE_PATH + install_firmware_path=$(INSTALL_FIRMWARE_PATH) +else + install_firmware_path=share/opensbi/$(PLATFORM_RISCV_ABI) +endif +ifdef INSTALL_DOCS_PATH + install_docs_path=$(INSTALL_DOCS_PATH) +else + install_docs_path=share/opensbi/docs +endif + +# Setup compilation commands flags +ifeq ($(CC_IS_CLANG),y) +GENFLAGS += $(CLANG_TARGET) +GENFLAGS += -Wno-unused-command-line-argument +endif +GENFLAGS += -I$(platform_src_dir)/include +GENFLAGS += -I$(include_dir) +ifneq ($(OPENSBI_VERSION_GIT),) +GENFLAGS += -DOPENSBI_VERSION_GIT="\"$(OPENSBI_VERSION_GIT)\"" +endif +ifeq ($(BUILD_INFO),y) +GENFLAGS += -DOPENSBI_BUILD_TIME_STAMP="\"$(OPENSBI_BUILD_TIME_STAMP)\"" +GENFLAGS += -DOPENSBI_BUILD_COMPILER_VERSION="\"$(OPENSBI_BUILD_COMPILER_VERSION)\"" +endif +ifdef PLATFORM +GENFLAGS += -include $(KCONFIG_AUTOHEADER) +endif +GENFLAGS += $(libsbiutils-genflags-y) +GENFLAGS += $(platform-genflags-y) +GENFLAGS += $(firmware-genflags-y) + +CFLAGS = -g -Wall -Werror -ffreestanding -nostdlib -fno-stack-protector -fno-strict-aliasing -O2 +CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls -mstrict-align +# enable -m(no-)save-restore option by CC_SUPPORT_SAVE_RESTORE +ifeq ($(CC_SUPPORT_SAVE_RESTORE),y) +CFLAGS += -mno-save-restore +endif +CFLAGS += -mabi=$(PLATFORM_RISCV_ABI) -march=$(PLATFORM_RISCV_ISA) +CFLAGS += -mcmodel=$(PLATFORM_RISCV_CODE_MODEL) +CFLAGS += $(RELAX_FLAG) +CFLAGS += $(GENFLAGS) +CFLAGS += $(platform-cflags-y) +CFLAGS += -fno-pie -no-pie +CFLAGS += $(firmware-cflags-y) + +CPPFLAGS += $(GENFLAGS) +CPPFLAGS += $(platform-cppflags-y) +CPPFLAGS += $(firmware-cppflags-y) + +ASFLAGS = -g -Wall -nostdlib +ASFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls -mstrict-align +# enable -m(no-)save-restore option by CC_SUPPORT_SAVE_RESTORE +ifeq ($(CC_SUPPORT_SAVE_RESTORE),y) +ASFLAGS += -mno-save-restore +endif +ASFLAGS += -mabi=$(PLATFORM_RISCV_ABI) -march=$(PLATFORM_RISCV_ISA) +ASFLAGS += -mcmodel=$(PLATFORM_RISCV_CODE_MODEL) +ASFLAGS += $(RELAX_FLAG) +ifneq ($(CC_IS_CLANG),y) +ifneq ($(RELAX_FLAG),) +ASFLAGS += -Wa,$(RELAX_FLAG) +endif +endif +ASFLAGS += $(GENFLAGS) +ASFLAGS += $(platform-asflags-y) +ASFLAGS += $(firmware-asflags-y) + +ARFLAGS = rcs + +ELFFLAGS += $(USE_LD_FLAG) +ELFFLAGS += -Wl,--build-id=none -Wl,-N +ELFFLAGS += $(platform-ldflags-y) +ELFFLAGS += $(firmware-ldflags-y) + +MERGEFLAGS += -r +ifeq ($(LD_IS_LLD),y) +MERGEFLAGS += -b elf +else +MERGEFLAGS += -b elf$(PLATFORM_RISCV_XLEN)-littleriscv +endif +MERGEFLAGS += -m elf$(PLATFORM_RISCV_XLEN)lriscv + +DTSCPPFLAGS = $(CPPFLAGS) -nostdinc -nostdlib -fno-builtin -D__DTS__ -x assembler-with-cpp + +# Setup functions for compilation +define dynamic_flags +-I$(shell dirname $(2)) -D__OBJNAME__=$(subst -,_,$(shell basename $(1) .o)) +endef +merge_objs = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " MERGE $(subst $(build_dir)/,,$(1))"; \ + $(LD) $(MERGEFLAGS) $(2) -o $(1) +merge_deps = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " MERGE-DEP $(subst $(build_dir)/,,$(1))"; \ + cat $(2) > $(1) +copy_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " COPY $(subst $(build_dir)/,,$(1))"; \ + cp -f $(2) $(1) +inst_file = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " INSTALL $(subst $(install_root_dir)/,,$(1))"; \ + cp -f $(2) $(1) +inst_file_list = $(CMD_PREFIX)if [ ! -z "$(4)" ]; then \ + mkdir -p $(1)/$(3); \ + for file in $(4) ; do \ + rel_file=`echo $$file | sed -e 's@$(2)/$(subst $(install_firmware_path),platform,$(3))@@'`; \ + dest_file=$(1)"/"$(3)"/"`echo $$rel_file`; \ + dest_dir=`dirname $$dest_file`; \ + echo " INSTALL "$(3)"/"`echo $$rel_file`; \ + mkdir -p $$dest_dir; \ + cp -f $$file $$dest_file; \ + done \ + fi +inst_header_dir = $(CMD_PREFIX)mkdir -p $(1); \ + echo " INSTALL $(subst $(install_root_dir)/,,$(1))"; \ + cp -rf $(2) $(1) +compile_cpp = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " CPP $(subst $(build_dir)/,,$(1))"; \ + $(CPP) $(CPPFLAGS) -x c $(2) | grep -v "\#" > $(1) +compile_cc_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " CC-DEP $(subst $(build_dir)/,,$(1))"; \ + printf %s `dirname $(1)`/ > $(1) && \ + $(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) \ + -MM $(2) >> $(1) || rm -f $(1) +compile_cc = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " CC $(subst $(build_dir)/,,$(1))"; \ + $(CC) $(CFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1) +compile_as_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " AS-DEP $(subst $(build_dir)/,,$(1))"; \ + printf %s `dirname $(1)`/ > $(1) && \ + $(AS) $(ASFLAGS) $(call dynamic_flags,$(1),$(2)) \ + -MM $(2) >> $(1) || rm -f $(1) +compile_as = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " AS $(subst $(build_dir)/,,$(1))"; \ + $(AS) $(ASFLAGS) $(call dynamic_flags,$(1),$(2)) -c $(2) -o $(1) +compile_elf = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " ELF $(subst $(build_dir)/,,$(1))"; \ + $(CC) $(CFLAGS) $(3) $(ELFFLAGS) -Wl,-T$(2) -o $(1) +compile_ar = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " AR $(subst $(build_dir)/,,$(1))"; \ + $(AR) $(ARFLAGS) $(1) $(2) +compile_objcopy = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " OBJCOPY $(subst $(build_dir)/,,$(1))"; \ + $(OBJCOPY) -S -O binary $(2) $(1) +compile_dts = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " DTC $(subst $(build_dir)/,,$(1))"; \ + $(CPP) $(DTSCPPFLAGS) $(2) | $(DTC) -O dtb -i `dirname $(2)` -o $(1) +compile_d2c = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " D2C $(subst $(build_dir)/,,$(1))"; \ + $(if $($(2)-varalign-$(3)),$(eval D2C_ALIGN_BYTES := $($(2)-varalign-$(3))),$(eval D2C_ALIGN_BYTES := $(4))) \ + $(if $($(2)-varprefix-$(3)),$(eval D2C_NAME_PREFIX := $($(2)-varprefix-$(3))),$(eval D2C_NAME_PREFIX := $(5))) \ + $(if $($(2)-padding-$(3)),$(eval D2C_PADDING_BYTES := $($(2)-padding-$(3))),$(eval D2C_PADDING_BYTES := 0)) \ + $(src_dir)/scripts/d2c.sh -i $(6) -a $(D2C_ALIGN_BYTES) -p $(D2C_NAME_PREFIX) -t $(D2C_PADDING_BYTES) > $(1) +compile_carray = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " CARRAY $(subst $(build_dir)/,,$(1))"; \ + $(eval CARRAY_VAR_LIST := $(carray-$(subst .c,,$(shell basename $(1)))-y)) \ + $(src_dir)/scripts/carray.sh -i $(2) -l "$(CARRAY_VAR_LIST)" > $(1) +compile_gen_dep = $(CMD_PREFIX)mkdir -p `dirname $(1)`; \ + echo " GEN-DEP $(subst $(build_dir)/,,$(1))"; \ + echo "$(1:.dep=$(2)): $(3)" >> $(1) + +targets-y = $(build_dir)/lib/libsbi.a +ifdef PLATFORM +targets-y += $(platform_build_dir)/lib/libplatsbi.a +endif +targets-y += $(firmware-bins-path-y) + +# The default "make all" rule +.PHONY: all +all: $(targets-y) + +# Preserve all intermediate files +.SECONDARY: + +# Rules for lib/sbi sources +$(build_dir)/lib/libsbi.a: $(libsbi-objs-path-y) + $(call compile_ar,$@,$^) + +$(platform_build_dir)/lib/libplatsbi.a: $(libsbi-objs-path-y) $(libsbiutils-objs-path-y) $(platform-objs-path-y) + $(call compile_ar,$@,$^) + +$(build_dir)/%.dep: $(src_dir)/%.carray $(KCONFIG_CONFIG) + $(call compile_gen_dep,$@,.c,$< $(KCONFIG_CONFIG)) + $(call compile_gen_dep,$@,.o,$(@:.dep=.c)) + +$(build_dir)/%.c: $(src_dir)/%.carray + $(call compile_carray,$@,$<) + +$(build_dir)/%.dep: $(src_dir)/%.c $(KCONFIG_CONFIG) + $(call compile_cc_dep,$@,$<) + +$(build_dir)/%.o: $(src_dir)/%.c + $(call compile_cc,$@,$<) + +$(build_dir)/%.o: $(build_dir)/%.c + $(call compile_cc,$@,$<) + +ifeq ($(BUILD_INFO),y) +$(build_dir)/lib/sbi/sbi_init.o: $(libsbi_dir)/sbi_init.c FORCE + $(call compile_cc,$@,$<) +endif + +$(build_dir)/%.dep: $(src_dir)/%.S $(KCONFIG_CONFIG) + $(call compile_as_dep,$@,$<) + +$(build_dir)/%.o: $(src_dir)/%.S + $(call compile_as,$@,$<) + +# Rules for platform sources +$(platform_build_dir)/%.dep: $(platform_src_dir)/%.carray $(KCONFIG_CONFIG) + $(call compile_gen_dep,$@,.c,$< $(KCONFIG_CONFIG)) + $(call compile_gen_dep,$@,.o,$(@:.dep=.c)) + +$(platform_build_dir)/%.c: $(platform_src_dir)/%.carray + $(call compile_carray,$@,$<) + +$(platform_build_dir)/%.dep: $(platform_src_dir)/%.c $(KCONFIG_CONFIG) + $(call compile_cc_dep,$@,$<) + +$(platform_build_dir)/%.o: $(platform_src_dir)/%.c $(KCONFIG_CONFIG) + $(call compile_cc,$@,$<) + +$(platform_build_dir)/%.dep: $(platform_src_dir)/%.S + $(call compile_as_dep,$@,$<) + +$(platform_build_dir)/%.o: $(platform_src_dir)/%.S + $(call compile_as,$@,$<) + +$(platform_build_dir)/%.dep: $(platform_src_dir)/%.dts $(KCONFIG_CONFIG) + $(call compile_gen_dep,$@,.dtb,$< $(KCONFIG_CONFIG)) + $(call compile_gen_dep,$@,.c,$(@:.dep=.dtb)) + $(call compile_gen_dep,$@,.o,$(@:.dep=.c)) + +$(platform_build_dir)/%.c: $(platform_build_dir)/%.dtb + $(call compile_d2c,$@,platform,$(subst .dtb,.o,$(subst /,-,$(subst $(platform_build_dir)/,,$<))),16,dt,$<) + +$(platform_build_dir)/%.dtb: $(platform_src_dir)/%.dts + $(call compile_dts,$@,$<) + +# Rules for lib/utils and firmware sources +$(platform_build_dir)/%.bin: $(platform_build_dir)/%.elf + $(call compile_objcopy,$@,$<) + +$(platform_build_dir)/%.elf: $(platform_build_dir)/%.o $(platform_build_dir)/%.elf.ld $(platform_build_dir)/lib/libplatsbi.a + $(call compile_elf,$@,$@.ld,$< $(platform_build_dir)/lib/libplatsbi.a) + +$(platform_build_dir)/%.ld: $(src_dir)/%.ldS + $(call compile_cpp,$@,$<) + +$(platform_build_dir)/%.dep: $(src_dir)/%.carray $(KCONFIG_CONFIG) + $(call compile_gen_dep,$@,.c,$< $(KCONFIG_CONFIG)) + $(call compile_gen_dep,$@,.o,$(@:.dep=.c)) + +$(platform_build_dir)/%.c: $(src_dir)/%.carray + $(call compile_carray,$@,$<) + +$(platform_build_dir)/%.dep: $(src_dir)/%.c $(KCONFIG_CONFIG) + $(call compile_cc_dep,$@,$<) + +$(platform_build_dir)/%.o: $(src_dir)/%.c + $(call compile_cc,$@,$<) + +$(platform_build_dir)/%.dep: $(src_dir)/%.S $(KCONFIG_CONFIG) + $(call compile_as_dep,$@,$<) + +$(platform_build_dir)/%.o: $(src_dir)/%.S + $(call compile_as,$@,$<) + +# Rule for "make docs" +$(build_dir)/docs/latex/refman.pdf: $(build_dir)/docs/latex/refman.tex + $(CMD_PREFIX)mkdir -p $(build_dir)/docs + $(CMD_PREFIX)$(MAKE) -C $(build_dir)/docs/latex +$(build_dir)/docs/latex/refman.tex: $(build_dir)/docs/doxygen.cfg + $(CMD_PREFIX)mkdir -p $(build_dir)/docs + $(CMD_PREFIX)doxygen $(build_dir)/docs/doxygen.cfg +$(build_dir)/docs/doxygen.cfg: $(src_dir)/docs/doxygen.cfg + $(CMD_PREFIX)mkdir -p $(build_dir)/docs + $(CMD_PREFIX)cat docs/doxygen.cfg | sed -e "s#@@SRC_DIR@@#$(src_dir)#" -e "s#@@BUILD_DIR@@#$(build_dir)#" -e "s#@@OPENSBI_MAJOR@@#$(OPENSBI_VERSION_MAJOR)#" -e "s#@@OPENSBI_MINOR@@#$(OPENSBI_VERSION_MINOR)#" > $(build_dir)/docs/doxygen.cfg +.PHONY: docs +docs: $(build_dir)/docs/latex/refman.pdf + +# Dependency files should only be included after default Makefile rules +# They should not be included for any "xxxconfig" or "xxxclean" rule +all-deps-1 = $(if $(findstring config,$(MAKECMDGOALS)),,$(deps-y)) +all-deps-2 = $(if $(findstring clean,$(MAKECMDGOALS)),,$(all-deps-1)) +-include $(all-deps-2) + +# Include external dependency of firmwares after default Makefile rules +include $(src_dir)/firmware/external_deps.mk + +# Convenient "make run" command for emulated platforms +.PHONY: run +run: all +ifneq ($(platform-runcmd),) + $(platform-runcmd) $(RUN_ARGS) +else +ifdef PLATFORM + @echo "Platform $(PLATFORM) doesn't specify a run command" + @false +else + @echo Run command only available when targeting a platform + @false +endif +endif + +install_targets-y = install_libsbi +ifdef PLATFORM +install_targets-y += install_libplatsbi +install_targets-y += install_firmwares +endif + +# Rule for "make install" +.PHONY: install +install: $(install_targets-y) + +.PHONY: install_libsbi +install_libsbi: $(build_dir)/lib/libsbi.a + $(call inst_header_dir,$(install_root_dir)/$(install_include_path),$(include_dir)/sbi) + $(call inst_file,$(install_root_dir)/$(install_lib_path)/libsbi.a,$(build_dir)/lib/libsbi.a) + +.PHONY: install_libplatsbi +install_libplatsbi: $(platform_build_dir)/lib/libplatsbi.a $(build_dir)/lib/libsbi.a + $(call inst_file,$(install_root_dir)/$(install_lib_path)/opensbi/$(platform_subdir)/lib/libplatsbi.a,$(platform_build_dir)/lib/libplatsbi.a) + +.PHONY: install_firmwares +install_firmwares: $(platform_build_dir)/lib/libplatsbi.a $(build_dir)/lib/libsbi.a $(firmware-bins-path-y) + $(call inst_file_list,$(install_root_dir),$(build_dir),$(install_firmware_path)/$(platform_subdir)/firmware,$(firmware-elfs-path-y)) + $(call inst_file_list,$(install_root_dir),$(build_dir),$(install_firmware_path)/$(platform_subdir)/firmware,$(firmware-bins-path-y)) + +.PHONY: install_docs +install_docs: $(build_dir)/docs/latex/refman.pdf + $(call inst_file,$(install_root_dir)/$(install_docs_path)/refman.pdf,$(build_dir)/docs/latex/refman.pdf) + +.PHONY: cscope +cscope: + $(CMD_PREFIX)find \ + "$(src_dir)/firmware" \ + "$(src_dir)/include" \ + "$(src_dir)/lib" \ + "$(platform_src_dir)" \ + -name "*.[chS]" -print > cscope.files + $(CMD_PREFIX)echo "$(KCONFIG_AUTOHEADER)" >> cscope.files + $(CMD_PREFIX)cscope -bkq -i cscope.files -f cscope.out + +# Rule for "make clean" +.PHONY: clean +clean: + $(CMD_PREFIX)mkdir -p $(build_dir) + $(if $(V), @echo " RM $(build_dir)/*.o") + $(CMD_PREFIX)find $(build_dir) -type f -name "*.o" -exec rm -rf {} + + $(if $(V), @echo " RM $(build_dir)/*.a") + $(CMD_PREFIX)find $(build_dir) -type f -name "*.a" -exec rm -rf {} + + $(if $(V), @echo " RM $(build_dir)/*.elf") + $(CMD_PREFIX)find $(build_dir) -type f -name "*.elf" -exec rm -rf {} + + $(if $(V), @echo " RM $(build_dir)/*.bin") + $(CMD_PREFIX)find $(build_dir) -type f -name "*.bin" -exec rm -rf {} + + $(if $(V), @echo " RM $(build_dir)/*.dtb") + $(CMD_PREFIX)find $(build_dir) -type f -name "*.dtb" -exec rm -rf {} + + +# Rule for "make distclean" +.PHONY: distclean +distclean: clean + $(CMD_PREFIX)mkdir -p $(build_dir) + $(if $(V), @echo " RM $(build_dir)/*.dep") + $(CMD_PREFIX)find $(build_dir) -type f -name "*.dep" -exec rm -rf {} + +ifeq ($(build_dir),$(CURDIR)/build) + $(if $(V), @echo " RM $(build_dir)") + $(CMD_PREFIX)rm -rf $(build_dir) +endif +ifeq ($(install_root_dir),$(install_root_dir_default)/usr) + $(if $(V), @echo " RM $(install_root_dir_default)") + $(CMD_PREFIX)rm -rf $(install_root_dir_default) +endif + $(if $(V), @echo " RM $(src_dir)/cscope*") + $(CMD_PREFIX)rm -f $(src_dir)/cscope* + +.PHONY: FORCE +FORCE: diff --git a/tools/opensbi/README.md b/tools/opensbi/README.md new file mode 100644 index 000000000..895bbf27a --- /dev/null +++ b/tools/opensbi/README.md @@ -0,0 +1,383 @@ +RISC-V Open Source Supervisor Binary Interface (OpenSBI) +======================================================== + +Copyright and License +--------------------- + +The OpenSBI project is copyright (c) 2019 Western Digital Corporation +or its affiliates and other contributors. + +It is distributed under the terms of the BSD 2-clause license +("Simplified BSD License" or "FreeBSD License", SPDX: *BSD-2-Clause*). +A copy of this license with OpenSBI copyright can be found in the file +[COPYING.BSD]. + +All source files in OpenSBI contain the 2-Clause BSD license SPDX short +identifier in place of the full license text. + +``` +SPDX-License-Identifier: BSD-2-Clause +``` + +This enables machine processing of license information based on the SPDX +License Identifiers that are available on the [SPDX] web site. + +OpenSBI source code also contains code reused from other projects as listed +below. The original license text of these projects is included in the source +files where the reused code is present. + +* The libfdt source code is disjunctively dual licensed + (GPL-2.0+ OR BSD-2-Clause). Some of this project code is used in OpenSBI + under the terms of the BSD 2-Clause license. Any contributions to this + code must be made under the terms of both licenses. + +See also the [third party notices] file for more information. + +Introduction +------------ + +The **RISC-V Supervisor Binary Interface (SBI)** is the recommended interface +between: + +1. A platform-specific firmware running in M-mode and a bootloader, a + hypervisor or a general-purpose OS executing in S-mode or HS-mode. +2. A hypervisor running in HS-mode and a bootloader or a general-purpose OS + executing in VS-mode. + +The *RISC-V SBI specification* is maintained as an independent project by the +RISC-V Foundation on [Github]. + +The goal of the OpenSBI project is to provide an open-source reference +implementation of the RISC-V SBI specifications for platform-specific firmwares +executing in M-mode (case 1 mentioned above). An OpenSBI implementation can be +easily extended by RISC-V platform and system-on-chip vendors to fit a +particular hardware configuration. + +The main component of OpenSBI is provided in the form of a platform-independent +static library **libsbi.a** implementing the SBI interface. A firmware or +bootloader implementation can link against this library to ensure conformance +with the SBI interface specifications. *libsbi.a* also defines an interface for +integrating with platform-specific operations provided by the platform firmware +implementation (e.g. console access functions, inter-processor interrupt +control, etc). + +To illustrate the use of the *libsbi.a* library, OpenSBI also provides a set of +platform-specific support examples. For each example, a platform-specific +static library *libplatsbi.a* can be compiled. This library implements +SBI call processing by integrating *libsbi.a* with the necessary +platform-dependent hardware manipulation functions. For all supported platforms, +OpenSBI also provides several runtime firmware examples built using the platform +*libplatsbi.a*. These example firmwares can be used to replace the legacy +*riscv-pk* bootloader (aka BBL) and enable the use of well-known bootloaders +such as [U-Boot]. + +Supported SBI version +--------------------- +Currently, OpenSBI fully supports SBI specification *v0.2*. OpenSBI also +supports Hart State Management (HSM) SBI extension starting from OpenSBI v0.7. +HSM extension allows S-mode software to boot all the harts a defined order +rather than legacy method of random booting of harts. As a result, many +required features such as CPU hotplug, kexec/kdump can also be supported easily +in S-mode. HSM extension in OpenSBI is implemented in a non-backward compatible +manner to reduce the maintenance burden and avoid confusion. That's why, any +S-mode software using OpenSBI will not be able to boot more than 1 hart if HSM +extension is not supported in S-mode. + +Linux kernel already supports SBI v0.2 and HSM SBI extension starting from +**v5.7-rc1**. If you are using an Linux kernel older than **5.7-rc1** or any +other S-mode software without HSM SBI extension, you should stick to OpenSBI +v0.6 to boot all the harts. For a UMP systems, it doesn't matter. + +N.B. Any S-mode boot loader (i.e. U-Boot) doesn't need to support HSM extension, +as it doesn't need to boot all the harts. The operating system should be +capable enough to bring up all other non-booting harts using HSM extension. + +Required Toolchain and Packages +------------------------------- + +OpenSBI can be compiled natively or cross-compiled on a x86 host. For +cross-compilation, you can build your own toolchain, download a prebuilt one +from the [Bootlin toolchain repository] or install a distribution-provided +toolchain; if you opt to use LLVM/Clang, most distribution toolchains will +support cross-compiling for RISC-V using the same toolchain as your native +LLVM/Clang toolchain due to LLVM's ability to support multiple backends in the +same binary, so is often an easy way to obtain a working cross-compilation +toolchain. + +Basically, we prefer toolchains with Position Independent Executable (PIE) +support like *riscv64-linux-gnu-gcc*, *riscv64-unknown-freebsd-gcc*, or +*Clang/LLVM* as they generate PIE firmware images that can run at arbitrary +address with appropriate alignment. If a bare-metal GNU toolchain (e.g. +*riscv64-unknown-elf-gcc*) is used, static linked firmware images are +generated instead. *Clang/LLVM* can still generate PIE images if a bare-metal +triple is used (e.g. *-target riscv64-unknown-elf*). + +Please note that only a 64-bit version of the toolchain is available in +the Bootlin toolchain repository for now. + +In addition to a toolchain, OpenSBI also requires the following packages on +the host: + +1. device-tree-compiler: The device tree compiler for compiling device + tree sources (DTS files). +2. python3: The python 3.0 (or compatible) language support for various + scripts. + +Building and Installing the OpenSBI Platform-Independent Library +---------------------------------------------------------------- + +The OpenSBI platform-independent static library *libsbi.a* can be compiled +natively or it can be cross-compiled on a host with a different base +architecture than RISC-V. + +For cross-compiling, the environment variable *CROSS_COMPILE* must be defined +to specify the name prefix of the RISC-V compiler toolchain executables, e.g. +*riscv64-linux-gnu-* if the gcc executable used is *riscv64-linux-gnu-gcc*. + +To build *libsbi.a* simply execute: +``` +make +``` + +All compiled binaries as well as the resulting *libsbi.a* static library file +will be placed in the *build/lib* directory. To specify an alternate build root +directory path, run: +``` +make O= +``` + +To generate files to be installed for using *libsbi.a* in other projects, run: +``` +make install +``` + +This will create the *install* directory with all necessary include files +copied under the *install/include* directory and the library file copied into +the *install/lib* directory. To specify an alternate installation root +directory path, run: +``` +make I= install +``` + +Building and Installing a Reference Platform Static Library and Firmware +------------------------------------------------------------------------ + +When the *PLATFORM=* argument is specified on the make command +line, the platform-specific static library *libplatsbi.a* and firmware examples +are built for the platform ** present in the directory +*platform* in the OpenSBI top directory. For example, to compile the platform +library and the firmware examples for the QEMU RISC-V *virt* machine, +** should be *generic*. + +To build *libsbi.a*, *libplatsbi.a* and the firmware for one of the supported +platforms, run: +``` +make PLATFORM= +``` + +An alternate build directory path can also be specified: +``` +make PLATFORM= O= +``` + +The platform-specific library *libplatsbi.a* will be generated in the +*build/platform//lib* directory. The platform firmware files +will be under the *build/platform//firmware* directory. +The compiled firmwares will be available in two different formats: an ELF file +and an expanded image file. + +To install *libsbi.a*, *libplatsbi.a*, and the compiled firmwares, run: +``` +make PLATFORM= install +``` + +This will copy the compiled platform-specific libraries and firmware files +under the *install/platform//* directory. An alternate +install root directory path can be specified as follows: +``` +make PLATFORM= I= install +``` + +In addition, platform-specific configuration options can be specified with the +top-level make command line. These options, such as *PLATFORM_* or +*FW_*, are platform-specific and described in more details in the +*docs/platform/.md* files and +*docs/firmware/.md* files. + +All OpenSBI platforms support Kconfig style build-time configuration. Users +can change the build-time configuration of a platform using a graphical +interface as follows: +``` +make PLATFORM= menuconfig +``` + +Alternately, an OpenSBI platform can have multiple default configurations +and users can select a custom default configuration as follows: +``` +make PLATFORM= PLATFORM_DEFCONFIG= +``` + +Building 32-bit / 64-bit OpenSBI Images +--------------------------------------- +By default, building OpenSBI generates 32-bit or 64-bit images based on the +supplied RISC-V cross-compile toolchain. For example if *CROSS_COMPILE* is set +to *riscv64-linux-gnu-*, 64-bit OpenSBI images will be generated. If building +32-bit OpenSBI images, *CROSS_COMPILE* should be set to a toolchain that is +pre-configured to generate 32-bit RISC-V codes, like *riscv32-linux-gnu-*. + +However it's possible to explicitly specify the image bits we want to build with +a given RISC-V toolchain. This can be done by setting the environment variable +*PLATFORM_RISCV_XLEN* to the desired width, for example: + +``` +export CROSS_COMPILE=riscv64-linux-gnu- +export PLATFORM_RISCV_XLEN=32 +``` + +will generate 32-bit OpenSBI images. And vice vesa. + +Building with Clang/LLVM +------------------------ + +OpenSBI can also be built with Clang/LLVM. To build with just Clang but keep +the default binutils (which will still use the *CROSS_COMPILE* prefix if +defined), override the *CC* make variable with: +``` +make CC=clang +``` + +To build with a full LLVM-based toolchain, not just Clang, enable the *LLVM* +option with: +``` +make LLVM=1 +``` + +When using Clang, *CROSS_COMPILE* often does not need to be defined unless +using GNU binutils with prefixed binary names. *PLATFORM_RISCV_XLEN* will be +used to infer a default triple to pass to Clang, so if *PLATFORM_RISCV_XLEN* +itself defaults to an undesired value then prefer setting that rather than the +full triple via *CROSS_COMPILE*. If *CROSS_COMPILE* is nonetheless defined, +rather than being used as a prefix for the executable name, it will instead be +passed via the `--target` option with the trailing `-` removed, so must be a +valid triple. + +These can also be mixed; for example using a GCC cross-compiler but LLVM +binutils would be: +``` +make CC=riscv64-linux-gnu-gcc LLVM=1 +``` + +These variables must be passed for all the make invocations described in this +document. + +NOTE: Using Clang with a `riscv*-linux-gnu` GNU binutils linker has been seen +to produce broken binaries with missing relocations; it is therefore currently +recommended that this combination be avoided or *FW_PIC=n* be used to disable +building OpenSBI as a position-independent binary. + +Building with timestamp and compiler info +----------------------------------------- + +When doing development, we may want to know the build time and compiler info +for debug purpose. OpenSBI can also be built with timestamp and compiler info. +To build with those info and print it out at boot time, we can just simply add +`BUILD_INFO=y`, like: +``` +make BUILD_INFO=y +``` + +But if you have used `BUILD_INFO=y`, and want to switch back to `BUILD_INFO=n`, +you must do +``` +make clean +``` +before the next build. + +NOTE: Using `BUILD_INFO=y` without specifying SOURCE_DATE_EPOCH will violate +[reproducible builds]. This definition is ONLY for development and debug +purpose, and should NOT be used in a product which follows "reproducible +builds". + +Contributing to OpenSBI +----------------------- + +The OpenSBI project encourages and welcomes contributions. Contributions should +follow the rules described in the OpenSBI [Contribution Guideline] document. +In particular, all patches sent should contain a Signed-off-by tag. + +The [Contributors List] document provides a list of individuals and +organizations actively contributing to the OpenSBI project. + +Documentation +------------- + +Detailed documentation of various aspects of OpenSBI can be found under the +*docs* directory. The documentation covers the following topics. + +* [Contribution Guideline]: Guideline for contributing code to OpenSBI project +* [Library Usage]: API documentation of OpenSBI static library *libsbi.a* +* [Platform Requirements]: Requirements for using OpenSBI on a platform +* [Platform Support Guide]: Guideline for implementing support for new platforms +* [Platform Documentation]: Documentation of the platforms currently supported. +* [Firmware Documentation]: Documentation for the different types of firmware + examples build supported by OpenSBI. +* [Domain Support]: Documentation for the OpenSBI domain support which helps + users achieve system-level partitioning using OpenSBI. + +OpenSBI source code is also well documented. For source level documentation, +doxygen style is used. Please refer to the [Doxygen manual] for details on this +format. + +Doxygen can be installed on Linux distributions using *.deb* packages using +the following command. +``` +sudo apt-get install doxygen doxygen-latex doxygen-doc doxygen-gui graphviz +``` + +For *.rpm* based Linux distributions, the following commands can be used. +``` +sudo yum install doxygen doxygen-latex doxywizard graphviz +``` +or +``` +sudo yum install doxygen doxygen-latex doxywizard graphviz +``` + +To build a consolidated *refman.pdf* of all documentation, run: +``` +make docs +``` +or +``` +make O= docs +``` + +the resulting *refman.pdf* will be available under the directory +*/docs/latex*. To install this file, run: +``` +make install_docs +``` +or +``` +make I= install_docs +``` + +*refman.pdf* will be installed under */docs*. + +[Github]: https://github.com/riscv/riscv-sbi-doc +[U-Boot]: https://www.denx.de/wiki/U-Boot/SourceCode +[Bootlin toolchain repository]: https://toolchains.bootlin.com/ +[COPYING.BSD]: COPYING.BSD +[SPDX]: http://spdx.org/licenses/ +[Contribution Guideline]: docs/contributing.md +[Contributors List]: CONTRIBUTORS.md +[Library Usage]: docs/library_usage.md +[Platform Requirements]: docs/platform_requirements.md +[Platform Support Guide]: docs/platform_guide.md +[Platform Documentation]: docs/platform/platform.md +[Firmware Documentation]: docs/firmware/fw.md +[Domain Support]: docs/domain_support.md +[Doxygen manual]: http://www.doxygen.nl/manual/index.html +[Kendryte standalone SDK]: https://github.com/kendryte/kendryte-standalone-sdk +[third party notices]: ThirdPartyNotices.md +[reproducible builds]: https://reproducible-builds.org diff --git a/tools/opensbi/ThirdPartyNotices.md b/tools/opensbi/ThirdPartyNotices.md new file mode 100644 index 000000000..1162d4361 --- /dev/null +++ b/tools/opensbi/ThirdPartyNotices.md @@ -0,0 +1,18 @@ +Copyright (c) 2019 Western Digital Corporation or its affiliates. + +Third Party Notices +=================== + +This project includes or partly uses code from the following open source +software subject to the following open source licenses. + +libfdt +------ + +Copyright (C) 2016 Free Electrons +Copyright (C) 2016 NextThing Co. + +The libfdt source code is disjunctively dual licensed (GPL-2.0+ or +BSD-2-Clause). Some of this project code is used in OpenSBI under the terms of +the BSD 2-Clause license. The full text of this license can be found in the +file [COPYING.BSD](COPYING.BSD). diff --git a/tools/opensbi/docs/contributing.md b/tools/opensbi/docs/contributing.md new file mode 100644 index 000000000..78d909e47 --- /dev/null +++ b/tools/opensbi/docs/contributing.md @@ -0,0 +1,84 @@ +OpenSBI Contribution Guideline +============================== + +All contributions to OpenSBI can be sent in the following ways: +1. Email patches to the OpenSBI mailing list at `opensbi@lists.infradead.org` +2. GitHub Pull Requests (PRs) to the [OpenSBI main repository] + +To join the OpenSBI mailing list, please visit the [OpenSBI infradead page]. + +The OpenSBI maintainers prefer patches via the OpenSBI mailing list +(option 1 above) so that they are visible to a wider audience. All +accepted patches on the OpenSBI mailing list will be taken by any of +the OpenSBI maintainers and merged into the [OpenSBI main repository] +using GitHub PRs. + +All contributed work must follow the following rules: +1. OpenSBI code should be written in accordance to the [Linux coding style]. +2. This project embraces the [Developer Certificate of Origin (DCO)] for +contributions. This means that you must agree to the following prior to +submitting patches: if you agree with this developer certificate you +acknowledge this by adding a Signed-off-by tag to your patch commit log. +Every submitted patch must have this tag. +3. A commit message must have a subject line, followed by a blank line, +followed by a description of the patch content. A blank line and the author +Signed-off-by tag must follow this description. +4. A commit subject line must start with a prefix followed by a ":". Common +prefixes are for example "lib:", "platform:", "firmware:", "docs:", "utils:" +and "top:". +5. Maintainers should use "Rebase and Merge" when using GitHub to merge pull +requests to avoid creating unnecessary merge commits. +6. Maintainers should avoid creating branches directly in the main +riscv/opensbi repository. Instead, prefer using a fork of the riscv/opensbi main +repository and branches within that fork to create pull requests. +7. A maintainer cannot merge his own pull requests in the riscv/opensbi main +repository. +8. A pull request must get at least one review from a maintainer. +9. A pull request must spend at least 24 hours in review to allow for other +developers to review. + +----------------------------------------------------------------------- + +Developer Certificate of Origin +Version 1.1 + +Copyright (C) 2004, 2006 The Linux Foundation and its contributors. +660 York Street, Suite 102, +San Francisco, CA 94110 USA + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + + +Developer's Certificate of Origin 1.1 + +By making a contribution to this project, I certify that: + +(a) The contribution was created in whole or in part by me and I + have the right to submit it under the open source license + indicated in the file; or + +(b) The contribution is based upon previous work that, to the best + of my knowledge, is covered under an appropriate open source + license and I have the right under that license to submit that + work with modifications, whether created in whole or in part + by me, under the same open source license (unless I am + permitted to submit under a different license), as indicated + in the file; or + +(c) The contribution was provided directly to me by some other + person who certified (a), (b) or (c) and I have not modified + it. + +(d) I understand and agree that this project and the contribution + are public and that a record of the contribution (including all + personal information I submit with it, including my sign-off) is + maintained indefinitely and may be redistributed consistent with + this project or the open source license(s) involved. + +----------------------------------------------------------------------- + +[OpenSBI main repository]: https://github.com/riscv/opensbi +[OpenSBI infradead page]: http://lists.infradead.org/mailman/listinfo/opensbi +[Linux coding style]: https://www.kernel.org/doc/html/v4.10/process/coding-style.html +[Developer Certificate of Origin (DCO)]: http://developercertificate.org/ diff --git a/tools/opensbi/docs/domain_support.md b/tools/opensbi/docs/domain_support.md new file mode 100644 index 000000000..8963b57e3 --- /dev/null +++ b/tools/opensbi/docs/domain_support.md @@ -0,0 +1,314 @@ +OpenSBI Domain Support +====================== + +An OpenSBI domain is a system-level partition (subset) of underlying hardware +having its own memory regions (RAM and MMIO devices) and HARTs. The OpenSBI +will try to achieve secure isolation between domains using RISC-V platform +features such as PMP, ePMP, IOPMP, SiFive Shield, etc. + +Important entities which help implement OpenSBI domain support are: + +* **struct sbi_domain_memregion** - Representation of a domain memory region +* **struct sbi_hartmask** - Representation of domain HART set +* **struct sbi_domain** - Representation of a domain instance + +Each HART of a RISC-V platform must have an OpenSBI domain assigned to it. +The OpenSBI platform support is responsible for populating domains and +providing HART id to domain mapping. The OpenSBI domain support will by +default assign **the ROOT domain** to all HARTs of a RISC-V platform, so +it is not mandatory for the OpenSBI platform support to populate domains. + +Domain Memory Region +-------------------- + +A domain memory region is represented by **struct sbi_domain_memregion** in +OpenSBI and has following details: + +* **order** - The size of a memory region is **2 ^ order** where **order** + must be **3 <= order <= __riscv_xlen** +* **base** - The base address of a memory region is **2 ^ order** + aligned start address +* **flags** - The flags of a memory region represent memory type (i.e. + RAM or MMIO) and allowed accesses (i.e. READ, WRITE, EXECUTE, etc.) + +Domain Instance +--------------- + +A domain instance is represented by **struct sbi_domain** in OpenSBI and +has following details: + +* **index** - Logical index of this domain +* **name** - Name of this domain +* **assigned_harts** - HARTs assigned to this domain +* **possible_harts** - HARTs possible in this domain +* **regions** - Array of memory regions terminated by a memory region + with order zero +* **boot_hartid** - HART id of the HART booting this domain. The domain + boot HART will be started at boot-time if boot HART is possible and + assigned for this domain. +* **next_addr** - Address of the next booting stage for this domain +* **next_arg1** - Arg1 (or 'a1' register) of the next booting stage for + this domain +* **next_mode** - Privilege mode of the next booting stage for this + domain. This can be either S-mode or U-mode. +* **system_reset_allowed** - Is domain allowed to reset the system? + +The memory regions represented by **regions** in **struct sbi_domain** have +following additional constraints to align with RISC-V PMP requirements: + +* A memory region to protect OpenSBI firmware from S-mode and U-mode + should always be present +* For two overlapping memory regions, one should be sub-region of another +* Two overlapping memory regions should not be of same size +* Two overlapping memory regions cannot have same flags +* Memory access checks on overlapping address should prefer smallest + overlapping memory region flags. + +ROOT Domain +----------- + +**The ROOT domain** is the default OpenSBI domain which is assigned by +default to all HARTs of a RISC-V platform. The OpenSBI domain support +will hand-craft **the ROOT domain** very early at boot-time in the +following manner: + +* **index** - Logical index of the ROOT domain is always zero +* **name** - Name of the ROOT domain is "root" +* **assigned_harts** - At boot-time all valid HARTs of a RISC-V platform + are assigned the ROOT domain which changes later based on OpenSBI + platform support +* **possible_harts** - All valid HARTs of a RISC-V platform are possible + HARTs of the ROOT domain +* **regions** - Two memory regions available to the ROOT domain: + **A)** A memory region to protect OpenSBI firmware from S-mode and U-mode + **B)** A memory region of **order=__riscv_xlen** allowing S-mode and + U-mode access to full memory address space +* **boot_hartid** - Coldboot HART is the HART booting the ROOT domain +* **next_addr** - Next booting stage address in coldboot HART scratch + space is the next address for the ROOT domain +* **next_arg1** - Next booting stage arg1 in coldboot HART scratch space + is the next arg1 for the ROOT domain +* **next_mode** - Next booting stage mode in coldboot HART scratch space + is the next mode for the ROOT domain +* **system_reset_allowed** - The ROOT domain is allowed to reset the system + +Domain Effects +-------------- + +Few noteworthy effects of a system partitioned into domains are as follows: + +* At any point in time, a HART is running in exactly one OpenSBI domain context +* The SBI IPI and RFENCE calls from HART A are restricted to the HARTs in + domain assigned to HART A +* The SBI HSM calls which try to change/read state of HART B from HART A will + only work if both HART A and HART B are assigned same domain +* A HART running in S-mode or U-mode can only access memory based on the + memory regions of the domain assigned to the HART + +Domain Device Tree Bindings +--------------------------- + +The OpenSBI domains can be described in the **device tree (DT) blob** (or +flattened device tree) passed to the OpenSBI firmwares by the previous +booting stage. This allows OpenSBI platform support to parse and populate +OpenSBI domains from the device tree blob (or flattened device tree). + +### Domain Configuration Node + +All OpenSBI domain description related DT nodes should be under the domain +configuration DT node. The **/chosen** DT node is the preferred parent of +the domain configuration DT node. + +The DT properties of a domain configuration DT node are as follows: + +* **compatible** (Mandatory) - The compatible string of the domain + configuration. This DT property should have value *"opensbi,domain,config"* + +### Domain Memory Region Node + +The domain memory region DT node describes details of a memory region and +can be pointed by multiple domain instance DT nodes. The access permissions +of the memory region are specified separately in domain instance node. + +The DT properties of a domain memory region DT node are as follows: + +* **compatible** (Mandatory) - The compatible string of the domain memory + region. This DT property should have value *"opensbi,domain,memregion"* +* **base** (Mandatory) - The base address of the domain memory region. This + DT property should have a **2 ^ order** aligned 64 bit address (i.e. two + DT cells). +* **order** (Mandatory) - The order of the domain memory region. This DT + property should have a 32 bit value (i.e. one DT cell) in the range + **3 <= order <= __riscv_xlen**. +* **mmio** (Optional) - A boolean flag representing whether the domain + memory region is a memory-mapped I/O (MMIO) region. +* **devices** (Optional) - The list of device DT node phandles for devices + which fall under this domain memory region. + +### Domain Instance Node + +The domain instance DT node describes set of possible HARTs, set of memory +regions, and other details of a domain instance. + +The DT properties of a domain instance DT node are as follows: + +* **compatible** (Mandatory) - The compatible string of the domain instance. + This DT property should have value *"opensbi,domain,instance"* +* **possible-harts** (Optional) - The list of CPU DT node phandles for the + the domain instance. This list represents the possible HARTs of the + domain instance. +* **regions** (Optional) - The list of domain memory region DT node phandle + and access permissions for the domain instance. Each list entry is a pair + of DT node phandle and access permissions. The access permissions are + represented as a 32bit bitmask having bits: **readable** (BIT[0]), + **writeable** (BIT[1]), **executable** (BIT[2]), and **m-mode** (BIT[3]). +* **boot-hart** (Optional) - The DT node phandle of the HART booting the + domain instance. If coldboot HART is assigned to the domain instance then + this DT property is ignored and the coldboot HART is assumed to be the + boot HART of the domain instance. +* **next-arg1** (Optional) - The 64 bit next booting stage arg1 for the + domain instance. If this DT property is not available and coldboot HART + is not assigned to the domain instance then **0x0** is used as default + value. If this DT property is not available and coldboot HART is assigned + to the domain instance then **next booting stage arg1 of coldboot HART** + is used as default value. +* **next-addr** (Optional) - The 64 bit next booting stage address for the + domain instance. If this DT property is not available and coldboot HART + is not assigned to the domain instance then **0x0** is used as default + value. If this DT property is not available and coldboot HART is assigned + to the domain instance then **next booting stage address of coldboot HART** + is used as default value. +* **next-mode** (Optional) - The 32 bit next booting stage mode for the + domain instance. The possible values of this DT property are: **0x1** + (s-mode), and **0x0** (u-mode). If this DT property is not available + and coldboot HART is not assigned to the domain instance then **0x1** + is used as default value. If this DT property is not available and + coldboot HART is assigned to the domain instance then **next booting + stage mode of coldboot HART** is used as default value. +* **system-reset-allowed** (Optional) - A boolean flag representing + whether the domain instance is allowed to do system reset. + +### Assigning HART To Domain Instance + +By default, all HARTs are assigned to **the ROOT domain**. The OpenSBI +platform support can provide the HART to domain instance assignment using +platform specific callback. + +The HART to domain instance assignment can be parsed from the device tree +using optional DT property **opensbi,domain** in each CPU DT node. The +value of DT property **opensbi,domain** is the DT phandle of the domain +instance DT node. If **opensbi,domain** DT property is not specified then +corresponding HART is assigned to **the ROOT domain**. + +### Domain Configuration Only Accessible to OpenSBI + +The software running inside a domain instance should only be aware of +devices and hardware resources accessible to itself. + +To hide domain configuration from domain instances, the following should +be done: + +* The previous booting stage should preferably provide a separate device + tree for each domain instance and mention location of device tree in + respective domain instance DT nodes using **next-arg1** DT property. +* If domain assigned to a HART does not have separate device tree then + OpenSBI platform support should remove all domain configuration details + from the device tree passed by previous booting stage before passing it + to the next booting stage. + +### Example + +``` + chosen { + opensbi-domains { + compatible = "opensbi,domain,config"; + + tmem: tmem { + compatible = "opensbi,domain,memregion"; + base = <0x0 0x80100000>; + order = <20>; + }; + + tuart: tuart { + compatible = "opensbi,domain,memregion"; + base = <0x0 0x10011000>; + order = <12>; + mmio; + devices = <&uart1>; + }; + + allmem: allmem { + compatible = "opensbi,domain,memregion"; + base = <0x0 0x0>; + order = <64>; + }; + + tdomain: trusted-domain { + compatible = "opensbi,domain,instance"; + possible-harts = <&cpu0>; + regions = <&tmem 0x7>, <&tuart 0x7>; + boot-hart = <&cpu0>; + next-arg1 = <0x0 0x0>; + next-addr = <0x0 0x80100000>; + next-mode = <0x0>; + system-reset-allowed; + }; + + udomain: untrusted-domain { + compatible = "opensbi,domain,instance"; + possible-harts = <&cpu1 &cpu2 &cpu3 &cpu4>; + regions = <&tmem 0x0>, <&tuart 0x0>, <&allmem 0x7>; + }; + }; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + timebase-frequency = <10000000>; + + cpu0: cpu@0 { + device_type = "cpu"; + reg = <0x00>; + compatible = "riscv"; + opensbi-domain = <&tdomain>; + ... + }; + + cpu1: cpu@1 { + device_type = "cpu"; + reg = <0x01>; + compatible = "riscv"; + opensbi-domain = <&udomain>; + ... + }; + + cpu2: cpu@2 { + device_type = "cpu"; + reg = <0x02>; + compatible = "riscv"; + opensbi-domain = <&udomain>; + ... + }; + + cpu3: cpu@3 { + device_type = "cpu"; + reg = <0x03>; + compatible = "riscv"; + opensbi-domain = <&udomain>; + ... + }; + + cpu4: cpu@4 { + device_type = "cpu"; + reg = <0x04>; + compatible = "riscv"; + opensbi-domain = <&udomain>; + ... + }; + }; + + uart1: serial@10011000 { + ... + }; +``` diff --git a/tools/opensbi/docs/doxygen.cfg b/tools/opensbi/docs/doxygen.cfg new file mode 100644 index 000000000..82f31a7ae --- /dev/null +++ b/tools/opensbi/docs/doxygen.cfg @@ -0,0 +1,2462 @@ +# Doxyfile 1.8.13 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "RISC-V OpenSBI" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = "v@@OPENSBI_MAJOR@@.@@OPENSBI_MINOR@@" + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "Open source implemenation of the supervisor binary interface" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = @@BUILD_DIR@@/docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 0. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 0 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = NO + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = YES + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = @@SRC_DIR@@/README.md \ + @@SRC_DIR@@/docs/contributing.md \ + @@SRC_DIR@@/docs/platform_guide.md \ + @@SRC_DIR@@/docs/platform_requirements.md \ + @@SRC_DIR@@/docs/library_usage.md \ + @@SRC_DIR@@/docs/domain_support.md \ + @@SRC_DIR@@/docs/firmware \ + @@SRC_DIR@@/docs/platform \ + @@SRC_DIR@@/include \ + @@SRC_DIR@@/lib + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. + +FILE_PATTERNS = *.c \ + *.h \ + *.md + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse-libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /