From 13db1b83c1e7160276c87b1faa8b573bb390cce3 Mon Sep 17 00:00:00 2001 From: Benau <Benau@users.noreply.github.com> Date: Mon, 24 Aug 2020 00:53:04 +0800 Subject: [PATCH] Add SheenBidi library for better unicode support --- CMakeLists.txt | 6 + android/Android.mk | 14 +- lib/sheenbidi/CMakeLists.txt | 3 + lib/sheenbidi/Headers/SBAlgorithm.h | 119 + lib/sheenbidi/Headers/SBBase.h | 119 + lib/sheenbidi/Headers/SBBidiType.h | 81 + lib/sheenbidi/Headers/SBCodepoint.h | 80 + lib/sheenbidi/Headers/SBCodepointSequence.h | 66 + lib/sheenbidi/Headers/SBConfig.h | 29 + lib/sheenbidi/Headers/SBGeneralCategory.h | 106 + lib/sheenbidi/Headers/SBLine.h | 84 + lib/sheenbidi/Headers/SBMirrorLocator.h | 103 + lib/sheenbidi/Headers/SBParagraph.h | 100 + lib/sheenbidi/Headers/SBRun.h | 32 + lib/sheenbidi/Headers/SBScript.h | 247 ++ lib/sheenbidi/Headers/SBScriptLocator.h | 101 + lib/sheenbidi/Headers/SheenBidi.h | 33 + lib/sheenbidi/LICENSE | 202 ++ lib/sheenbidi/README.md | 107 + lib/sheenbidi/Source/BidiChain.c | 110 + lib/sheenbidi/Source/BidiChain.h | 60 + lib/sheenbidi/Source/BidiTypeLookup.c | 1014 +++++++++ lib/sheenbidi/Source/BidiTypeLookup.h | 16 + lib/sheenbidi/Source/BracketQueue.c | 230 ++ lib/sheenbidi/Source/BracketQueue.h | 72 + lib/sheenbidi/Source/BracketType.h | 32 + lib/sheenbidi/Source/GeneralCategoryLookup.c | 1964 ++++++++++++++++ lib/sheenbidi/Source/GeneralCategoryLookup.h | 16 + lib/sheenbidi/Source/IsolatingRun.c | 529 +++++ lib/sheenbidi/Source/IsolatingRun.h | 47 + lib/sheenbidi/Source/LevelRun.c | 68 + lib/sheenbidi/Source/LevelRun.h | 42 + lib/sheenbidi/Source/PairingLookup.c | 256 +++ lib/sheenbidi/Source/PairingLookup.h | 17 + lib/sheenbidi/Source/RunExtrema.h | 50 + lib/sheenbidi/Source/RunKind.h | 81 + lib/sheenbidi/Source/RunQueue.c | 148 ++ lib/sheenbidi/Source/RunQueue.h | 55 + lib/sheenbidi/Source/SBAlgorithm.c | 177 ++ lib/sheenbidi/Source/SBAlgorithm.h | 34 + lib/sheenbidi/Source/SBAssert.h | 24 + lib/sheenbidi/Source/SBBase.c | 420 ++++ lib/sheenbidi/Source/SBBase.h | 108 + lib/sheenbidi/Source/SBCodepointSequence.c | 303 +++ lib/sheenbidi/Source/SBCodepointSequence.h | 25 + lib/sheenbidi/Source/SBLine.c | 300 +++ lib/sheenbidi/Source/SBLine.h | 39 + lib/sheenbidi/Source/SBLog.c | 303 +++ lib/sheenbidi/Source/SBLog.h | 153 ++ lib/sheenbidi/Source/SBMirrorLocator.c | 121 + lib/sheenbidi/Source/SBMirrorLocator.h | 32 + lib/sheenbidi/Source/SBParagraph.c | 646 ++++++ lib/sheenbidi/Source/SBParagraph.h | 38 + lib/sheenbidi/Source/SBScriptLocator.c | 174 ++ lib/sheenbidi/Source/SBScriptLocator.h | 33 + lib/sheenbidi/Source/ScriptLookup.c | 2142 ++++++++++++++++++ lib/sheenbidi/Source/ScriptLookup.h | 16 + lib/sheenbidi/Source/ScriptStack.c | 83 + lib/sheenbidi/Source/ScriptStack.h | 49 + lib/sheenbidi/Source/SheenBidi.c | 42 + lib/sheenbidi/Source/StatusStack.c | 111 + lib/sheenbidi/Source/StatusStack.h | 58 + 62 files changed, 11869 insertions(+), 1 deletion(-) create mode 100644 lib/sheenbidi/CMakeLists.txt create mode 100644 lib/sheenbidi/Headers/SBAlgorithm.h create mode 100644 lib/sheenbidi/Headers/SBBase.h create mode 100644 lib/sheenbidi/Headers/SBBidiType.h create mode 100644 lib/sheenbidi/Headers/SBCodepoint.h create mode 100644 lib/sheenbidi/Headers/SBCodepointSequence.h create mode 100644 lib/sheenbidi/Headers/SBConfig.h create mode 100644 lib/sheenbidi/Headers/SBGeneralCategory.h create mode 100644 lib/sheenbidi/Headers/SBLine.h create mode 100644 lib/sheenbidi/Headers/SBMirrorLocator.h create mode 100644 lib/sheenbidi/Headers/SBParagraph.h create mode 100644 lib/sheenbidi/Headers/SBRun.h create mode 100644 lib/sheenbidi/Headers/SBScript.h create mode 100644 lib/sheenbidi/Headers/SBScriptLocator.h create mode 100644 lib/sheenbidi/Headers/SheenBidi.h create mode 100755 lib/sheenbidi/LICENSE create mode 100644 lib/sheenbidi/README.md create mode 100644 lib/sheenbidi/Source/BidiChain.c create mode 100644 lib/sheenbidi/Source/BidiChain.h create mode 100644 lib/sheenbidi/Source/BidiTypeLookup.c create mode 100644 lib/sheenbidi/Source/BidiTypeLookup.h create mode 100644 lib/sheenbidi/Source/BracketQueue.c create mode 100644 lib/sheenbidi/Source/BracketQueue.h create mode 100644 lib/sheenbidi/Source/BracketType.h create mode 100644 lib/sheenbidi/Source/GeneralCategoryLookup.c create mode 100644 lib/sheenbidi/Source/GeneralCategoryLookup.h create mode 100644 lib/sheenbidi/Source/IsolatingRun.c create mode 100644 lib/sheenbidi/Source/IsolatingRun.h create mode 100644 lib/sheenbidi/Source/LevelRun.c create mode 100644 lib/sheenbidi/Source/LevelRun.h create mode 100644 lib/sheenbidi/Source/PairingLookup.c create mode 100644 lib/sheenbidi/Source/PairingLookup.h create mode 100644 lib/sheenbidi/Source/RunExtrema.h create mode 100644 lib/sheenbidi/Source/RunKind.h create mode 100644 lib/sheenbidi/Source/RunQueue.c create mode 100644 lib/sheenbidi/Source/RunQueue.h create mode 100644 lib/sheenbidi/Source/SBAlgorithm.c create mode 100644 lib/sheenbidi/Source/SBAlgorithm.h create mode 100644 lib/sheenbidi/Source/SBAssert.h create mode 100644 lib/sheenbidi/Source/SBBase.c create mode 100644 lib/sheenbidi/Source/SBBase.h create mode 100644 lib/sheenbidi/Source/SBCodepointSequence.c create mode 100644 lib/sheenbidi/Source/SBCodepointSequence.h create mode 100644 lib/sheenbidi/Source/SBLine.c create mode 100644 lib/sheenbidi/Source/SBLine.h create mode 100644 lib/sheenbidi/Source/SBLog.c create mode 100644 lib/sheenbidi/Source/SBLog.h create mode 100644 lib/sheenbidi/Source/SBMirrorLocator.c create mode 100644 lib/sheenbidi/Source/SBMirrorLocator.h create mode 100644 lib/sheenbidi/Source/SBParagraph.c create mode 100644 lib/sheenbidi/Source/SBParagraph.h create mode 100644 lib/sheenbidi/Source/SBScriptLocator.c create mode 100644 lib/sheenbidi/Source/SBScriptLocator.h create mode 100644 lib/sheenbidi/Source/ScriptLookup.c create mode 100644 lib/sheenbidi/Source/ScriptLookup.h create mode 100644 lib/sheenbidi/Source/ScriptStack.c create mode 100644 lib/sheenbidi/Source/ScriptStack.h create mode 100644 lib/sheenbidi/Source/SheenBidi.c create mode 100644 lib/sheenbidi/Source/StatusStack.c create mode 100644 lib/sheenbidi/Source/StatusStack.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 071f70c15..25c320c7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,6 +372,11 @@ endif() # Text handling in STK (We use freetype, harfbuzz, fribidi and libraqm for i18n text handling) if (NOT SERVER_ONLY) + # SheenBidi + add_subdirectory("${PROJECT_SOURCE_DIR}/lib/sheenbidi") + include_directories("${PROJECT_SOURCE_DIR}/lib/sheenbidi/Headers") + SET(SHEENBIDI_LIBRARY sheenbidi) + # Freetype find_package(Freetype) if(FREETYPE_FOUND) @@ -665,6 +670,7 @@ if(NOT SERVER_ONLY) ${FREETYPE_LIBRARIES} ${HARFBUZZ_LIBRARY} ${SDL2_LIBRARY} + ${SHEENBIDI_LIBRARY} graphics_utils) endif() diff --git a/android/Android.mk b/android/Android.mk index 56d99f22e..a72e9fdd4 100644 --- a/android/Android.mk +++ b/android/Android.mk @@ -171,6 +171,16 @@ include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) +# SheenBidi +LOCAL_MODULE := sheenbidi +LOCAL_PATH := . +LOCAL_CPP_FEATURES += rtti +LOCAL_SRC_FILES := $(wildcard ../lib/sheenbidi/Source/*.c) +LOCAL_CFLAGS := -I../lib/sheenbidi/Headers +include $(BUILD_STATIC_LIBRARY) +include $(CLEAR_VARS) + + # Irrlicht LOCAL_MODULE := irrlicht LOCAL_PATH := . @@ -249,6 +259,7 @@ LOCAL_LDLIBS := -llog -landroid -lGLESv1_CM -lGLESv3 -lOpenSLES -ldl -lm LOCAL_CFLAGS := -I../lib/angelscript/include \ -I../lib/bullet/src \ -I../lib/libraqm \ + -I../lib/sheenbidi/Headers \ -I../lib/enet/include \ -I../lib/ifaddrs \ -I../lib/irrlicht/include \ @@ -279,7 +290,8 @@ LOCAL_CPPFLAGS := -std=gnu++0x LOCAL_STATIC_LIBRARIES := irrlicht bullet enet ifaddrs angelscript mcpp SDL2 \ vorbisfile vorbis ogg openal curl libssl libcrypto \ - c++_static raqm fribidi harfbuzz freetype graphics_utils + c++_static raqm fribidi sheenbidi harfbuzz freetype \ + graphics_utils include $(BUILD_SHARED_LIBRARY) include $(CLEAR_VARS) diff --git a/lib/sheenbidi/CMakeLists.txt b/lib/sheenbidi/CMakeLists.txt new file mode 100644 index 000000000..8c7a145fa --- /dev/null +++ b/lib/sheenbidi/CMakeLists.txt @@ -0,0 +1,3 @@ +add_definitions(-DSB_CONFIG_UNITY) +include_directories("Headers") +add_library(sheenbidi STATIC Source/SheenBidi.c) diff --git a/lib/sheenbidi/Headers/SBAlgorithm.h b/lib/sheenbidi/Headers/SBAlgorithm.h new file mode 100644 index 000000000..15758de64 --- /dev/null +++ b/lib/sheenbidi/Headers/SBAlgorithm.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2016-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_ALGORITHM_H +#define _SB_PUBLIC_ALGORITHM_H + +#include "SBBase.h" +#include "SBBidiType.h" +#include "SBCodepointSequence.h" +#include "SBParagraph.h" + +typedef struct _SBAlgorithm *SBAlgorithmRef; + +/** + * Creates an algorithm object for the specified code point sequence. The source string inside the + * code point sequence should not be freed until the algorithm object is in use. + * + * @param codepointSequence + * The code point sequence to apply bidirectional algorithm on. + * @return + * A reference to an algorithm object if the call was successful, NULL otherwise. + */ +SBAlgorithmRef SBAlgorithmCreate(const SBCodepointSequence *codepointSequence); + +/** + * Returns a direct pointer to the bidirectional types of code units, stored in the algorithm + * object. + * + * @param algorithm + * The algorithm object from which to access the bidirectional types of code units. + * @return + * A valid pointer to an array of SBBidiType structures, whose length will be equal to that of + * string buffer. + */ +const SBBidiType *SBAlgorithmGetBidiTypesPtr(SBAlgorithmRef algorithm); + +/** + * Determines the boundary of first paragraph within the specified range. + * + * The boundary of the paragraph occurs after a code point whose bidirectional type is Paragraph + * Separator (B), or at the suggestedLength if no such code point exists before it. The exception to + * this rule is when a Carriage Return (CR) is followed by a Line Feed (LF). Both CR and LF are + * paragraph separators, but in that case, the boundary of the paragraph is considered after LF code + * point. + * + * @param algorithm + * The algorithm object to use for determining paragraph boundary. + * @param paragraphOffset + * The index to the first code unit of the paragraph in source string. + * @param suggestedLength + * The number of code units covering the suggested length of the paragraph. + * @param acutalLength + * The actual length of the first paragraph, including the paragraph separator, within the + * given range. + * @param separatorLength + * On output, the length of paragraph separator. This parameter can be set to NULL if not + * needed. + */ +void SBAlgorithmGetParagraphBoundary(SBAlgorithmRef algorithm, + SBUInteger paragraphOffset, SBUInteger suggestedLength, + SBUInteger *acutalLength, SBUInteger *separatorLength); + +/** + * Creates a paragraph object processed with Unicode Bidirectional Algorithm. + * + * This function processes only first paragraph starting at paragraphOffset with length less than or + * equal to suggestedLength, in accordance with Rule P1 of Unicode Bidirectional Algorithm. + * + * The paragraph level is determined by applying Rules P2-P3 and embedding levels are resolved by + * applying Rules X1-I2. + * + * @param algorithm + * The algorithm object to use for creating the desired paragraph. + * @param paragraphOffset + * The index to the first code unit of the paragraph in source string. + * @param suggestedLength + * The number of code units covering the suggested length of the paragraph. + * @param baseLevel + * The desired base level of the paragraph. Rules P2-P3 would be ignored if it is neither + * SBLevelDefaultLTR nor SBLevelDefaultRTL. + * @return + * A reference to a paragraph object if the call was successful, NULL otherwise. + */ +SBParagraphRef SBAlgorithmCreateParagraph(SBAlgorithmRef algorithm, + SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel); + +/** + * Increments the reference count of an algorithm object. + * + * @param algorithm + * The algorithm object whose reference count will be incremented. + * @return + * The same algorithm object passed in as the parameter. + */ +SBAlgorithmRef SBAlgorithmRetain(SBAlgorithmRef algorithm); + +/** + * Decrements the reference count of an algorithm object. The object will be deallocated when its + * reference count reaches zero. + * + * @param algorithm + * The algorithm object whose reference count will be decremented. + */ +void SBAlgorithmRelease(SBAlgorithmRef algorithm); + +#endif diff --git a/lib/sheenbidi/Headers/SBBase.h b/lib/sheenbidi/Headers/SBBase.h new file mode 100644 index 000000000..dfadf1c1d --- /dev/null +++ b/lib/sheenbidi/Headers/SBBase.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2014-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_BASE_H +#define _SB_PUBLIC_BASE_H + +#include <stddef.h> +#include <stdint.h> + +/** + * A type to represent an 8-bit signed integer. + */ +typedef int8_t SBInt8; + +/** + * A type to represent a 16-bit signed integer. + */ +typedef int16_t SBInt16; + +/** + * A type to represent a 32-bit signed integer. + */ +typedef int32_t SBInt32; + +/** + * A type to represent an 8-bit unsigned integer. + */ +typedef uint8_t SBUInt8; + +/** + * A type to represent a 16-bit unsigned integer. + */ +typedef uint16_t SBUInt16; + +/** + * A type to represent a 32-bit unsigned integer. + */ +typedef uint32_t SBUInt32; + +/** + * A signed integer type whose width is equal to the width of the machine word. + */ +typedef intptr_t SBInteger; + +/** + * An unsigned integer type whose width is equal to the width of the machine word. + */ +typedef uintptr_t SBUInteger; + +/** + * Constants that specify the states of a boolean. + */ +enum { + SBFalse = 0, /**< A value representing the false state. */ + SBTrue = 1 /**< A value representing the true state. */ +}; +/** + * A type to represent a boolean value. + */ +typedef SBUInt8 SBBoolean; + +#define SBUInt8InRange(v, s, e) \ +( \ + (SBUInt8)((v) - (s)) \ + <= (SBUInt8)((e) - (s)) \ +) + +#define SBUInt16InRange(v, s, e) \ +( \ + (SBUInt16)((v) - (s)) \ + <= (SBUInt16)((e) - (s)) \ +) + +#define SBUInt32InRange(v, s, e) \ +( \ + (SBUInt32)((v) - (s)) \ + <= (SBUInt32)((e) - (s)) \ +) + + +/** + * A type to represent a bidi level. + */ +typedef SBUInt8 SBLevel; + +/** + * A value representing an invalid bidi level. + */ +#define SBLevelInvalid 0xFF + +/** + * A value representing maximum explicit embedding level. + */ +#define SBLevelMax 125 + +/** + * A value specifying to set base level to zero (left-to-right) if there is no strong character. + */ +#define SBLevelDefaultLTR 0xFE + +/** + * A value specifying to set base level to one (right-to-left) if there is no strong character. + */ +#define SBLevelDefaultRTL 0xFD + +#endif diff --git a/lib/sheenbidi/Headers/SBBidiType.h b/lib/sheenbidi/Headers/SBBidiType.h new file mode 100644 index 000000000..0aaaad14f --- /dev/null +++ b/lib/sheenbidi/Headers/SBBidiType.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_BIDI_TYPE_H +#define _SB_PUBLIC_BIDI_TYPE_H + +#include "SBBase.h" + +/** + * Constants that specify the bidirectional types of a character. + */ +enum { + SBBidiTypeNil = 0x00, + + SBBidiTypeL = 0x01, /**< Strong: Left-to-Right */ + SBBidiTypeR = 0x02, /**< Strong: Right-to-Left */ + SBBidiTypeAL = 0x03, /**< Strong: Right-to-Left Arabic */ + + SBBidiTypeBN = 0x04, /**< Weak: Boundary Neutral */ + SBBidiTypeNSM = 0x05, /**< Weak: Non-Spacing Mark */ + SBBidiTypeAN = 0x06, /**< Weak: Arabic Number */ + SBBidiTypeEN = 0x07, /**< Weak: European Number */ + SBBidiTypeET = 0x08, /**< Weak: European Number Terminator */ + SBBidiTypeES = 0x09, /**< Weak: European Number Separator */ + SBBidiTypeCS = 0x0A, /**< Weak: Common Number Separator */ + + SBBidiTypeWS = 0x0B, /**< Neutral: White Space */ + SBBidiTypeS = 0x0C, /**< Neutral: Segment Separator */ + SBBidiTypeB = 0x0D, /**< Neutral: Paragraph Separator */ + SBBidiTypeON = 0x0E, /**< Neutral: Other Neutral */ + + SBBidiTypeLRI = 0x0F, /**< Format: Left-to-Right Isolate */ + SBBidiTypeRLI = 0x10, /**< Format: Right-to-Left Isolate */ + SBBidiTypeFSI = 0x11, /**< Format: First Strong Isolate */ + SBBidiTypePDI = 0x12, /**< Format: Pop Directional Isolate */ + SBBidiTypeLRE = 0x13, /**< Format: Left-to-Right Embedding */ + SBBidiTypeRLE = 0x14, /**< Format: Right-to-Left Embedding */ + SBBidiTypeLRO = 0x15, /**< Format: Left-to-Right Override */ + SBBidiTypeRLO = 0x16, /**< Format: Right-to-Left Override */ + SBBidiTypePDF = 0x17 /**< Format: Pop Directional Formatting */ +}; + +/** + * A type to represent the bidirectional type of a character. + */ +typedef SBUInt8 SBBidiType; + +/** + * Checks whether specified bidirectional type is strong. + */ +#define SBBidiTypeIsStrong(t) SBUInt8InRange(t, SBBidiTypeL, SBBidiTypeAL) + +/** + * Checks whether specified bidirectional type is weak. + */ +#define SBBidiTypeIsWeak(t) SBUInt8InRange(t, SBBidiTypeBN, SBBidiTypeCS) + +/** + * Checks whether specified bidirectional type is neutral. + */ +#define SBBidiTypeIsNeutral(t) SBUInt8InRange(t, SBBidiTypeWS, SBBidiTypeON) + +/** + * Checks whether specified bidirectional type is format. + */ +#define SBBidiTypeIsFormat(t) SBUInt8InRange(t, SBBidiTypeLRI, SBBidiTypePDF) + +#endif diff --git a/lib/sheenbidi/Headers/SBCodepoint.h b/lib/sheenbidi/Headers/SBCodepoint.h new file mode 100644 index 000000000..b22e07ba1 --- /dev/null +++ b/lib/sheenbidi/Headers/SBCodepoint.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_CODEPOINT_H +#define _SB_PUBLIC_CODEPOINT_H + +#include "SBBase.h" +#include "SBBidiType.h" +#include "SBGeneralCategory.h" +#include "SBScript.h" + +/** + * A type to represent a unicode code point. + */ +typedef SBUInt32 SBCodepoint; + +/** + * A value representing an invalid code point. + */ +#define SBCodepointInvalid UINT32_MAX + +/** + * A value representing a faulty code point, used as a replacement by the decoder. + */ +#define SBCodepointFaulty 0xFFFD + +/** + * Returns the bidirectional type of a code point. + * + * @param codepoint + * The code point whose bidirectional type is returned. + * @return + * The bidirectional type of specified code point. + */ +SBBidiType SBCodepointGetBidiType(SBCodepoint codepoint); + +/** + * Returns the general category of a code point. + * + * @param codepoint + * The code point whose general category is returned. + * @return + * The general category of specified code point. + */ +SBGeneralCategory SBCodepointGetGeneralCategory(SBCodepoint codepoint); + +/** + * Returns the mirror of a code point. + * + * @param codepoint + * The code point whose mirror is returned. + * @return + * The mirror of specified code point if available, 0 otherwise. + */ +SBCodepoint SBCodepointGetMirror(SBCodepoint codepoint); + +/** + * Returns the script of a code point. + * + * @param codepoint + * The code point whose script is returned. + * @return + * The script of specified code point. + */ +SBScript SBCodepointGetScript(SBCodepoint codepoint); + +#endif diff --git a/lib/sheenbidi/Headers/SBCodepointSequence.h b/lib/sheenbidi/Headers/SBCodepointSequence.h new file mode 100644 index 000000000..f1f8a5c3f --- /dev/null +++ b/lib/sheenbidi/Headers/SBCodepointSequence.h @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2016-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_CODEPOINT_SEQUENCE_H +#define _SB_PUBLIC_CODEPOINT_SEQUENCE_H + +#include "SBBase.h" +#include "SBCodepoint.h" + +enum { + SBStringEncodingUTF8 = 0, /**< An 8-bit representation of Unicode code points. */ + SBStringEncodingUTF16 = 1, /**< 16-bit UTF encoding in native endianness. */ + SBStringEncodingUTF32 = 2 /**< 32-bit UTF encoding in native endianness. */ +}; +typedef SBUInt32 SBStringEncoding; + +typedef struct _SBCodepointSequence { + SBStringEncoding stringEncoding; /**< The encoding of the string. */ + void *stringBuffer; /**< The source string containing the code units. */ + SBUInteger stringLength; /**< The length of the string in terms of code units. */ +} SBCodepointSequence; + +/** + * Returns the code point before the given string index. + * + * @param codepointSequence + * The object holding the information of the string. + * @param stringIndex + * The index of code unit before which to get the code point. On output, it is set to point to + * the first code unit of returned code point. + * @return + * The code point before the given string index, or SBCodepointInvalid if stringIndex is equal + * to zero or larger than actual length of source string. + */ +SBCodepoint SBCodepointSequenceGetCodepointBefore(const SBCodepointSequence *codepointSequence, + SBUInteger *stringIndex); + +/** + * Returns the code point at the given string index. + * + * @param codepointSequence + * The object holding the information of the string. + * @param stringIndex + * The index of code unit at which to get the code point. On output, it is set to point to the + * first code unit of next code point. + * @return + * The code point at the given string index, or SBCodepointInvalid if stringIndex is larger + * than or equal to actual length of source string. + */ +SBCodepoint SBCodepointSequenceGetCodepointAt(const SBCodepointSequence *codepointSequence, + SBUInteger *stringIndex); + +#endif diff --git a/lib/sheenbidi/Headers/SBConfig.h b/lib/sheenbidi/Headers/SBConfig.h new file mode 100644 index 000000000..801e91abb --- /dev/null +++ b/lib/sheenbidi/Headers/SBConfig.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2014 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_CONFIG_H +#define _SB_PUBLIC_CONFIG_H + +/* #define SB_CONFIG_LOG */ +/* #define SB_CONFIG_UNITY */ + +#ifdef SB_CONFIG_UNITY +#define SB_INTERNAL static +#else +#define SB_INTERNAL +#endif + +#endif diff --git a/lib/sheenbidi/Headers/SBGeneralCategory.h b/lib/sheenbidi/Headers/SBGeneralCategory.h new file mode 100644 index 000000000..ce15284fc --- /dev/null +++ b/lib/sheenbidi/Headers/SBGeneralCategory.h @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_GENERAL_CATEGORY_H +#define _SB_PUBLIC_GENERAL_CATEGORY_H + +#include "SBBase.h" + +/** + * Constants that specify the general category of a character. + */ +enum { + SBGeneralCategoryNil = 0x00, + + SBGeneralCategoryLU = 0x01, /**< Letter: Uppercase Letter */ + SBGeneralCategoryLL = 0x02, /**< Letter: Lowercase Letter */ + SBGeneralCategoryLT = 0x03, /**< Letter: Titlecase Letter */ + SBGeneralCategoryLM = 0x04, /**< Letter: Modifier Letter */ + SBGeneralCategoryLO = 0x05, /**< Letter: Other Letter */ + + SBGeneralCategoryMN = 0x06, /**< Mark: Nonspacing Mark */ + SBGeneralCategoryMC = 0x07, /**< Mark: Spacing Mark */ + SBGeneralCategoryME = 0x08, /**< Mark: Enclosing Mark */ + + SBGeneralCategoryND = 0x09, /**< Number: Decimal Number */ + SBGeneralCategoryNL = 0x0A, /**< Number: Letter Number */ + SBGeneralCategoryNO = 0x0B, /**< Number: Other Number */ + + SBGeneralCategoryPC = 0x0C, /**< Punctuation: Connector Punctuation */ + SBGeneralCategoryPD = 0x0D, /**< Punctuation: Dash Punctuation */ + SBGeneralCategoryPS = 0x0E, /**< Punctuation: Open Punctuation */ + SBGeneralCategoryPE = 0x0F, /**< Punctuation: Close Punctuation */ + SBGeneralCategoryPI = 0x10, /**< Punctuation: Initial Punctuation */ + SBGeneralCategoryPF = 0x11, /**< Punctuation: Final Punctuation */ + SBGeneralCategoryPO = 0x12, /**< Punctuation: Other Punctuation */ + + SBGeneralCategorySM = 0x13, /**< Symbol: Math Symbol */ + SBGeneralCategorySC = 0x14, /**< Symbol: Currency Symbol */ + SBGeneralCategorySK = 0x15, /**< Symbol: Modifier Symbol */ + SBGeneralCategorySO = 0x16, /**< Symbol: Other Symbol */ + + SBGeneralCategoryZS = 0x17, /**< Separator: Space Separator */ + SBGeneralCategoryZL = 0x18, /**< Separator: Line Separator */ + SBGeneralCategoryZP = 0x19, /**< Separator: Paragraph Separator */ + + SBGeneralCategoryCC = 0x1A, /**< Other: Control */ + SBGeneralCategoryCF = 0x1B, /**< Other: Format */ + SBGeneralCategoryCS = 0x1C, /**< Other: Surrogate */ + SBGeneralCategoryCO = 0x1D, /**< Other: Private_Use */ + SBGeneralCategoryCN = 0x1E /**< Other: Unassigned */ +}; + +/** + * A type to represent the general category of a character. + */ +typedef SBUInt8 SBGeneralCategory; + +/** + * Checks whether specified general category is letter. + */ +#define SBGeneralCategoryIsLetter(gc) SBUInt8InRange(gc, SBGeneralCategoryLU, SBGeneralCategoryLO) + +/** + * Checks whether specified general category is mark. + */ +#define SBGeneralCategoryIsMark(gc) SBUInt8InRange(gc, SBGeneralCategoryMN, SBGeneralCategoryME) + +/** + * Checks whether specified general category is number. + */ +#define SBGeneralCategoryIsNumber(gc) SBUInt8InRange(gc, SBGeneralCategoryND, SBGeneralCategoryNO) + +/** + * Checks whether specified general category is punctuation. + */ +#define SBGeneralCategoryIsPunctuation(gc) SBUInt8InRange(gc, SBGeneralCategoryPC, SBGeneralCategoryPO) + +/** + * Checks whether specified general category is symbol. + */ +#define SBGeneralCategoryIsSymbol(gc) SBUInt8InRange(gc, SBGeneralCategorySM, SBGeneralCategorySO) + +/** + * Checks whether specified general category is separator. + */ +#define SBGeneralCategoryIsSeparator(gc) SBUInt8InRange(gc, SBGeneralCategoryZS, SBGeneralCategoryZP) + +/** + * Checks whether specified general category is other. + */ +#define SBGeneralCategoryIsOther(gc) SBUInt8InRange(gc, SBGeneralCategoryCC, SBGeneralCategoryCN) + +#endif diff --git a/lib/sheenbidi/Headers/SBLine.h b/lib/sheenbidi/Headers/SBLine.h new file mode 100644 index 000000000..b3f612340 --- /dev/null +++ b/lib/sheenbidi/Headers/SBLine.h @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2014-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_LINE_H +#define _SB_PUBLIC_LINE_H + +#include "SBBase.h" +#include "SBRun.h" + +typedef struct _SBLine *SBLineRef; + +/** + * Returns the index to the first code unit of the line in source string. + * + * @param line + * The line whose offset is returned. + * @return + * The offset of the line passed in. + */ +SBUInteger SBLineGetOffset(SBLineRef line); + +/** + * Returns the number of code units coverting the length of the line. + * + * @param line + * The line whose length is returned. + * @return + * The length of the line passed in. + */ +SBUInteger SBLineGetLength(SBLineRef line); + +/** + * Returns the number of runs in the line. + * + * @param line + * The line whose run count is returned. + * @return + * The number of runs in the line passed in. + */ +SBUInteger SBLineGetRunCount(SBLineRef line); + +/** + * Returns a direct pointer to the run array, stored in the line. + * + * @param line + * The line from which to access the runs. + * @return + * A valid pointer to an array of SBRun structures. + */ +const SBRun *SBLineGetRunsPtr(SBLineRef line); + +/** + * Increments the reference count of a line object. + * + * @param line + * The line object whose reference count will be incremented. + * @return + * The same line object passed in as the parameter. + */ +SBLineRef SBLineRetain(SBLineRef line); + +/** + * Decrements the reference count of a line object. The object will be deallocated when its + * reference count reaches zero. + * + * @param line + * The line object whose reference count will be decremented. + */ +void SBLineRelease(SBLineRef line); + +#endif diff --git a/lib/sheenbidi/Headers/SBMirrorLocator.h b/lib/sheenbidi/Headers/SBMirrorLocator.h new file mode 100644 index 000000000..dc3effeab --- /dev/null +++ b/lib/sheenbidi/Headers/SBMirrorLocator.h @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2014-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_MIRROR_LOCATOR_H +#define _SB_PUBLIC_MIRROR_LOCATOR_H + +#include "SBBase.h" +#include "SBCodepoint.h" +#include "SBLine.h" + +typedef struct _SBMirrorLocator *SBMirrorLocatorRef; + +/** + * A structure containing the information about a code point having Bidi_Mirrored property. + */ +typedef struct _SBMirrorAgent { + SBUInteger index; /**< The absolute index of the code point. */ + SBCodepoint mirror; /**< The mirrored code point. */ + SBCodepoint codepoint; /**< The actual code point. */ +} SBMirrorAgent; + +/** + * Creates a mirror locator object which can be used to find mirrors in a line. + * + * @return + * A reference to a mirror locator object. + */ +SBMirrorLocatorRef SBMirrorLocatorCreate(void); + +/** + * Loads a line in the locator so that its mirror can be located. + * + * @param locator + * The locator in which the line will be loaded. + * @param line + * The line which will be loaded in the locator. + * @param stringBuffer + * The string buffer from which the line's algorithm was created. + */ +void SBMirrorLocatorLoadLine(SBMirrorLocatorRef locator, SBLineRef line, void *stringBuffer); + +/** + * Returns the agent containing the information of current located mirror. + * + * @param locator + * The locator whose agent is returned. + */ +const SBMirrorAgent *SBMirrorLocatorGetAgent(SBMirrorLocatorRef locator); + +/** + * Instructs the locator to find next mirror in the loaded line. + * + * @param locator + * The locator whom you want to instruct. + * @return + * SBTrue if another mirror is available, SBFalse otherwise. + * @note + * The locator will be reset after locating last mirror. + */ +SBBoolean SBMirrorLocatorMoveNext(SBMirrorLocatorRef locator); + +/** + * Instructs the locator to reset itself so that mirrors of the loaded line can be obatained from + * the beginning. + * + * @param locator + * The locator whom you want to reset. + */ +void SBMirrorLocatorReset(SBMirrorLocatorRef locator); + +/** + * Increments the reference count of a mirror locator object. + * + * @param locator + * The mirror locator object whose reference count will be incremented. + * @return + * The same mirror locator object passed in as the parameter. + */ +SBMirrorLocatorRef SBMirrorLocatorRetain(SBMirrorLocatorRef locator); + +/** + * Decrements the reference count of a mirror locator object. The object will be deallocated when + * its reference count reaches zero. + * + * @param locator + * The mirror locator object whose reference count will be decremented. + */ +void SBMirrorLocatorRelease(SBMirrorLocatorRef locator); + +#endif diff --git a/lib/sheenbidi/Headers/SBParagraph.h b/lib/sheenbidi/Headers/SBParagraph.h new file mode 100644 index 000000000..07fe59d45 --- /dev/null +++ b/lib/sheenbidi/Headers/SBParagraph.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2014-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_PARAGRAPH_H +#define _SB_PUBLIC_PARAGRAPH_H + +#include "SBBase.h" +#include "SBLine.h" + +typedef struct _SBParagraph *SBParagraphRef; + +/** + * Returns the index to the first code unit of the paragraph in source string. + * + * @param paragraph + * The paragraph whose offset is returned. + * @return + * The offset of the paragraph passed in. + */ +SBUInteger SBParagraphGetOffset(SBParagraphRef paragraph); + +/** + * Returns the number of code units covering the length of the paragraph. + * + * @param paragraph + * The paragraph whose length is returned. + * @return + * The length of the paragraph passed in. + */ +SBUInteger SBParagraphGetLength(SBParagraphRef paragraph); + +/** + * Returns the base level of the paragraph. + * + * @param paragraph + * The paragraph whose base level is returned. + * @return + * The base level of the paragraph passed in. + */ +SBLevel SBParagraphGetBaseLevel(SBParagraphRef paragraph); + +/** + * Returns a direct pointer to the embedding levels, stored in the paragraph. + * + * @param paragraph + * The paragraph from which to access the embedding levels. + * @return + * A valid pointer to an array of SBLevel structures. + */ +const SBLevel *SBParagraphGetLevelsPtr(SBParagraphRef paragraph); + +/** + * Creates a line object of specified range by applying rules L1-L2 of Unicode Bidirectional + * Algorithm. + * + * @param paragraph + * The paragraph that creates the line. + * @param lineOffset + * The index to the first code unit of the line in source string. It should occur within the + * range of paragraph. + * @param lineLength + * The number of code units covering the length of the line. + * @return + * A reference to a line object if the call was successful, NULL otherwise. + */ +SBLineRef SBParagraphCreateLine(SBParagraphRef paragraph, SBUInteger lineOffset, SBUInteger lineLength); + +/** + * Increments the reference count of a paragraph object. + * + * @param paragraph + * The paragraph object whose reference count will be incremented. + * @return + * The same paragraph object passed in as the parameter. + */ +SBParagraphRef SBParagraphRetain(SBParagraphRef paragraph); + +/** + * Decrements the reference count of a paragraph object. The object will be deallocated when its + * reference count reaches zero. + * + * @param paragraph + * The paragraph object whose reference count will be decremented. + */ +void SBParagraphRelease(SBParagraphRef paragraph); + +#endif diff --git a/lib/sheenbidi/Headers/SBRun.h b/lib/sheenbidi/Headers/SBRun.h new file mode 100644 index 000000000..71cbe14c7 --- /dev/null +++ b/lib/sheenbidi/Headers/SBRun.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2016-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_RUN_H +#define _SB_PUBLIC_RUN_H + +#include "SBBase.h" + +/** + * A structure containing the information of a sequence of characters having the same embedding + * level. + */ +typedef struct _SBRun { + SBUInteger offset; /**< The index to the first code unit of the run in source string. */ + SBUInteger length; /**< The number of code units covering the length of the run. */ + SBLevel level; /**< The embedding level of the run. */ +} SBRun; + +#endif diff --git a/lib/sheenbidi/Headers/SBScript.h b/lib/sheenbidi/Headers/SBScript.h new file mode 100644 index 000000000..5d5c9360e --- /dev/null +++ b/lib/sheenbidi/Headers/SBScript.h @@ -0,0 +1,247 @@ +/* + * Copyright (C) 2018-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_SCRIPT_H +#define _SB_PUBLIC_SCRIPT_H + +#include "SBBase.h" + +/** + * Constants that specify the script of a character. + */ +enum { + SBScriptNil = 0x00, + + SBScriptZINH = 0x01, /**< Inherited */ + SBScriptZYYY = 0x02, /**< Common */ + SBScriptZZZZ = 0x03, /**< Unknown */ + + /* Unicode 1.1 */ + SBScriptARAB = 0x04, /**< Arabic */ + SBScriptARMN = 0x05, /**< Armenian */ + SBScriptBENG = 0x06, /**< Bengali */ + SBScriptBOPO = 0x07, /**< Bopomofo */ + SBScriptCYRL = 0x08, /**< Cyrillic */ + SBScriptDEVA = 0x09, /**< Devanagari */ + SBScriptGEOR = 0x0A, /**< Georgian */ + SBScriptGREK = 0x0B, /**< Greek */ + SBScriptGUJR = 0x0C, /**< Gujarati */ + SBScriptGURU = 0x0D, /**< Gurmukhi */ + SBScriptHANG = 0x0E, /**< Hangul */ + SBScriptHANI = 0x0F, /**< Han */ + SBScriptHEBR = 0x10, /**< Hebrew */ + SBScriptHIRA = 0x11, /**< Hiragana */ + SBScriptKANA = 0x12, /**< Katakana */ + SBScriptKNDA = 0x13, /**< Kannada */ + SBScriptLAOO = 0x14, /**< Lao */ + SBScriptLATN = 0x15, /**< Latin */ + SBScriptMLYM = 0x16, /**< Malayalam */ + SBScriptORYA = 0x17, /**< Oriya */ + SBScriptTAML = 0x18, /**< Tamil */ + SBScriptTELU = 0x19, /**< Telugu */ + SBScriptTHAI = 0x1A, /**< Thai */ + + /* Unicode 2.0 */ + SBScriptTIBT = 0x1B, /**< Tibetan */ + + /* Unicode 3.0 */ + SBScriptBRAI = 0x1C, /**< Braille */ + SBScriptCANS = 0x1D, /**< Canadian_Aboriginal */ + SBScriptCHER = 0x1E, /**< Cherokee */ + SBScriptETHI = 0x1F, /**< Ethiopic */ + SBScriptKHMR = 0x20, /**< Khmer */ + SBScriptMONG = 0x21, /**< Mongolian */ + SBScriptMYMR = 0x22, /**< Myanmar */ + SBScriptOGAM = 0x23, /**< Ogham */ + SBScriptRUNR = 0x24, /**< Runic */ + SBScriptSINH = 0x25, /**< Sinhala */ + SBScriptSYRC = 0x26, /**< Syriac */ + SBScriptTHAA = 0x27, /**< Thaana */ + SBScriptYIII = 0x28, /**< Yi */ + + /* Unicode 3.1 */ + SBScriptDSRT = 0x29, /**< Deseret */ + SBScriptGOTH = 0x2A, /**< Gothic */ + SBScriptITAL = 0x2B, /**< Old_Italic */ + + /* Unicode 3.2 */ + SBScriptBUHD = 0x2C, /**< Buhid */ + SBScriptHANO = 0x2D, /**< Hanunoo */ + SBScriptTAGB = 0x2E, /**< Tagbanwa */ + SBScriptTGLG = 0x2F, /**< Tagalog */ + + /* Unicode 4.0 */ + SBScriptCPRT = 0x30, /**< Cypriot */ + SBScriptLIMB = 0x31, /**< Limbu */ + SBScriptLINB = 0x32, /**< Linear_B */ + SBScriptOSMA = 0x33, /**< Osmanya */ + SBScriptSHAW = 0x34, /**< Shavian */ + SBScriptTALE = 0x35, /**< Tai_Le */ + SBScriptUGAR = 0x36, /**< Ugaritic */ + + /* Unicode 4.1 */ + SBScriptBUGI = 0x37, /**< Buginese */ + SBScriptCOPT = 0x38, /**< Coptic */ + SBScriptGLAG = 0x39, /**< Glagolitic */ + SBScriptKHAR = 0x3A, /**< Kharoshthi */ + SBScriptSYLO = 0x3B, /**< Syloti_Nagri */ + SBScriptTALU = 0x3C, /**< New_Tai_Lue */ + SBScriptTFNG = 0x3D, /**< Tifinagh */ + SBScriptXPEO = 0x3E, /**< Old_Persian */ + + /* Unicode 5.0 */ + SBScriptBALI = 0x3F, /**< Balinese */ + SBScriptNKOO = 0x40, /**< Nko */ + SBScriptPHAG = 0x41, /**< Phags_Pa */ + SBScriptPHNX = 0x42, /**< Phoenician */ + SBScriptXSUX = 0x43, /**< Cuneiform */ + + /* Unicode 5.1 */ + SBScriptCARI = 0x44, /**< Carian */ + SBScriptCHAM = 0x45, /**< Cham */ + SBScriptKALI = 0x46, /**< Kayah_Li */ + SBScriptLEPC = 0x47, /**< Lepcha */ + SBScriptLYCI = 0x48, /**< Lycian */ + SBScriptLYDI = 0x49, /**< Lydian */ + SBScriptOLCK = 0x4A, /**< Ol_Chiki */ + SBScriptRJNG = 0x4B, /**< Rejang */ + SBScriptSAUR = 0x4C, /**< Saurashtra */ + SBScriptSUND = 0x4D, /**< Sundanese */ + SBScriptVAII = 0x4E, /**< Vai */ + + /* Unicode 5.2 */ + SBScriptARMI = 0x4F, /**< Imperial_Aramaic */ + SBScriptAVST = 0x50, /**< Avestan */ + SBScriptBAMU = 0x51, /**< Bamum */ + SBScriptEGYP = 0x52, /**< Egyptian_Hieroglyphs */ + SBScriptJAVA = 0x53, /**< Javanese */ + SBScriptKTHI = 0x54, /**< Kaithi */ + SBScriptLANA = 0x55, /**< Tai_Tham */ + SBScriptLISU = 0x56, /**< Lisu */ + SBScriptMTEI = 0x57, /**< Meetei_Mayek */ + SBScriptORKH = 0x58, /**< Old_Turkic */ + SBScriptPHLI = 0x59, /**< Inscriptional_Pahlavi */ + SBScriptPRTI = 0x5A, /**< Inscriptional_Parthian */ + SBScriptSAMR = 0x5B, /**< Samaritan */ + SBScriptSARB = 0x5C, /**< Old_South_Arabian */ + SBScriptTAVT = 0x5D, /**< Tai_Viet */ + + /* Unicode 6.0 */ + SBScriptBATK = 0x5E, /**< Batak */ + SBScriptBRAH = 0x5F, /**< Brahmi */ + SBScriptMAND = 0x60, /**< Mandaic */ + + /* Unicode 6.1 */ + SBScriptCAKM = 0x61, /**< Chakma */ + SBScriptMERC = 0x62, /**< Meroitic_Cursive */ + SBScriptMERO = 0x63, /**< Meroitic_Hieroglyphs */ + SBScriptPLRD = 0x64, /**< Miao */ + SBScriptSHRD = 0x65, /**< Sharada */ + SBScriptSORA = 0x66, /**< Sora_Sompeng */ + SBScriptTAKR = 0x67, /**< Takri */ + + /* Unicode 7.0 */ + SBScriptAGHB = 0x68, /**< Caucasian_Albanian */ + SBScriptBASS = 0x69, /**< Bassa_Vah */ + SBScriptDUPL = 0x6A, /**< Duployan */ + SBScriptELBA = 0x6B, /**< Elbasan */ + SBScriptGRAN = 0x6C, /**< Grantha */ + SBScriptHMNG = 0x6D, /**< Pahawh_Hmong */ + SBScriptKHOJ = 0x6E, /**< Khojki */ + SBScriptLINA = 0x6F, /**< Linear_A */ + SBScriptMAHJ = 0x70, /**< Mahajani */ + SBScriptMANI = 0x71, /**< Manichaean */ + SBScriptMEND = 0x72, /**< Mende_Kikakui */ + SBScriptMODI = 0x73, /**< Modi */ + SBScriptMROO = 0x74, /**< Mro */ + SBScriptNARB = 0x75, /**< Old_North_Arabian */ + SBScriptNBAT = 0x76, /**< Nabataean */ + SBScriptPALM = 0x77, /**< Palmyrene */ + SBScriptPAUC = 0x78, /**< Pau_Cin_Hau */ + SBScriptPERM = 0x79, /**< Old_Permic */ + SBScriptPHLP = 0x7A, /**< Psalter_Pahlavi */ + SBScriptSIDD = 0x7B, /**< Siddham */ + SBScriptSIND = 0x7C, /**< Khudawadi */ + SBScriptTIRH = 0x7D, /**< Tirhuta */ + SBScriptWARA = 0x7E, /**< Warang_Citi */ + + /* Unicode 8.0 */ + SBScriptAHOM = 0x7F, /**< Ahom */ + SBScriptHATR = 0x80, /**< Hatran */ + SBScriptHLUW = 0x81, /**< Anatolian_Hieroglyphs */ + SBScriptHUNG = 0x82, /**< Old_Hungarian */ + SBScriptMULT = 0x83, /**< Multani */ + SBScriptSGNW = 0x84, /**< SignWriting */ + + /* Unicode 9.0 */ + SBScriptADLM = 0x85, /**< Adlam */ + SBScriptBHKS = 0x86, /**< Bhaiksuki */ + SBScriptMARC = 0x87, /**< Marchen */ + SBScriptNEWA = 0x88, /**< Newa */ + SBScriptOSGE = 0x89, /**< Osage */ + SBScriptTANG = 0x8A, /**< Tangut */ + + /* Unicode 10.0 */ + SBScriptGONM = 0x8B, /**< Masaram_Gondi */ + SBScriptNSHU = 0x8C, /**< Nushu */ + SBScriptSOYO = 0x8D, /**< Soyombo */ + SBScriptZANB = 0x8E, /**< Zanabazar_Square */ + + /* Unicode 11.0 */ + SBScriptDOGR = 0x8F, /**< Dogra */ + SBScriptGONG = 0x90, /**< Gunjala_Gondi */ + SBScriptMAKA = 0x91, /**< Makasar */ + SBScriptMEDF = 0x92, /**< Medefaidrin */ + SBScriptROHG = 0x93, /**< Hanifi_Rohingya */ + SBScriptSOGD = 0x94, /**< Sogdian */ + SBScriptSOGO = 0x95, /**< Old_Sogdian */ + + /* Unicode 12.0 */ + SBScriptELYM = 0x96, /**< Elymaic */ + SBScriptHMNP = 0x97, /**< Nyiakeng_Puachue_Hmong */ + SBScriptNAND = 0x98, /**< Nandinagari */ + SBScriptWCHO = 0x99, /**< Wancho */ + + /* Unicde 13.0 */ + SBScriptCHRS = 0x9A, /**< Chorasmian */ + SBScriptDIAK = 0x9B, /**< Dives_Akuru */ + SBScriptKITS = 0x9C, /**< Khitan_Small_Script */ + SBScriptYEZI = 0x9D /**< Yezidi */ +}; + +/** + * A type to represent the script of a character. + */ +typedef SBUInt8 SBScript; + +/** + * Returns the OpenType tag of a script as UInt32 in big endian byte order. The association between + * Unicode Script property and OpenType script tags is taken from the specification: + * https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags. + * + * If more than one tag is associated with a script, then the latest one is retured. For example, + * Devanagari script has two tags, `deva` and `dev2`. So in this case, `dev2` will be returned. + * + * If no tag is associated with a script, then `DFLT` is returned. + * + * @param script + * The script whose OpenType tag is returned. + * @return + * The OpenType tag of specified script as UInt32 in big endian byte order. + */ +SBUInt32 SBScriptGetOpenTypeTag(SBScript script); + +#endif diff --git a/lib/sheenbidi/Headers/SBScriptLocator.h b/lib/sheenbidi/Headers/SBScriptLocator.h new file mode 100644 index 000000000..cad4afbb2 --- /dev/null +++ b/lib/sheenbidi/Headers/SBScriptLocator.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_PUBLIC_SCRIPT_LOCATOR_H +#define _SB_PUBLIC_SCRIPT_LOCATOR_H + +#include "SBBase.h" +#include "SBCodepointSequence.h" +#include "SBScript.h" + +typedef struct _SBScriptLocator *SBScriptLocatorRef; + +/** + * A structure containing the information about a run of code points having same script. + */ +typedef struct _SBScriptAgent { + SBUInteger offset; /**< The index to the first code unit of the run in source string. */ + SBUInteger length; /**< The number of code units covering the length of the run. */ + SBScript script; /**< The script of the run. */ +} SBScriptAgent; + +/** + * Creates a script locator object which can be used to find script runs in a string. + * + * @return + * A reference to a script locator object. + */ +SBScriptLocatorRef SBScriptLocatorCreate(void); + +/** + * Loads a code point sequence in the locator so that its script runs can be located. + * + * @param locator + * The locator in which the code point sequence will be loaded. + * @param codepointSequence + * The code point sequence which will be loaded in the locator. + */ +void SBScriptLocatorLoadCodepoints(SBScriptLocatorRef locator, const SBCodepointSequence *codepointSequence); + +/** + * Returns the agent containing the information of current located script run. + * + * @param locator + * The locator whose agent is returned. + */ +const SBScriptAgent *SBScriptLocatorGetAgent(SBScriptLocatorRef locator); + +/** + * Instructs the locator to find next script run in the loaded code point sequence. + * + * @param locator + * The locator whom you want to instruct. + * @return + * SBTrue if another script run is available, SBFalse otherwise. + * @note + * The locator will be reset after locating last script run. + */ +SBBoolean SBScriptLocatorMoveNext(SBScriptLocatorRef locator); + +/** + * Instructs the locator to reset itself so that script runs of the loaded line can be obatained + * from the beginning. + * + * @param locator + * The locator whom you want to reset. + */ +void SBScriptLocatorReset(SBScriptLocatorRef locator); + +/** + * Increments the reference count of a script locator object. + * + * @param locator + * The script locator object whose reference count will be incremented. + * @return + * The same script locator object passed in as the parameter. + */ +SBScriptLocatorRef SBScriptLocatorRetain(SBScriptLocatorRef locator); + +/** + * Decrements the reference count of a script locator object. The object will be deallocated when + * its reference count reaches zero. + * + * @param locator + * The script locator object whose reference count will be decremented. + */ +void SBScriptLocatorRelease(SBScriptLocatorRef locator); + +#endif diff --git a/lib/sheenbidi/Headers/SheenBidi.h b/lib/sheenbidi/Headers/SheenBidi.h new file mode 100644 index 000000000..96cdd9f07 --- /dev/null +++ b/lib/sheenbidi/Headers/SheenBidi.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2014-2018 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SHEEN_BIDI_H +#define _SHEEN_BIDI_H + +#include "SBAlgorithm.h" +#include "SBBase.h" +#include "SBBidiType.h" +#include "SBCodepoint.h" +#include "SBCodepointSequence.h" +#include "SBGeneralCategory.h" +#include "SBLine.h" +#include "SBMirrorLocator.h" +#include "SBParagraph.h" +#include "SBRun.h" +#include "SBScript.h" +#include "SBScriptLocator.h" + +#endif diff --git a/lib/sheenbidi/LICENSE b/lib/sheenbidi/LICENSE new file mode 100755 index 000000000..d64569567 --- /dev/null +++ b/lib/sheenbidi/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/lib/sheenbidi/README.md b/lib/sheenbidi/README.md new file mode 100644 index 000000000..034824963 --- /dev/null +++ b/lib/sheenbidi/README.md @@ -0,0 +1,107 @@ +SheenBidi +========= +[](https://opensource.org/licenses/Apache-2.0) +[](https://travis-ci.org/Tehreer/SheenBidi) +[](https://ci.appveyor.com/project/mta452/sheenbidi) +[](https://coveralls.io/github/Tehreer/SheenBidi) + +SheenBidi implements Unicode Bidirectional Algorithm available at http://www.unicode.org/reports/tr9. It is a sophisticated implementaion which provides the developers an easy way to use UBA in their applications. + +Here are some of the advantages of SheenBidi. + +* Object based. +* Optimized to the core. +* Designed to be thread safe. +* Lightweight API for interaction. +* Supports UTF-8, UTF-16 and UTF-32 encodings. + +## API +<img src="https://user-images.githubusercontent.com/2664112/39663208-716af1c4-5088-11e8-855c-ababe3e58c58.png" width="350"> +The above screenshot depicts a visual representation of the API on a sample text. + +### SBCodepointSequence +It works as a code point decoder by accepting a string buffer in specified encoding. + +### SBAlgorithm +It provides bidirectional type of each code unit in source string. Paragraph boundaries can be quried from it as determined by rule [P1](https://www.unicode.org/reports/tr9/#P1). Individual paragraph objects can be created from it by explicitly specifying the base level or deriving it from rules [P2](https://www.unicode.org/reports/tr9/#P2)-[P3](https://www.unicode.org/reports/tr9/#P3). + +### SBParagraph +It represents a single paragraph of text processed with rules [X1](https://www.unicode.org/reports/tr9/#X1)-[I2](https://www.unicode.org/reports/tr9/#I2). It provides resolved embedding levels of all the code units of a paragraph. + +### SBLine +It represents a single line of text processed with rules [L1](https://www.unicode.org/reports/tr9/#L1)-[L2](https://www.unicode.org/reports/tr9/#L2). However, it provides reordered level runs instead of reordered characters. + +### SBRun +It represents a sequence of characters which have the same embedding level. The direction of a run would be right-to-left, if its embedding level is odd. + +### SBMirrorLocator +It provides the facility to find out the mirrored characters in a line as determined by rule [L4](https://www.unicode.org/reports/tr9/#L4). + +### SBScriptLocator +Not directly related to UBA but can be useful for text shaping. It provides the facility to find out the script runs as specified in [UAX #24](https://www.unicode.org/reports/tr24/). + +## Dependency +SheenBidi does not depend on any external library. It only uses standard C library headers ```stddef.h```, ```stdint.h``` and ```stdlib.h```. + +## Configuration +The configuration options are available in `Headers/SBConfig.h`. + +* ```SB_CONFIG_LOG``` logs every activity performed in order to apply bidirectional algorithm. +* ```SB_CONFIG_UNITY``` builds the library as a single module and lets the compiler make decisions to inline functions. + +## Compiling +SheenBidi can be compiled with any C compiler. The best way for compiling is to add all the files in an IDE and hit build. The only thing to consider however is that if ```SB_CONFIG_UNITY``` is enabled then only ```Source/SheenBidi.c``` should be compiled. + +## Example +Here is a simple example written in C11. + +```c +#include <stdint.h> +#include <stdio.h> +#include <string.h> + +#include <SheenBidi.h> + +int main(int argc, const char * argv[]) { + /* Create code point sequence for a sample bidirectional text. */ + const char *bidiText = "یہ ایک )car( ہے۔"; + SBCodepointSequence codepointSequence = { SBStringEncodingUTF8, (void *)bidiText, strlen(bidiText) }; + + /* Extract the first bidirectional paragraph. */ + SBAlgorithmRef bidiAlgorithm = SBAlgorithmCreate(&codepointSequence); + SBParagraphRef firstParagraph = SBAlgorithmCreateParagraph(bidiAlgorithm, 0, INT32_MAX, SBLevelDefaultLTR); + SBUInteger paragraphLength = SBParagraphGetLength(firstParagraph); + + /* Create a line consisting of whole paragraph and get its runs. */ + SBLineRef paragraphLine = SBParagraphCreateLine(firstParagraph, 0, paragraphLength); + SBUInteger runCount = SBLineGetRunCount(paragraphLine); + const SBRun *runArray = SBLineGetRunsPtr(paragraphLine); + + /* Log the details of each run in the line. */ + for (SBUInteger i = 0; i < runCount; i++) { + printf("Run Offset: %ld\n", (long)runArray[i].offset); + printf("Run Length: %ld\n", (long)runArray[i].length); + printf("Run Level: %ld\n\n", (long)runArray[i].level); + } + + /* Create a mirror locator and load the line in it. */ + SBMirrorLocatorRef mirrorLocator = SBMirrorLocatorCreate(); + SBMirrorLocatorLoadLine(mirrorLocator, paragraphLine, (void *)bidiText); + const SBMirrorAgent *mirrorAgent = SBMirrorLocatorGetAgent(mirrorLocator); + + /* Log the details of each mirror in the line. */ + while (SBMirrorLocatorMoveNext(mirrorLocator)) { + printf("Mirror Index: %ld\n", (long)mirrorAgent->index); + printf("Actual Code Point: %ld\n", (long)mirrorAgent->codepoint); + printf("Mirrored Code Point: %ld\n\n", (long)mirrorAgent->mirror); + } + + /* Release all objects. */ + SBMirrorLocatorRelease(mirrorLocator); + SBLineRelease(paragraphLine); + SBParagraphRelease(firstParagraph); + SBAlgorithmRelease(bidiAlgorithm); + + return 0; +} +``` diff --git a/lib/sheenbidi/Source/BidiChain.c b/lib/sheenbidi/Source/BidiChain.c new file mode 100644 index 000000000..0f80d6b16 --- /dev/null +++ b/lib/sheenbidi/Source/BidiChain.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> + +#include "SBBase.h" +#include "BidiChain.h" + +SB_INTERNAL void BidiChainInitialize(BidiChainRef chain, + SBBidiType *types, SBLevel *levels, BidiLink *links) +{ + chain->types = types; + chain->levels = levels; + chain->links = links; + chain->roller = 0; + chain->last = 0; + + /* Make first link empty. */ + chain->types[0] = SBBidiTypeNil; + chain->levels[0] = SBLevelInvalid; + chain->links[0] = BidiLinkNone; +} + +SB_INTERNAL void BidiChainAdd(BidiChainRef chain, SBBidiType type, SBUInteger length) +{ + BidiLink last = chain->last; + BidiLink current = last + (SBUInt32)length; + + chain->types[current] = type; + chain->links[current] = chain->roller; + + chain->links[last] = current; + chain->last = current; +} + +SB_INTERNAL SBBoolean BidiChainIsSingle(BidiChainRef chain, BidiLink link) +{ + BidiLink next = chain->links[link]; + + /* Check the type of in between code units. */ + while (++link != next) { + if (chain->types[link] != SBBidiTypeBN) { + return SBFalse; + } + } + + return SBTrue; +} + +SB_INTERNAL SBBidiType BidiChainGetType(BidiChainRef chain, BidiLink link) +{ + return chain->types[link]; +} + +SB_INTERNAL void BidiChainSetType(BidiChainRef chain, BidiLink link, SBBidiType type) +{ + chain->types[link] = type; +} + +SB_INTERNAL SBLevel BidiChainGetLevel(BidiChainRef chain, BidiLink link) +{ + return chain->levels[link]; +} + +SB_INTERNAL void BidiChainSetLevel(BidiChainRef chain, BidiLink link, SBLevel level) +{ + chain->levels[link] = level; +} + +SB_INTERNAL BidiLink BidiChainGetNext(BidiChainRef chain, BidiLink link) +{ + return chain->links[link]; +} + +SB_INTERNAL void BidiChainSetNext(BidiChainRef chain, BidiLink link, BidiLink next) +{ + chain->links[link] = next; +} + +SB_INTERNAL void BidiChainAbandonNext(BidiChainRef chain, BidiLink link) +{ + BidiLink next = chain->links[link]; + BidiLink limit = chain->links[next]; + + chain->links[link] = limit; +} + +SB_INTERNAL SBBoolean BidiChainMergeIfEqual(BidiChainRef chain, BidiLink first, BidiLink second) +{ + if (chain->types[first] == chain->types[second] + && chain->levels[first] == chain->levels[second]) { + chain->links[first] = chain->links[second]; + return SBTrue; + } + + return SBFalse; +} diff --git a/lib/sheenbidi/Source/BidiChain.h b/lib/sheenbidi/Source/BidiChain.h new file mode 100644 index 000000000..4b378c335 --- /dev/null +++ b/lib/sheenbidi/Source/BidiChain.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_BIDI_CHAIN_H +#define _SB_INTERNAL_BIDI_CHAIN_H + +#include <SBConfig.h> +#include "SBBase.h" + +typedef SBUInt32 BidiLink; + +#define BidiLinkNone (SBUInt32)(-1) + +typedef struct _BidiChain { + SBBidiType *types; + SBLevel *levels; + BidiLink *links; + BidiLink roller; + BidiLink last; +} BidiChain, *BidiChainRef; + +SB_INTERNAL void BidiChainInitialize(BidiChainRef chain, + SBBidiType *types, SBLevel *levels, BidiLink *links); +SB_INTERNAL void BidiChainAdd(BidiChainRef chain, SBBidiType type, SBUInteger length); + +#define BidiChainGetOffset(chain, link) \ +( \ + (link) - 1 \ +) + +SB_INTERNAL SBBoolean BidiChainIsSingle(BidiChainRef chain, BidiLink link); + +SB_INTERNAL SBBidiType BidiChainGetType(BidiChainRef chain, BidiLink link); +SB_INTERNAL void BidiChainSetType(BidiChainRef chain, BidiLink link, SBBidiType type); + +SB_INTERNAL SBLevel BidiChainGetLevel(BidiChainRef chain, BidiLink link); +SB_INTERNAL void BidiChainSetLevel(BidiChainRef chain, BidiLink link, SBLevel level); + +SB_INTERNAL BidiLink BidiChainGetNext(BidiChainRef chain, BidiLink link); +SB_INTERNAL void BidiChainSetNext(BidiChainRef chain, BidiLink link, BidiLink next); +SB_INTERNAL void BidiChainAbandonNext(BidiChainRef chain, BidiLink link); +SB_INTERNAL SBBoolean BidiChainMergeIfEqual(BidiChainRef chain, BidiLink first, BidiLink second); + +#define BidiChainForEach(chain, roller, link) \ + for (link = chain->links[roller]; link != roller; link = chain->links[link]) + +#endif diff --git a/lib/sheenbidi/Source/BidiTypeLookup.c b/lib/sheenbidi/Source/BidiTypeLookup.c new file mode 100644 index 000000000..b448e061e --- /dev/null +++ b/lib/sheenbidi/Source/BidiTypeLookup.c @@ -0,0 +1,1014 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + * + * REQUIRED MEMORY: 4448+(2624*2)+(1088*2) = 11872 Bytes + */ + +#include "BidiTypeLookup.h" + +#define AL SBBidiTypeAL +#define AN SBBidiTypeAN +#define B SBBidiTypeB +#define BN SBBidiTypeBN +#define CS SBBidiTypeCS +#define EN SBBidiTypeEN +#define ES SBBidiTypeES +#define ET SBBidiTypeET +#define FSI SBBidiTypeFSI +#define L SBBidiTypeL +#define LRE SBBidiTypeLRE +#define LRI SBBidiTypeLRI +#define LRO SBBidiTypeLRO +#define NSM SBBidiTypeNSM +#define ON SBBidiTypeON +#define PDF SBBidiTypePDF +#define PDI SBBidiTypePDI +#define R SBBidiTypeR +#define RLE SBBidiTypeRLE +#define RLI SBBidiTypeRLI +#define RLO SBBidiTypeRLO +#define S SBBidiTypeS +#define WS SBBidiTypeWS + +static const SBUInt8 PrimaryBidiTypeData[4448] = { +/* DATA_BLOCK: -- 0x0000..0x000F -- */ + BN, BN, BN, BN, BN, BN, BN, BN, BN, S, B, S, WS, B, BN, BN, +/* DATA_BLOCK: -- 0x0010..0x001F -- */ + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, B, B, B, S, +/* DATA_BLOCK: -- 0x0020..0x002F -- */ + WS, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ES, CS, ES, CS, CS, +/* DATA_BLOCK: -- 0x0030..0x003F -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, CS, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0040..0x004F -- */ + ON, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0050..0x005F -- */ + L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0060..0x006F -- */ + L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, ON, BN, +/* DATA_BLOCK: -- 0x0070..0x007F -- */ + BN, BN, BN, BN, BN, B, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, +/* DATA_BLOCK: -- 0x0080..0x008F -- */ + BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, BN, +/* DATA_BLOCK: -- 0x0090..0x009F -- */ + CS, ON, ET, ET, ET, ET, ON, ON, ON, ON, L, ON, ON, BN, ON, ON, +/* DATA_BLOCK: -- 0x00A0..0x00AF -- */ + ET, ET, EN, EN, ON, L, ON, ON, ON, EN, L, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x00B0..0x00BF -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x00C0..0x00CF -- */ + L, L, L, L, L, L, L, ON, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x00D0..0x00DF -- */ + L, L, L, L, L, L, L, L, L, ON, ON, L, L, L, L, L, +/* DATA_BLOCK: -- 0x00E0..0x00EF -- */ + L, L, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x00F0..0x00FF -- */ + L, L, L, L, L, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, ON, +/* DATA_BLOCK: -- 0x0100..0x010F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0110..0x011F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0120..0x012F -- */ + L, L, L, L, ON, ON, L, L, L, L, L, L, L, L, ON, L, +/* DATA_BLOCK: -- 0x0130..0x013F -- */ + L, L, L, L, ON, ON, L, ON, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0140..0x014F -- */ + L, L, L, L, L, L, ON, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0150..0x015F -- */ + L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0160..0x016F -- */ + L, L, L, L, L, L, L, L, L, L, ON, L, L, ON, ON, ET, +/* DATA_BLOCK: -- 0x0170..0x017F -- */ + R, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0180..0x018F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, R, NSM, +/* DATA_BLOCK: -- 0x0190..0x019F -- */ + R, NSM, NSM, R, NSM, NSM, R, NSM, R, R, R, R, R, R, R, R, +/* DATA_BLOCK: -- 0x01A0..0x01AF -- */ + R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, +/* DATA_BLOCK: -- 0x01B0..0x01BF -- */ + AN, AN, AN, AN, AN, AN, ON, ON, AL, ET, ET, AL, CS, AL, ON, ON, +/* DATA_BLOCK: -- 0x01C0..0x01CF -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x01D0..0x01DF -- */ + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x01E0..0x01EF -- */ + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x01F0..0x01FF -- */ + AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, ET, AN, AN, AL, AL, AL, +/* DATA_BLOCK: -- 0x0200..0x020F -- */ + NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x0210..0x021F -- */ + AL, AL, AL, AL, AL, AL, NSM, NSM, NSM, NSM, NSM, NSM, NSM, AN, ON, NSM, +/* DATA_BLOCK: -- 0x0220..0x022F -- */ + NSM, NSM, NSM, NSM, NSM, AL, AL, NSM, NSM, ON, NSM, NSM, NSM, NSM, AL, AL, +/* DATA_BLOCK: -- 0x0230..0x023F -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x0240..0x024F -- */ + AL, NSM, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x0250..0x025F -- */ + AL, AL, AL, AL, AL, AL, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0260..0x026F -- */ + R, R, R, R, R, R, R, R, R, R, R, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0270..0x027F -- */ + NSM, NSM, NSM, NSM, R, R, ON, ON, ON, ON, R, R, R, NSM, R, R, +/* DATA_BLOCK: -- 0x0280..0x028F -- */ + R, R, R, R, R, R, NSM, NSM, NSM, NSM, R, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0290..0x029F -- */ + NSM, NSM, NSM, NSM, R, NSM, NSM, NSM, R, NSM, NSM, NSM, NSM, NSM, R, R, +/* DATA_BLOCK: -- 0x02A0..0x02AF -- */ + R, R, R, R, R, R, R, R, R, NSM, NSM, NSM, R, R, R, R, +/* DATA_BLOCK: -- 0x02B0..0x02BF -- */ + AL, AL, AL, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x02C0..0x02CF -- */ + NSM, NSM, AN, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x02D0..0x02DF -- */ + NSM, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x02E0..0x02EF -- */ + L, L, L, L, L, L, L, L, L, L, NSM, L, NSM, L, L, L, +/* DATA_BLOCK: -- 0x02F0..0x02FF -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x0300..0x030F -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0310..0x031F -- */ + L, L, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0320..0x032F -- */ + L, NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0330..0x033F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, NSM, L, L, L, +/* DATA_BLOCK: -- 0x0340..0x034F -- */ + L, NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x0350..0x035F -- */ + L, L, ET, ET, L, L, L, L, L, L, L, ET, L, L, NSM, L, +/* DATA_BLOCK: -- 0x0360..0x036F -- */ + L, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0370..0x037F -- */ + L, NSM, NSM, L, L, L, L, NSM, NSM, L, L, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0380..0x038F -- */ + NSM, NSM, L, L, L, NSM, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0390..0x039F -- */ + L, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x03A0..0x03AF -- */ + L, ET, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x03B0..0x03BF -- */ + L, L, L, L, L, L, L, L, L, L, L, L, NSM, L, L, NSM, +/* DATA_BLOCK: -- 0x03C0..0x03CF -- */ + L, L, L, L, L, NSM, NSM, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x03D0..0x03DF -- */ + L, L, NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x03E0..0x03EF -- */ + NSM, L, L, L, L, L, L, L, L, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x03F0..0x03FF -- */ + L, L, L, ON, ON, ON, ON, ON, ON, ET, ON, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0400..0x040F -- */ + NSM, L, L, L, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0410..0x041F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, +/* DATA_BLOCK: -- 0x0420..0x042F -- */ + NSM, L, L, L, L, L, NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0430..0x043F -- */ + L, L, L, L, L, L, L, L, ON, ON, ON, ON, ON, ON, ON, L, +/* DATA_BLOCK: -- 0x0440..0x044F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0450..0x045F -- */ + NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0460..0x046F -- */ + L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, L, L, L, +/* DATA_BLOCK: -- 0x0470..0x047F -- */ + L, L, L, L, L, L, L, L, L, L, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0480..0x048F -- */ + L, L, NSM, NSM, NSM, L, NSM, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0490..0x049F -- */ + L, NSM, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, ET, +/* DATA_BLOCK: -- 0x04A0..0x04AF -- */ + L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, +/* DATA_BLOCK: -- 0x04B0..0x04BF -- */ + L, NSM, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, +/* DATA_BLOCK: -- 0x04C0..0x04CF -- */ + L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x04D0..0x04DF -- */ + L, L, L, L, L, L, L, L, NSM, NSM, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x04E0..0x04EF -- */ + L, L, L, L, L, NSM, L, NSM, L, NSM, ON, ON, ON, ON, L, L, +/* DATA_BLOCK: -- 0x04F0..0x04FF -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, +/* DATA_BLOCK: -- 0x0500..0x050F -- */ + NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, L, L, L, L, L, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0510..0x051F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0520..0x052F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, +/* DATA_BLOCK: -- 0x0530..0x053F -- */ + L, L, L, L, L, L, NSM, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0540..0x054F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0550..0x055F -- */ + NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, L, L, NSM, NSM, L, +/* DATA_BLOCK: -- 0x0560..0x056F -- */ + L, L, L, L, L, L, L, L, NSM, NSM, L, L, L, L, NSM, NSM, +/* DATA_BLOCK: -- 0x0570..0x057F -- */ + NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0580..0x058F -- */ + L, NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0590..0x059F -- */ + L, L, NSM, L, L, NSM, NSM, L, L, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x05A0..0x05AF -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x05B0..0x05BF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x05C0..0x05CF -- */ + WS, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x05D0..0x05DF -- */ + L, L, L, L, L, L, L, L, L, L, L, ON, ON, L, L, L, +/* DATA_BLOCK: -- 0x05E0..0x05EF -- */ + L, L, NSM, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x05F0..0x05FF -- */ + L, L, L, L, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0600..0x060F -- */ + L, L, L, L, L, L, NSM, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0610..0x061F -- */ + NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, ET, L, NSM, L, L, +/* DATA_BLOCK: -- 0x0620..0x062F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, NSM, NSM, NSM, BN, L, +/* DATA_BLOCK: -- 0x0630..0x063F -- */ + L, L, L, L, L, L, L, L, L, NSM, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0640..0x064F -- */ + NSM, NSM, NSM, L, L, L, L, NSM, NSM, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0650..0x065F -- */ + L, L, NSM, L, L, L, L, L, L, NSM, NSM, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0660..0x066F -- */ + ON, L, L, L, ON, ON, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0670..0x067F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, ON, ON, +/* DATA_BLOCK: -- 0x0680..0x068F -- */ + L, L, L, L, L, L, L, NSM, NSM, L, L, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0690..0x069F -- */ + L, L, L, L, L, L, NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, +/* DATA_BLOCK: -- 0x06A0..0x06AF -- */ + NSM, L, NSM, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, +/* DATA_BLOCK: -- 0x06B0..0x06BF -- */ + L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, +/* DATA_BLOCK: -- 0x06C0..0x06CF -- */ + NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x06D0..0x06DF -- */ + L, L, L, L, NSM, L, NSM, NSM, NSM, NSM, NSM, L, NSM, L, L, L, +/* DATA_BLOCK: -- 0x06E0..0x06EF -- */ + L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x06F0..0x06FF -- */ + L, L, NSM, NSM, NSM, NSM, L, L, NSM, NSM, L, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0700..0x070F -- */ + L, L, L, L, L, L, NSM, L, NSM, NSM, L, L, L, NSM, L, NSM, +/* DATA_BLOCK: -- 0x0710..0x071F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0720..0x072F -- */ + NSM, NSM, NSM, NSM, L, L, NSM, NSM, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0730..0x073F -- */ + NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0740..0x074F -- */ + NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x0750..0x075F -- */ + L, L, L, L, NSM, L, L, L, NSM, NSM, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0760..0x076F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0770..0x077F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, ON, L, ON, +/* DATA_BLOCK: -- 0x0780..0x078F -- */ + ON, ON, L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, +/* DATA_BLOCK: -- 0x0790..0x079F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, +/* DATA_BLOCK: -- 0x07A0..0x07AF -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, ON, ON, L, +/* DATA_BLOCK: -- 0x07B0..0x07BF -- */ + WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, WS, BN, BN, BN, L, R, +/* DATA_BLOCK: -- 0x07C0..0x07CF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, WS, B, LRE, RLE, PDF, LRO, RLO, CS, +/* DATA_BLOCK: -- 0x07D0..0x07DF -- */ + ET, ET, ET, ET, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x07E0..0x07EF -- */ + ON, ON, ON, ON, CS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x07F0..0x07FF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, WS, +/* DATA_BLOCK: -- 0x0800..0x080F -- */ + BN, BN, BN, BN, BN, BN, LRI, RLI, FSI, PDI, BN, BN, BN, BN, BN, BN, +/* DATA_BLOCK: -- 0x0810..0x081F -- */ + EN, L, L, L, EN, EN, EN, EN, EN, EN, ES, ES, ON, ON, ON, L, +/* DATA_BLOCK: -- 0x0820..0x082F -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, ES, ES, ON, ON, ON, L, +/* DATA_BLOCK: -- 0x0830..0x083F -- */ + ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, ET, +/* DATA_BLOCK: -- 0x0840..0x084F -- */ + ON, ON, L, ON, ON, ON, ON, L, ON, ON, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0850..0x085F -- */ + L, L, L, L, ON, L, ON, ON, ON, L, L, L, L, L, ON, ON, +/* DATA_BLOCK: -- 0x0860..0x086F -- */ + ON, ON, ON, ON, L, ON, L, ON, L, ON, L, L, L, L, ET, L, +/* DATA_BLOCK: -- 0x0870..0x087F -- */ + L, L, L, L, L, L, L, L, L, L, ON, ON, L, L, L, L, +/* DATA_BLOCK: -- 0x0880..0x088F -- */ + ON, ON, ON, ON, ON, L, L, L, L, L, ON, ON, ON, ON, L, L, +/* DATA_BLOCK: -- 0x0890..0x089F -- */ + L, L, L, L, L, L, L, L, L, ON, ON, ON, L, L, L, L, +/* DATA_BLOCK: -- 0x08A0..0x08AF -- */ + ON, ON, ES, ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x08B0..0x08BF -- */ + ON, ON, ON, ON, ON, ON, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x08C0..0x08CF -- */ + ON, ON, ON, ON, ON, L, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x08D0..0x08DF -- */ + ON, ON, ON, ON, ON, ON, ON, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x08E0..0x08EF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, L, L, L, L, +/* DATA_BLOCK: -- 0x08F0..0x08FF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, EN, EN, EN, EN, EN, EN, EN, EN, +/* DATA_BLOCK: -- 0x0900..0x090F -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, L, L, L, L, +/* DATA_BLOCK: -- 0x0910..0x091F -- */ + L, L, L, L, L, L, L, L, L, L, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0920..0x092F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, ON, ON, ON, +/* DATA_BLOCK: -- 0x0930..0x093F -- */ + ON, ON, ON, ON, L, L, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0940..0x094F -- */ + ON, ON, ON, ON, ON, ON, L, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0950..0x095F -- */ + L, L, L, L, L, ON, ON, ON, ON, ON, ON, L, L, L, L, NSM, +/* DATA_BLOCK: -- 0x0960..0x096F -- */ + NSM, NSM, L, L, L, L, L, L, L, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0970..0x097F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, +/* DATA_BLOCK: -- 0x0980..0x098F -- */ + ON, ON, ON, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0990..0x099F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x09A0..0x09AF -- */ + ON, ON, ON, ON, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x09B0..0x09BF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, L, L, L, +/* DATA_BLOCK: -- 0x09C0..0x09CF -- */ + WS, ON, ON, ON, ON, L, L, L, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x09D0..0x09DF -- */ + ON, L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x09E0..0x09EF -- */ + ON, L, L, L, L, L, ON, ON, L, L, L, L, L, ON, ON, ON, +/* DATA_BLOCK: -- 0x09F0..0x09FF -- */ + L, L, L, L, L, L, L, L, L, NSM, NSM, ON, ON, L, L, L, +/* DATA_BLOCK: -- 0x0A00..0x0A0F -- */ + L, L, L, L, L, L, L, L, L, L, L, ON, L, L, L, L, +/* DATA_BLOCK: -- 0x0A10..0x0A1F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, L, +/* DATA_BLOCK: -- 0x0A20..0x0A2F -- */ + L, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0A30..0x0A3F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0A40..0x0A4F -- */ + L, L, L, L, L, L, L, ON, ON, ON, ON, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0A50..0x0A5F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, ON, +/* DATA_BLOCK: -- 0x0A60..0x0A6F -- */ + NSM, NSM, NSM, ON, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, ON, ON, +/* DATA_BLOCK: -- 0x0A70..0x0A7F -- */ + ON, ON, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0A80..0x0A8F -- */ + L, L, L, L, L, L, L, L, ON, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0A90..0x0A9F -- */ + L, L, NSM, L, L, L, NSM, L, L, L, L, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0AA0..0x0AAF -- */ + L, L, L, L, L, NSM, NSM, L, ON, ON, ON, ON, NSM, L, L, L, +/* DATA_BLOCK: -- 0x0AB0..0x0ABF -- */ + L, L, L, L, L, L, L, L, ET, ET, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0AC0..0x0ACF -- */ + L, L, L, L, ON, ON, ON, ON, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0AD0..0x0ADF -- */ + L, L, L, L, NSM, NSM, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0AE0..0x0AEF -- */ + NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, +/* DATA_BLOCK: -- 0x0AF0..0x0AFF -- */ + L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0B00..0x0B0F -- */ + L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0B10..0x0B1F -- */ + L, L, L, NSM, L, L, NSM, NSM, NSM, NSM, L, L, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0B20..0x0B2F -- */ + L, L, L, L, L, NSM, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0B30..0x0B3F -- */ + L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, L, +/* DATA_BLOCK: -- 0x0B40..0x0B4F -- */ + L, NSM, NSM, L, L, NSM, NSM, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0B50..0x0B5F -- */ + L, L, L, NSM, L, L, L, L, L, L, L, L, NSM, L, L, L, +/* DATA_BLOCK: -- 0x0B60..0x0B6F -- */ + NSM, L, NSM, NSM, NSM, L, L, NSM, NSM, L, L, L, L, L, NSM, NSM, +/* DATA_BLOCK: -- 0x0B70..0x0B7F -- */ + L, L, L, L, L, NSM, L, L, NSM, L, L, L, L, NSM, L, L, +/* DATA_BLOCK: -- 0x0B80..0x0B8F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, R, NSM, R, +/* DATA_BLOCK: -- 0x0B90..0x0B9F -- */ + R, R, R, R, R, R, R, R, R, ES, R, R, R, R, R, R, +/* DATA_BLOCK: -- 0x0BA0..0x0BAF -- */ + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, ON, ON, +/* DATA_BLOCK: -- 0x0BB0..0x0BBF -- */ + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, ON, AL, AL, +/* DATA_BLOCK: -- 0x0BC0..0x0BCF -- */ + CS, ON, CS, L, ON, CS, ON, ON, ON, ON, ON, ON, ON, ON, ON, ET, +/* DATA_BLOCK: -- 0x0BD0..0x0BDF -- */ + ON, ON, ES, ES, ON, ON, ON, L, ON, ET, ET, ON, L, L, L, L, +/* DATA_BLOCK: -- 0x0BE0..0x0BEF -- */ + AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, BN, +/* DATA_BLOCK: -- 0x0BF0..0x0BFF -- */ + L, ON, ON, ET, ET, ET, ON, ON, ON, ON, ON, ES, CS, ES, CS, CS, +/* DATA_BLOCK: -- 0x0C00..0x0C0F -- */ + ET, ET, ON, ON, ON, ET, ET, L, ON, ON, ON, ON, ON, ON, ON, L, +/* DATA_BLOCK: -- 0x0C10..0x0C1F -- */ + BN, BN, BN, BN, BN, BN, BN, BN, BN, ON, ON, ON, ON, ON, BN, BN, +/* DATA_BLOCK: -- 0x0C20..0x0C2F -- */ + L, ON, L, L, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0C30..0x0C3F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, L, L, +/* DATA_BLOCK: -- 0x0C40..0x0C4F -- */ + NSM, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, +/* DATA_BLOCK: -- 0x0C50..0x0C5F -- */ + L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0C60..0x0C6F -- */ + R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, ON, +/* DATA_BLOCK: -- 0x0C70..0x0C7F -- */ + R, NSM, NSM, NSM, R, NSM, NSM, R, R, R, R, R, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0C80..0x0C8F -- */ + R, R, R, R, R, R, R, R, NSM, NSM, NSM, R, R, R, R, NSM, +/* DATA_BLOCK: -- 0x0C90..0x0C9F -- */ + R, R, R, R, R, NSM, NSM, R, R, R, R, R, R, R, R, R, +/* DATA_BLOCK: -- 0x0CA0..0x0CAF -- */ + R, R, R, R, R, R, R, R, R, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0CB0..0x0CBF -- */ + AL, AL, AL, AL, NSM, NSM, NSM, NSM, AL, AL, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x0CC0..0x0CCF -- */ + AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x0CD0..0x0CDF -- */ + AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, +/* DATA_BLOCK: -- 0x0CE0..0x0CEF -- */ + AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, AN, R, +/* DATA_BLOCK: -- 0x0CF0..0x0CFF -- */ + R, R, R, R, R, R, R, R, R, R, R, NSM, NSM, R, R, R, +/* DATA_BLOCK: -- 0x0D00..0x0D0F -- */ + L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0D10..0x0D1F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0D20..0x0D2F -- */ + L, L, L, NSM, NSM, NSM, NSM, L, L, NSM, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0D30..0x0D3F -- */ + L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0D40..0x0D4F -- */ + NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0D50..0x0D5F -- */ + L, L, L, NSM, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0D60..0x0D6F -- */ + L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, +/* DATA_BLOCK: -- 0x0D70..0x0D7F -- */ + L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, L, L, NSM, +/* DATA_BLOCK: -- 0x0D80..0x0D8F -- */ + NSM, NSM, L, L, NSM, L, NSM, NSM, L, L, L, L, L, L, NSM, L, +/* DATA_BLOCK: -- 0x0D90..0x0D9F -- */ + L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0DA0..0x0DAF -- */ + L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, +/* DATA_BLOCK: -- 0x0DB0..0x0DBF -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, L, +/* DATA_BLOCK: -- 0x0DC0..0x0DCF -- */ + L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, L, L, L, L, NSM, +/* DATA_BLOCK: -- 0x0DD0..0x0DDF -- */ + NSM, L, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0DE0..0x0DEF -- */ + L, L, NSM, NSM, NSM, NSM, L, L, L, L, L, L, NSM, NSM, L, NSM, +/* DATA_BLOCK: -- 0x0DF0..0x0DFF -- */ + L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, L, NSM, +/* DATA_BLOCK: -- 0x0E00..0x0E0F -- */ + L, L, L, L, L, L, L, L, L, L, L, NSM, L, NSM, L, L, +/* DATA_BLOCK: -- 0x0E10..0x0E1F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0E20..0x0E2F -- */ + L, L, NSM, NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0E30..0x0E3F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0E40..0x0E4F -- */ + L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, L, NSM, L, +/* DATA_BLOCK: -- 0x0E50..0x0E5F -- */ + L, L, L, L, NSM, NSM, NSM, NSM, L, L, NSM, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0E60..0x0E6F -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0E70..0x0E7F -- */ + L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, NSM, NSM, NSM, L, +/* DATA_BLOCK: -- 0x0E80..0x0E8F -- */ + L, L, L, L, L, L, L, NSM, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0E90..0x0E9F -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, NSM, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0EA0..0x0EAF -- */ + L, L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0EB0..0x0EBF -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0EC0..0x0ECF -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0ED0..0x0EDF -- */ + L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0EE0..0x0EEF -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0EF0..0x0EFF -- */ + NSM, L, NSM, NSM, L, NSM, NSM, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0F00..0x0F0F -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, NSM, L, NSM, NSM, L, NSM, +/* DATA_BLOCK: -- 0x0F10..0x0F1F -- */ + NSM, NSM, L, L, L, NSM, L, NSM, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0F20..0x0F2F -- */ + L, L, L, NSM, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0F30..0x0F3F -- */ + L, L, L, L, L, ON, ON, ON, ON, ON, ON, ON, ON, ET, ET, ET, +/* DATA_BLOCK: -- 0x0F40..0x0F4F -- */ + ET, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x0F50..0x0F5F -- */ + L, L, ON, L, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0F60..0x0F6F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, NSM, NSM, L, +/* DATA_BLOCK: -- 0x0F70..0x0F7F -- */ + BN, BN, BN, BN, L, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0F80..0x0F8F -- */ + L, L, L, L, L, L, L, NSM, NSM, NSM, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0F90..0x0F9F -- */ + L, L, L, BN, BN, BN, BN, BN, BN, BN, BN, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x0FA0..0x0FAF -- */ + NSM, NSM, NSM, L, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, +/* DATA_BLOCK: -- 0x0FB0..0x0FBF -- */ + L, L, L, L, L, L, L, L, L, L, NSM, NSM, NSM, NSM, L, L, +/* DATA_BLOCK: -- 0x0FC0..0x0FCF -- */ + ON, ON, NSM, NSM, NSM, ON, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0FD0..0x0FDF -- */ + L, L, L, L, L, ON, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0FE0..0x0FEF -- */ + L, L, L, L, L, L, L, L, L, ON, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x0FF0..0x0FFF -- */ + L, L, L, ON, L, L, L, L, L, L, L, L, L, L, EN, EN, +/* DATA_BLOCK: -- 0x1000..0x100F -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, +/* DATA_BLOCK: -- 0x1010..0x101F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, L, L, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x1020..0x102F -- */ + L, L, L, L, NSM, L, L, L, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x1030..0x103F -- */ + L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x1040..0x104F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x1050..0x105F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, NSM, L, L, NSM, NSM, NSM, NSM, NSM, +/* DATA_BLOCK: -- 0x1060..0x106F -- */ + NSM, NSM, L, NSM, NSM, L, NSM, NSM, NSM, NSM, NSM, L, L, L, L, L, +/* DATA_BLOCK: -- 0x1070..0x107F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, ET, +/* DATA_BLOCK: -- 0x1080..0x108F -- */ + NSM, NSM, NSM, NSM, NSM, NSM, NSM, R, R, R, R, R, R, R, R, R, +/* DATA_BLOCK: -- 0x1090..0x109F -- */ + R, R, R, R, NSM, NSM, NSM, NSM, NSM, NSM, NSM, R, R, R, R, R, +/* DATA_BLOCK: -- 0x10A0..0x10AF -- */ + ON, ON, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, AL, +/* DATA_BLOCK: -- 0x10B0..0x10BF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, +/* DATA_BLOCK: -- 0x10C0..0x10CF -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x10D0..0x10DF -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, ON, L, L, +/* DATA_BLOCK: -- 0x10E0..0x10EF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, L, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x10F0..0x10FF -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, L, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x1100..0x110F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, L, L, +/* DATA_BLOCK: -- 0x1110..0x111F -- */ + ON, ON, ON, ON, ON, ON, ON, ON, ON, L, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x1120..0x112F -- */ + ON, ON, ON, ON, ON, L, L, L, ON, ON, ON, L, L, L, L, L, +/* DATA_BLOCK: -- 0x1130..0x113F -- */ + ON, ON, ON, L, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, ON, +/* DATA_BLOCK: -- 0x1140..0x114F -- */ + EN, EN, EN, EN, EN, EN, EN, EN, EN, EN, L, L, L, L, L, L, +/* DATA_BLOCK: -- 0x1150..0x115F -- */ + L, L, L, L, L, L, L, L, L, L, L, L, L, L, BN, BN +}; + +static const SBUInt16 MainBidiTypeIndexes[2624] = { +/* INDEX_BLOCK: -- 0x0000..0x003F -- */ + 0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0040, 0x0060, 0x0070, 0x0080, 0x0090, 0x00A0, + 0x00B0, 0x00C0, 0x00B0, 0x00C0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00D0, 0x00E0, 0x00E0, 0x00F0, 0x0100, + 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0120, 0x0130, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x0140, +/* INDEX_BLOCK: -- 0x0040..0x007F -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0150, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x0160, 0x0170, 0x0110, 0x0180, 0x0190, 0x01A0, 0x01A0, 0x01A0, 0x01B0, 0x01C0, 0x01D0, 0x01D0, + 0x01E0, 0x0110, 0x01F0, 0x0200, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0210, 0x0220, 0x0230, + 0x01D0, 0x0240, 0x01D0, 0x0110, 0x01C0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0250, 0x0200, + 0x01A0, 0x01A0, 0x0260, 0x0270, +/* INDEX_BLOCK: -- 0x0080..0x00BF -- */ + 0x01A0, 0x0280, 0x0290, 0x01A0, 0x01A0, 0x02A0, 0x01D0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, + 0x01D0, 0x02B0, 0x02C0, 0x0110, 0x02D0, 0x00B0, 0x00B0, 0x02E0, 0x02F0, 0x0300, 0x0310, 0x00B0, + 0x0320, 0x00B0, 0x00B0, 0x0330, 0x0340, 0x00B0, 0x0310, 0x0350, 0x0360, 0x00B0, 0x00B0, 0x0330, + 0x0370, 0x0320, 0x00B0, 0x0380, 0x0360, 0x00B0, 0x00B0, 0x0330, 0x0390, 0x00B0, 0x0310, 0x03A0, + 0x0320, 0x00B0, 0x00B0, 0x03B0, 0x0340, 0x03C0, 0x0310, 0x00B0, 0x03D0, 0x00B0, 0x00B0, 0x00B0, + 0x03E0, 0x00B0, 0x00B0, 0x03F0, +/* INDEX_BLOCK: -- 0x00C0..0x00FF -- */ + 0x0400, 0x00B0, 0x00B0, 0x0410, 0x0420, 0x03C0, 0x0310, 0x0430, 0x0320, 0x00B0, 0x00B0, 0x0330, + 0x0440, 0x00B0, 0x0310, 0x00B0, 0x0450, 0x00B0, 0x00B0, 0x0460, 0x0340, 0x00B0, 0x0310, 0x00B0, + 0x0320, 0x00B0, 0x00B0, 0x00B0, 0x0470, 0x0480, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0490, + 0x04A0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x04B0, 0x04C0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x04D0, 0x00B0, 0x04E0, 0x00B0, 0x00B0, 0x00B0, 0x04F0, 0x0500, 0x0510, 0x0110, 0x0520, + 0x0530, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0100..0x013F -- */ + 0x00B0, 0x00B0, 0x0540, 0x0550, 0x00B0, 0x0560, 0x0570, 0x0580, 0x0590, 0x05A0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0540, 0x00B0, 0x00B0, 0x00B0, 0x05B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0140..0x017F -- */ + 0x0040, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x05C0, 0x05D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x05E0, 0x00B0, 0x05E0, 0x00B0, 0x0310, 0x00B0, 0x0310, 0x00B0, 0x00B0, 0x00B0, 0x05F0, + 0x0600, 0x0610, 0x00B0, 0x05B0, +/* INDEX_BLOCK: -- 0x0180..0x01BF -- */ + 0x0620, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x03C0, 0x00B0, 0x0630, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0640, 0x0650, 0x0660, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0670, 0x0100, 0x0100, 0x00B0, 0x0680, 0x00B0, 0x00B0, + 0x00B0, 0x0690, 0x06A0, 0x06B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0570, 0x00B0, 0x00B0, 0x00B0, + 0x06C0, 0x00B0, 0x00B0, 0x06D0, 0x03D0, 0x00B0, 0x06E0, 0x06C0, 0x0450, 0x00B0, 0x06F0, 0x00B0, + 0x00B0, 0x00B0, 0x0700, 0x0450, +/* INDEX_BLOCK: -- 0x01C0..0x01FF -- */ + 0x00B0, 0x00B0, 0x0710, 0x0720, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x0730, 0x0740, 0x0750, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0110, 0x0110, 0x0760, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0770, + 0x0780, 0x0790, 0x0790, 0x07A0, +/* INDEX_BLOCK: -- 0x0200..0x023F -- */ + 0x07B0, 0x0100, 0x07C0, 0x07D0, 0x07E0, 0x07F0, 0x0800, 0x0810, 0x0820, 0x00B0, 0x0830, 0x0830, + 0x0830, 0x0110, 0x0110, 0x0570, 0x0840, 0x0850, 0x0860, 0x0870, 0x0880, 0x0100, 0x00B0, 0x00B0, + 0x0890, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x08A0, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x08B0, 0x00B0, 0x00B0, 0x00B0, 0x0050, 0x0100, 0x08C0, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, +/* INDEX_BLOCK: -- 0x0240..0x027F -- */ + 0x0100, 0x0100, 0x08D0, 0x00B0, 0x08E0, 0x00B0, 0x0100, 0x0100, 0x08F0, 0x0900, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x0910, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0920, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, +/* INDEX_BLOCK: -- 0x0280..0x02BF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0930, 0x0100, 0x0940, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, +/* INDEX_BLOCK: -- 0x02C0..0x02FF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x0950, 0x0960, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0110, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0980, 0x00B0, 0x00B0, 0x0100, 0x0990, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x09A0, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x08B0, 0x00B0, 0x09B0, +/* INDEX_BLOCK: -- 0x0300..0x033F -- */ + 0x09C0, 0x0100, 0x09D0, 0x09E0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x09F0, 0x0040, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x0A00, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x09A0, 0x00B0, 0x00B0, 0x07A0, 0x00B0, 0x00B0, + 0x00B0, 0x0100, 0x00B0, 0x0A10, 0x00B0, 0x00B0, 0x00B0, 0x0A20, 0x0A30, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0A40, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x0670, 0x00B0, 0x0A50, +/* INDEX_BLOCK: -- 0x0340..0x037F -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0380..0x03BF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x03C0..0x03FF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, + 0x08D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0790, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x0970, 0x0A60, 0x00B0, 0x0410, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0450, + 0x0100, 0x0100, 0x0A70, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0A80, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0400..0x043F -- */ + 0x0A90, 0x00B0, 0x0AA0, 0x0AB0, 0x00B0, 0x00B0, 0x00B0, 0x0AC0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x0AD0, 0x00B0, 0x0110, 0x0AE0, 0x00B0, 0x00B0, 0x0AF0, 0x00B0, 0x0B00, 0x0450, 0x00B0, 0x00B0, + 0x02D0, 0x00B0, 0x00B0, 0x0B10, 0x00B0, 0x00B0, 0x0B20, 0x00B0, 0x00B0, 0x00B0, 0x0B30, 0x0B40, + 0x0B50, 0x00B0, 0x00B0, 0x0330, 0x00B0, 0x00B0, 0x00B0, 0x0B60, 0x0320, 0x00B0, 0x0440, 0x0530, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0870, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x0B70, 0x00B0, +/* INDEX_BLOCK: -- 0x0440..0x047F -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x0B80, 0x0B90, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, + 0x01D0, 0x01D0, 0x01D0, 0x01D0, +/* INDEX_BLOCK: -- 0x0480..0x04BF -- */ + 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, + 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0BA0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, + 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0080, 0x0080, 0x0BB0, 0x0110, 0x05B0, 0x0110, 0x0100, + 0x0100, 0x0BC0, 0x0BD0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x0BE0, + 0x0BF0, 0x0030, 0x0040, 0x0050, 0x0040, 0x0050, 0x08B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x0C00, 0x0C10, +/* INDEX_BLOCK: -- 0x04C0..0x04FF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0C20, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0C30, 0x0C30, 0x0040, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x05A0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0C40, 0x0900, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0C50, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0500..0x053F -- */ + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x0C60, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x0C70, 0x01A0, 0x01A0, 0x0C80, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x0C90, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x0CA0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, +/* INDEX_BLOCK: -- 0x0540..0x057F -- */ + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x0CB0, 0x0CC0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x0CD0, 0x0CE0, 0x01A0, 0x01A0, 0x0CF0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x0250, 0x0200, 0x01D0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, +/* INDEX_BLOCK: -- 0x0580..0x05BF -- */ + 0x0320, 0x00B0, 0x00B0, 0x0D00, 0x0D10, 0x00E0, 0x08B0, 0x0970, 0x0450, 0x00B0, 0x00B0, 0x0D20, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x02D0, 0x00B0, 0x0D30, 0x0D40, 0x00B0, 0x00B0, 0x00B0, 0x0D50, + 0x0450, 0x00B0, 0x00B0, 0x0D60, 0x0D70, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x0D80, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x0D90, 0x00B0, + 0x0450, 0x00B0, 0x00B0, 0x0460, 0x0570, 0x00B0, 0x0DA0, 0x0D40, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x05C0..0x05FF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x0D00, 0x0480, 0x0DB0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0DC0, + 0x0DD0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x0DE0, 0x0570, 0x0440, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0DF0, + 0x0570, 0x00B0, 0x0C30, 0x00B0, 0x00B0, 0x00B0, 0x0E00, 0x0E10, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x0540, 0x0E20, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0600..0x063F -- */ + 0x00B0, 0x00B0, 0x0970, 0x0E30, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0E40, 0x0D50, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0E50, 0x0570, 0x00B0, 0x0E60, 0x00B0, 0x00B0, 0x0E70, + 0x0E80, 0x0E90, 0x00B0, 0x00B0, 0x0EA0, 0x0EB0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0640..0x067F -- */ + 0x00B0, 0x00B0, 0x00B0, 0x0EC0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0ED0, 0x0EE0, 0x0EF0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F00, 0x0E10, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x0F10, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F20, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x0F30, 0x0F40, 0x0A70, +/* INDEX_BLOCK: -- 0x0680..0x06BF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0D40, + 0x00B0, 0x00B0, 0x00B0, 0x0D10, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x06C0..0x06FF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x00B0, 0x00B0, 0x00B0, 0x0970, 0x02D0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x0F50, 0x00B0, +/* INDEX_BLOCK: -- 0x0700..0x073F -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F60, 0x0F70, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0740..0x077F -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0F80, 0x0F90, + 0x0FA0, 0x00B0, 0x0FB0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0FC0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x08D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0780..0x07BF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0A00, 0x00B0, 0x00B0, + 0x00B0, 0x0FD0, 0x00B0, 0x00B0, 0x0A50, 0x00B0, 0x00B0, 0x00B0, 0x0FE0, 0x00B0, 0x00B0, 0x00B0, + 0x0FF0, 0x1000, 0x1000, 0x1000, +/* INDEX_BLOCK: -- 0x07C0..0x07FF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0110, 0x0110, 0x0110, 0x1010, + 0x0110, 0x0110, 0x0520, 0x0B20, 0x1020, 0x06E0, 0x1030, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0800..0x083F -- */ + 0x1040, 0x1050, 0x1060, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0D10, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0710, 0x1070, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0840..0x087F -- */ + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x1080, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x1090, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, +/* INDEX_BLOCK: -- 0x0880..0x08BF -- */ + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, + 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x01D0, 0x10A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, 0x01A0, + 0x01A0, 0x01A0, 0x01A0, 0x01A0, +/* INDEX_BLOCK: -- 0x08C0..0x08FF -- */ + 0x0100, 0x0100, 0x09B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x09A0, 0x10B0, 0x0A20, + 0x0A20, 0x0A20, 0x0100, 0x08B0, 0x10C0, 0x00B0, 0x0A50, 0x00B0, 0x00B0, 0x00B0, 0x0910, 0x00B0, + 0x00B0, 0x00B0, 0x10D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x08B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, +/* INDEX_BLOCK: -- 0x0900..0x093F -- */ + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x10E0, 0x0C30, 0x0C30, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x09A0, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x10F0, 0x09B0, 0x00B0, +/* INDEX_BLOCK: -- 0x0940..0x097F -- */ + 0x09B0, 0x0100, 0x0100, 0x0100, 0x10E0, 0x05B0, 0x0100, 0x0100, 0x10E0, 0x0100, 0x1100, 0x0A70, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x1110, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0920, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, + 0x0100, 0x09A0, 0x1100, 0x1120, 0x08D0, 0x0100, 0x10F0, 0x08D0, 0x0980, 0x08D0, 0x00B0, 0x00B0, + 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x1130, 0x0100, 0x0100, + 0x08E0, 0x00B0, 0x00B0, 0x1140, +/* INDEX_BLOCK: -- 0x0980..0x09BF -- */ + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x00B0, 0x00B0, 0x00B0, 0x1150, +/* INDEX_BLOCK: -- 0x09C0..0x09FF -- */ + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, + 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0110, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, +/* INDEX_BLOCK: -- 0x0A00..0x0A3F -- */ + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080 +}; + +static const SBUInt16 BranchBidiTypeIndexes[1088] = { + 0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240, 0x0280, 0x02C0, + 0x0300, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0380, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x03C0, 0x0400, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0440, 0x0480, 0x04C0, 0x0340, 0x0500, 0x0540, 0x0580, 0x05C0, 0x0600, 0x0640, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0680, 0x06C0, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0700, 0x0340, 0x0340, 0x0340, 0x0340, 0x0740, 0x0780, 0x07C0, 0x0340, + 0x0800, 0x0340, 0x0840, 0x0880, 0x08C0, 0x0900, 0x0940, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, 0x09C0, 0x0A00, 0x0A00, 0x0A00, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0980, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0980 +}; + +SB_INTERNAL SBBidiType LookupBidiType(SBCodepoint codepoint) +{ + if (codepoint <= 0x10FFFF) { + return PrimaryBidiTypeData[ + MainBidiTypeIndexes[ + BranchBidiTypeIndexes[ + codepoint / 0x0400 + ] + (codepoint % 0x0400) / 0x0010 + ] + codepoint % 0x0010 + ]; + } + + return ON; +} + +#undef AL +#undef AN +#undef B +#undef BN +#undef CS +#undef EN +#undef ES +#undef ET +#undef FSI +#undef L +#undef LRE +#undef LRI +#undef LRO +#undef NSM +#undef ON +#undef PDF +#undef PDI +#undef R +#undef RLE +#undef RLI +#undef RLO +#undef S +#undef WS diff --git a/lib/sheenbidi/Source/BidiTypeLookup.h b/lib/sheenbidi/Source/BidiTypeLookup.h new file mode 100644 index 000000000..dc39b32fd --- /dev/null +++ b/lib/sheenbidi/Source/BidiTypeLookup.h @@ -0,0 +1,16 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + */ + +#ifndef _SB_INTERNAL_BIDI_TYPE_LOOKUP_H +#define _SB_INTERNAL_BIDI_TYPE_LOOKUP_H + +#include <SBBidiType.h> +#include <SBConfig.h> + +#include "SBBase.h" + +SB_INTERNAL SBBidiType LookupBidiType(SBCodepoint codepoint); + +#endif diff --git a/lib/sheenbidi/Source/BracketQueue.c b/lib/sheenbidi/Source/BracketQueue.c new file mode 100644 index 000000000..a47783114 --- /dev/null +++ b/lib/sheenbidi/Source/BracketQueue.c @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> +#include <stdlib.h> + +#include "BidiChain.h" +#include "SBAssert.h" +#include "SBBase.h" +#include "BracketQueue.h" + +static void BracketQueueFinalizePairs(BracketQueueRef queue, BracketQueueListRef list, SBInteger top) +{ + do { + SBInteger limit = (list == queue->_rearList ? queue->_rearTop : BracketQueueList_MaxIndex); + + while (++top <= limit) { + if (list->openingLink[top] != BidiLinkNone + && list->closingLink[top] == BidiLinkNone) { + list->openingLink[top] = BidiLinkNone; + } + } + + list = list->next; + top = 0; + } while (list); +} + +SB_INTERNAL void BracketQueueInitialize(BracketQueueRef queue) +{ + queue->_firstList.previous = NULL; + queue->_firstList.next = NULL; + queue->_frontList = NULL; + queue->_rearList = NULL; + queue->count = 0; + queue->shouldDequeue = SBFalse; +} + +SB_INTERNAL void BracketQueueReset(BracketQueueRef queue, SBBidiType direction) +{ + queue->_frontList = &queue->_firstList; + queue->_rearList = &queue->_firstList; + queue->_frontTop = 0; + queue->_rearTop = -1; + queue->count = 0; + queue->shouldDequeue = SBFalse; + queue->_direction = direction; +} + +SB_INTERNAL void BracketQueueEnqueue(BracketQueueRef queue, + BidiLink priorStrongLink, BidiLink openingLink, SBCodepoint bracket) +{ + BracketQueueListRef list; + SBInteger top; + + /* The queue can only take a maximum of 63 elements. */ + SBAssert(queue->count < BracketQueueGetMaxCapacity()); + + if (queue->_rearTop != BracketQueueList_MaxIndex) { + list = queue->_rearList; + top = ++queue->_rearTop; + } else { + BracketQueueListRef rearList; + + rearList = queue->_rearList; + list = rearList->next; + + if (!list) { + list = malloc(sizeof(BracketQueueList)); + list->previous = rearList; + list->next = NULL; + + rearList->next = list; + } + + queue->_rearList = list; + queue->_rearTop = top = 0; + } + queue->count += 1; + + list->priorStrongLink[top] = priorStrongLink; + list->openingLink[top] = openingLink; + list->closingLink[top] = BidiLinkNone; + list->bracket[top] = bracket; + list->strongType[top] = SBBidiTypeNil; +} + +SB_INTERNAL void BracketQueueDequeue(BracketQueueRef queue) +{ + /* The queue must NOT be empty. */ + SBAssert(queue->count != 0); + + if (queue->_frontTop != BracketQueueList_MaxIndex) { + queue->_frontTop += 1; + } else { + BracketQueueListRef frontList = queue->_frontList; + + if (frontList == queue->_rearList) { + queue->_rearTop = -1; + } else { + queue->_frontList = frontList->next; + } + + queue->_frontTop = 0; + } + + queue->count -= 1; +} + +SB_INTERNAL void BracketQueueSetStrongType(BracketQueueRef queue, SBBidiType strongType) +{ + BracketQueueListRef list = queue->_rearList; + SBInteger top = queue->_rearTop; + + while (1) { + SBInteger limit = (list == queue->_frontList ? queue->_frontTop : 0); + + do { + if (list->closingLink[top] == BidiLinkNone + && list->strongType[top] != queue->_direction) { + list->strongType[top] = strongType; + } + } while (top-- > limit); + + if (list == queue->_frontList) { + break; + } + + list = list->previous; + top = BracketQueueList_MaxIndex; + } +} + +SB_INTERNAL void BracketQueueClosePair(BracketQueueRef queue, BidiLink closingLink, SBCodepoint bracket) +{ + BracketQueueListRef list = queue->_rearList; + SBInteger top = queue->_rearTop; + SBCodepoint canonical; + + switch (bracket) { + case 0x232A: + canonical = 0x3009; + break; + + case 0x3009: + canonical = 0x232A; + break; + + default: + canonical = bracket; + break; + } + + while (1) { + SBBoolean isFrontList = (list == queue->_frontList); + SBInteger limit = (isFrontList ? queue->_frontTop : 0); + + do { + if (list->openingLink[top] != BidiLinkNone + && list->closingLink[top] == BidiLinkNone + && (list->bracket[top] == bracket || list->bracket[top] == canonical)) { + list->closingLink[top] = closingLink; + BracketQueueFinalizePairs(queue, list, top); + + if (isFrontList && top == queue->_frontTop) { + queue->shouldDequeue = SBTrue; + } + + return; + } + } while (top-- > limit); + + if (isFrontList) { + break; + } + + list = list->previous; + top = BracketQueueList_MaxIndex; + } +} + +SB_INTERNAL SBBoolean BracketQueueShouldDequeue(BracketQueueRef queue) +{ + return queue->shouldDequeue; +} + +SB_INTERNAL BidiLink BracketQueueGetPriorStrongLink(BracketQueueRef queue) +{ + return queue->_frontList->priorStrongLink[queue->_frontTop]; +} + +SB_INTERNAL BidiLink BracketQueueGetOpeningLink(BracketQueueRef queue) +{ + return queue->_frontList->openingLink[queue->_frontTop]; +} + +SB_INTERNAL BidiLink BracketQueueGetClosingLink(BracketQueueRef queue) +{ + return queue->_frontList->closingLink[queue->_frontTop]; +} + +SB_INTERNAL SBBidiType BracketQueueGetStrongType(BracketQueueRef queue) +{ + return queue->_frontList->strongType[queue->_frontTop]; +} + +SB_INTERNAL void BracketQueueFinalize(BracketQueueRef queue) +{ + BracketQueueListRef list = queue->_firstList.next; + + while (list) { + BracketQueueListRef next = list->next; + free(list); + list = next; + } +} diff --git a/lib/sheenbidi/Source/BracketQueue.h b/lib/sheenbidi/Source/BracketQueue.h new file mode 100644 index 000000000..8cf135a10 --- /dev/null +++ b/lib/sheenbidi/Source/BracketQueue.h @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_BRACKET_QUEUE_H +#define _SB_INTERNAL_BRACKET_QUEUE_H + +#include <SBConfig.h> + +#include "BidiChain.h" +#include "SBBase.h" + +#define BracketQueueList_Length 8 +#define BracketQueueList_MaxIndex (BracketQueueList_Length - 1) + +typedef struct _BracketQueueList { + SBCodepoint bracket[BracketQueueList_Length]; + BidiLink priorStrongLink[BracketQueueList_Length]; + BidiLink openingLink[BracketQueueList_Length]; + BidiLink closingLink[BracketQueueList_Length]; + SBBidiType strongType[BracketQueueList_Length]; + + struct _BracketQueueList *previous; + struct _BracketQueueList *next; +} BracketQueueList, *BracketQueueListRef; + +typedef struct _BracketQueue { + BracketQueueList _firstList; + BracketQueueListRef _frontList; + BracketQueueListRef _rearList; + SBInteger _frontTop; + SBInteger _rearTop; + SBUInteger count; + SBBoolean shouldDequeue; + SBBidiType _direction; +} BracketQueue, *BracketQueueRef; + +#define BracketQueueGetMaxCapacity() 63 + +SB_INTERNAL void BracketQueueInitialize(BracketQueueRef queue); +SB_INTERNAL void BracketQueueReset(BracketQueueRef queue, SBBidiType direction); + +SB_INTERNAL void BracketQueueEnqueue(BracketQueueRef queue, + BidiLink priorStrongLink, BidiLink openingLink, SBCodepoint bracket); +SB_INTERNAL void BracketQueueDequeue(BracketQueueRef queue); + +SB_INTERNAL void BracketQueueSetStrongType(BracketQueueRef queue, SBBidiType strongType); +SB_INTERNAL void BracketQueueClosePair(BracketQueueRef queue, + BidiLink closingLink, SBCodepoint bracket); + +SB_INTERNAL SBBoolean BracketQueueShouldDequeue(BracketQueueRef queue); + +SB_INTERNAL BidiLink BracketQueueGetPriorStrongLink(BracketQueueRef queue); +SB_INTERNAL BidiLink BracketQueueGetOpeningLink(BracketQueueRef queue); +SB_INTERNAL BidiLink BracketQueueGetClosingLink(BracketQueueRef queue); +SB_INTERNAL SBBidiType BracketQueueGetStrongType(BracketQueueRef queue); + +SB_INTERNAL void BracketQueueFinalize(BracketQueueRef queue); + +#endif diff --git a/lib/sheenbidi/Source/BracketType.h b/lib/sheenbidi/Source/BracketType.h new file mode 100644 index 000000000..5f44e3479 --- /dev/null +++ b/lib/sheenbidi/Source/BracketType.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_BRACKET_TYPE_H +#define _SB_INTERNAL_BRACKET_TYPE_H + +#include "SBBase.h" + +enum { + BracketTypeNone = 0x00, + BracketTypeOpen = 0x40, /**< Opening paired bracket. */ + BracketTypeClose = 0x80, /**< Closing paired bracket. */ + + BracketTypePrimaryMask = BracketTypeOpen | BracketTypeClose, + BracketTypeInverseMask = ~BracketTypePrimaryMask +}; +typedef SBUInt8 BracketType; + +#endif diff --git a/lib/sheenbidi/Source/GeneralCategoryLookup.c b/lib/sheenbidi/Source/GeneralCategoryLookup.c new file mode 100644 index 000000000..276c33e42 --- /dev/null +++ b/lib/sheenbidi/Source/GeneralCategoryLookup.c @@ -0,0 +1,1964 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + * + * REQUIRED MEMORY: 10654+(4096*2)+(1088*2) = 21022 Bytes + */ + +#include "GeneralCategoryLookup.h" + +#define Cc SBGeneralCategoryCC +#define Cf SBGeneralCategoryCF +#define Cn SBGeneralCategoryCN +#define Co SBGeneralCategoryCO +#define Cs SBGeneralCategoryCS +#define Ll SBGeneralCategoryLL +#define Lm SBGeneralCategoryLM +#define Lo SBGeneralCategoryLO +#define Lt SBGeneralCategoryLT +#define Lu SBGeneralCategoryLU +#define Mc SBGeneralCategoryMC +#define Me SBGeneralCategoryME +#define Mn SBGeneralCategoryMN +#define Nd SBGeneralCategoryND +#define Nl SBGeneralCategoryNL +#define No SBGeneralCategoryNO +#define Pc SBGeneralCategoryPC +#define Pd SBGeneralCategoryPD +#define Pe SBGeneralCategoryPE +#define Pf SBGeneralCategoryPF +#define Pi SBGeneralCategoryPI +#define Po SBGeneralCategoryPO +#define Ps SBGeneralCategoryPS +#define Sc SBGeneralCategorySC +#define Sk SBGeneralCategorySK +#define Sm SBGeneralCategorySM +#define So SBGeneralCategorySO +#define Zl SBGeneralCategoryZL +#define Zp SBGeneralCategoryZP +#define Zs SBGeneralCategoryZS + +static const SBUInt8 PrimaryGeneralCategoryData[10654] = { +/* DATA_BLOCK: -- 0x0000..0x000F -- */ + Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, Cc, +/* DATA_BLOCK: -- 0x0010..0x001F -- */ + Zs, Po, Po, Po, Sc, Po, Po, Po, Ps, Pe, Po, Sm, Po, Pd, Po, Po, +/* DATA_BLOCK: -- 0x0020..0x002F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Po, Po, Sm, Sm, Sm, Po, +/* DATA_BLOCK: -- 0x0030..0x003F -- */ + Po, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x0040..0x004F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Ps, Po, Pe, Sk, Pc, +/* DATA_BLOCK: -- 0x0050..0x005F -- */ + Sk, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x0060..0x006F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ps, Sm, Pe, Sm, Cc, +/* DATA_BLOCK: -- 0x0070..0x007F -- */ + Zs, Po, Sc, Sc, Sc, Sc, So, Po, Sk, So, Lo, Pi, Sm, Cf, So, Sk, +/* DATA_BLOCK: -- 0x0080..0x008F -- */ + So, Sm, No, No, Sk, Ll, Po, Po, Sk, No, Lo, Pf, No, No, No, Po, +/* DATA_BLOCK: -- 0x0090..0x009F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x00A0..0x00AF -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Sm, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Ll, +/* DATA_BLOCK: -- 0x00B0..0x00BF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x00C0..0x00CF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Sm, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x00D0..0x00DF -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x00E0..0x00EF -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, +/* DATA_BLOCK: -- 0x00F0..0x00FF -- */ + Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x0100..0x010F -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Lu, Ll, Lu, Ll, Lu, Ll, Ll, +/* DATA_BLOCK: -- 0x0110..0x011F -- */ + Ll, Lu, Lu, Ll, Lu, Ll, Lu, Lu, Ll, Lu, Lu, Lu, Ll, Ll, Lu, Lu, +/* DATA_BLOCK: -- 0x0120..0x012F -- */ + Lu, Lu, Ll, Lu, Lu, Ll, Lu, Lu, Lu, Ll, Ll, Ll, Lu, Lu, Ll, Lu, +/* DATA_BLOCK: -- 0x0130..0x013F -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Lu, Ll, Lu, Ll, Ll, Lu, Ll, Lu, Lu, +/* DATA_BLOCK: -- 0x0140..0x014F -- */ + Ll, Lu, Lu, Lu, Ll, Lu, Ll, Lu, Lu, Ll, Ll, Lo, Lu, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x0150..0x015F -- */ + Lo, Lo, Lo, Lo, Lu, Lt, Ll, Lu, Lt, Ll, Lu, Lt, Ll, Lu, Ll, Lu, +/* DATA_BLOCK: -- 0x0160..0x016F -- */ + Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x0170..0x017F -- */ + Ll, Lu, Lt, Ll, Lu, Ll, Lu, Lu, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x0180..0x018F -- */ + Lu, Ll, Lu, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Ll, Lu, Lu, Ll, +/* DATA_BLOCK: -- 0x0190..0x019F -- */ + Ll, Lu, Ll, Lu, Lu, Lu, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x01A0..0x01AF -- */ + Ll, Ll, Ll, Ll, Lo, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x01B0..0x01BF -- */ + Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x01C0..0x01CF -- */ + Lm, Lm, Sk, Sk, Sk, Sk, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x01D0..0x01DF -- */ + Lm, Lm, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x01E0..0x01EF -- */ + Lm, Lm, Lm, Lm, Lm, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Lm, Sk, Lm, Sk, +/* DATA_BLOCK: -- 0x01F0..0x01FF -- */ + Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x0200..0x020F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0210..0x021F -- */ + Lu, Ll, Lu, Ll, Lm, Sk, Lu, Ll, Cn, Cn, Lm, Ll, Ll, Ll, Po, Lu, +/* DATA_BLOCK: -- 0x0220..0x022F -- */ + Cn, Cn, Cn, Cn, Sk, Sk, Lu, Po, Lu, Lu, Lu, Cn, Lu, Cn, Lu, Lu, +/* DATA_BLOCK: -- 0x0230..0x023F -- */ + Ll, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x0240..0x024F -- */ + Lu, Lu, Cn, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x0250..0x025F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, +/* DATA_BLOCK: -- 0x0260..0x026F -- */ + Ll, Ll, Lu, Lu, Lu, Ll, Ll, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x0270..0x027F -- */ + Ll, Ll, Ll, Ll, Lu, Ll, Sm, Lu, Ll, Lu, Lu, Ll, Ll, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x0280..0x028F -- */ + Lu, Ll, So, Mn, Mn, Mn, Mn, Mn, Me, Me, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x0290..0x029F -- */ + Lu, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Ll, +/* DATA_BLOCK: -- 0x02A0..0x02AF -- */ + Cn, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x02B0..0x02BF -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Cn, Cn, Lm, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x02C0..0x02CF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Po, Pd, Cn, Cn, So, So, Sc, +/* DATA_BLOCK: -- 0x02D0..0x02DF -- */ + Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x02E0..0x02EF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Pd, Mn, +/* DATA_BLOCK: -- 0x02F0..0x02FF -- */ + Po, Mn, Mn, Po, Mn, Mn, Po, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0300..0x030F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0310..0x031F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x0320..0x032F -- */ + Lo, Lo, Lo, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0330..0x033F -- */ + Cf, Cf, Cf, Cf, Cf, Cf, Sm, Sm, Sm, Po, Po, Sc, Po, Po, So, So, +/* DATA_BLOCK: -- 0x0340..0x034F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Po, Cf, Cn, Po, Po, +/* DATA_BLOCK: -- 0x0350..0x035F -- */ + Lm, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0360..0x036F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Po, Po, Po, Po, Lo, Lo, +/* DATA_BLOCK: -- 0x0370..0x037F -- */ + Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0380..0x038F -- */ + Lo, Lo, Lo, Lo, Po, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cf, So, Mn, +/* DATA_BLOCK: -- 0x0390..0x039F -- */ + Mn, Mn, Mn, Mn, Mn, Lm, Lm, Mn, Mn, So, Mn, Mn, Mn, Mn, Lo, Lo, +/* DATA_BLOCK: -- 0x03A0..0x03AF -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Lo, Lo, Lo, So, So, Lo, +/* DATA_BLOCK: -- 0x03B0..0x03BF -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Cn, Cf, +/* DATA_BLOCK: -- 0x03C0..0x03CF -- */ + Lo, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x03D0..0x03DF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x03E0..0x03EF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x03F0..0x03FF -- */ + Mn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0400..0x040F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0410..0x041F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0420..0x042F -- */ + Mn, Mn, Mn, Mn, Lm, Lm, So, Po, Po, Po, Lm, Cn, Cn, Mn, Sc, Sc, +/* DATA_BLOCK: -- 0x0430..0x043F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Lm, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0440..0x044F -- */ + Mn, Mn, Mn, Mn, Lm, Mn, Mn, Mn, Lm, Mn, Mn, Mn, Mn, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x0450..0x045F -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Cn, +/* DATA_BLOCK: -- 0x0460..0x046F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Cn, Cn, Po, Cn, +/* DATA_BLOCK: -- 0x0470..0x047F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0480..0x048F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0490..0x049F -- */ + Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x04A0..0x04AF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x04B0..0x04BF -- */ + Cn, Cn, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x04C0..0x04CF -- */ + Mn, Mn, Cf, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x04D0..0x04DF -- */ + Mn, Mn, Mn, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x04E0..0x04EF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mc, Mn, Lo, Mc, Mc, +/* DATA_BLOCK: -- 0x04F0..0x04FF -- */ + Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mc, Mc, Mc, Mn, Mc, Mc, +/* DATA_BLOCK: -- 0x0500..0x050F -- */ + Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0510..0x051F -- */ + Lo, Lo, Mn, Mn, Po, Po, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x0520..0x052F -- */ + Po, Lm, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0530..0x053F -- */ + Lo, Mn, Mc, Mc, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x0540..0x054F -- */ + Lo, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0550..0x055F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0560..0x056F -- */ + Lo, Cn, Lo, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Lo, Mc, Mc, +/* DATA_BLOCK: -- 0x0570..0x057F -- */ + Mc, Mn, Mn, Mn, Mn, Cn, Cn, Mc, Mc, Cn, Cn, Mc, Mc, Mn, Lo, Cn, +/* DATA_BLOCK: -- 0x0580..0x058F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Mc, Cn, Cn, Cn, Cn, Lo, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x0590..0x059F -- */ + Lo, Lo, Mn, Mn, Cn, Cn, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x05A0..0x05AF -- */ + Lo, Lo, Sc, Sc, No, No, No, No, No, No, So, Sc, Lo, Po, Mn, Cn, +/* DATA_BLOCK: -- 0x05B0..0x05BF -- */ + Cn, Mn, Mn, Mc, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x05C0..0x05CF -- */ + Lo, Cn, Lo, Lo, Cn, Lo, Lo, Cn, Lo, Lo, Cn, Cn, Mn, Cn, Mc, Mc, +/* DATA_BLOCK: -- 0x05D0..0x05DF -- */ + Mc, Mn, Mn, Cn, Cn, Cn, Cn, Mn, Mn, Cn, Cn, Mn, Mn, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x05E0..0x05EF -- */ + Cn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Cn, Lo, Cn, +/* DATA_BLOCK: -- 0x05F0..0x05FF -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x0600..0x060F -- */ + Mn, Mn, Lo, Lo, Lo, Mn, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0610..0x061F -- */ + Cn, Mn, Mn, Mc, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x0620..0x062F -- */ + Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0630..0x063F -- */ + Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Lo, Mc, Mc, +/* DATA_BLOCK: -- 0x0640..0x064F -- */ + Mc, Mn, Mn, Mn, Mn, Mn, Cn, Mn, Mn, Mc, Cn, Mc, Mc, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x0650..0x065F -- */ + Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0660..0x066F -- */ + Po, Sc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0670..0x067F -- */ + Cn, Mn, Mc, Mc, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x0680..0x068F -- */ + Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Lo, Mc, Mn, +/* DATA_BLOCK: -- 0x0690..0x069F -- */ + Mc, Mn, Mn, Mn, Mn, Cn, Cn, Mc, Mc, Cn, Cn, Mc, Mc, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x06A0..0x06AF -- */ + Cn, Cn, Cn, Cn, Cn, Mn, Mn, Mc, Cn, Cn, Cn, Cn, Lo, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x06B0..0x06BF -- */ + So, Lo, No, No, No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x06C0..0x06CF -- */ + Cn, Cn, Mn, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x06D0..0x06DF -- */ + Lo, Cn, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Lo, Lo, Cn, Lo, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x06E0..0x06EF -- */ + Cn, Cn, Cn, Lo, Lo, Cn, Cn, Cn, Lo, Lo, Lo, Cn, Cn, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x06F0..0x06FF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Mc, Mc, +/* DATA_BLOCK: -- 0x0700..0x070F -- */ + Mn, Mc, Mc, Cn, Cn, Cn, Mc, Mc, Mc, Cn, Mc, Mc, Mc, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x0710..0x071F -- */ + Lo, Cn, Cn, Cn, Cn, Cn, Cn, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0720..0x072F -- */ + No, No, No, So, So, So, So, So, So, Sc, So, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0730..0x073F -- */ + Mn, Mc, Mc, Mc, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x0740..0x074F -- */ + Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0750..0x075F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Lo, Mn, Mn, +/* DATA_BLOCK: -- 0x0760..0x076F -- */ + Mn, Mc, Mc, Mc, Mc, Cn, Mn, Mn, Mn, Cn, Mn, Mn, Mn, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x0770..0x077F -- */ + Cn, Cn, Cn, Cn, Cn, Mn, Mn, Cn, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0780..0x078F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, No, No, No, No, No, No, No, So, +/* DATA_BLOCK: -- 0x0790..0x079F -- */ + Lo, Mn, Mc, Mc, Po, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x07A0..0x07AF -- */ + Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Lo, Mc, Mn, +/* DATA_BLOCK: -- 0x07B0..0x07BF -- */ + Mc, Mc, Mc, Mc, Mc, Cn, Mn, Mc, Mc, Cn, Mc, Mc, Mn, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x07C0..0x07CF -- */ + Cn, Cn, Cn, Cn, Cn, Mc, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Cn, +/* DATA_BLOCK: -- 0x07D0..0x07DF -- */ + Cn, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x07E0..0x07EF -- */ + Mn, Mn, Mc, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x07F0..0x07FF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Lo, Mc, Mc, +/* DATA_BLOCK: -- 0x0800..0x080F -- */ + Mc, Mn, Mn, Mn, Mn, Cn, Mc, Mc, Mc, Cn, Mc, Mc, Mc, Mn, Lo, So, +/* DATA_BLOCK: -- 0x0810..0x081F -- */ + Cn, Cn, Cn, Cn, Lo, Lo, Lo, Mc, No, No, No, No, No, No, No, Lo, +/* DATA_BLOCK: -- 0x0820..0x082F -- */ + No, No, No, No, No, No, No, No, No, So, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0830..0x083F -- */ + Cn, Mn, Mc, Mc, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0840..0x084F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0850..0x085F -- */ + Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Cn, Cn, +/* DATA_BLOCK: -- 0x0860..0x086F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Mn, Cn, Cn, Cn, Cn, Mc, +/* DATA_BLOCK: -- 0x0870..0x087F -- */ + Mc, Mc, Mn, Mn, Mn, Cn, Mn, Cn, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x0880..0x088F -- */ + Cn, Cn, Mc, Mc, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0890..0x089F -- */ + Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x08A0..0x08AF -- */ + Lo, Mn, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Sc, +/* DATA_BLOCK: -- 0x08B0..0x08BF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lm, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Po, +/* DATA_BLOCK: -- 0x08C0..0x08CF -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Po, Po, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x08D0..0x08DF -- */ + Cn, Lo, Lo, Cn, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x08E0..0x08EF -- */ + Lo, Lo, Lo, Lo, Cn, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x08F0..0x08FF -- */ + Lo, Mn, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Lo, Cn, Cn, +/* DATA_BLOCK: -- 0x0900..0x090F -- */ + Lo, Lo, Lo, Lo, Lo, Cn, Lm, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x0910..0x091F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0920..0x092F -- */ + Lo, So, So, So, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x0930..0x093F -- */ + Po, Po, Po, So, Po, So, So, So, Mn, Mn, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x0940..0x094F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x0950..0x095F -- */ + No, No, No, No, So, Mn, So, Mn, So, Mn, Ps, Pe, Ps, Pe, Mc, Mc, +/* DATA_BLOCK: -- 0x0960..0x096F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0970..0x097F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0980..0x098F -- */ + Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, +/* DATA_BLOCK: -- 0x0990..0x099F -- */ + Mn, Mn, Mn, Mn, Mn, Po, Mn, Mn, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x09A0..0x09AF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x09B0..0x09BF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, So, So, +/* DATA_BLOCK: -- 0x09C0..0x09CF -- */ + So, So, So, So, So, So, Mn, So, So, So, So, So, So, Cn, So, So, +/* DATA_BLOCK: -- 0x09D0..0x09DF -- */ + Po, Po, Po, Po, Po, So, So, So, So, Po, Po, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x09E0..0x09EF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mc, Mc, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x09F0..0x09FF -- */ + Mn, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Mn, Mc, Mc, Mn, Mn, Lo, +/* DATA_BLOCK: -- 0x0A00..0x0A0F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x0A10..0x0A1F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Mc, Mc, Mn, Mn, Lo, Lo, Lo, Lo, Mn, Mn, +/* DATA_BLOCK: -- 0x0A20..0x0A2F -- */ + Mn, Lo, Mc, Mc, Mc, Lo, Lo, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Lo, Lo, +/* DATA_BLOCK: -- 0x0A30..0x0A3F -- */ + Lo, Mn, Mn, Mn, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0A40..0x0A4F -- */ + Lo, Lo, Mn, Mc, Mc, Mn, Mn, Mc, Mc, Mc, Mc, Mc, Mc, Mn, Lo, Mc, +/* DATA_BLOCK: -- 0x0A50..0x0A5F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Mc, Mc, Mc, Mn, So, So, +/* DATA_BLOCK: -- 0x0A60..0x0A6F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Cn, Lu, Cn, Cn, Cn, Cn, Cn, Lu, Cn, Cn, +/* DATA_BLOCK: -- 0x0A70..0x0A7F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Po, Lm, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x0A80..0x0A8F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Cn, Cn, +/* DATA_BLOCK: -- 0x0A90..0x0A9F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Cn, Lo, Lo, Lo, Lo, Cn, Cn, +/* DATA_BLOCK: -- 0x0AA0..0x0AAF -- */ + Lo, Cn, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, +/* DATA_BLOCK: -- 0x0AB0..0x0ABF -- */ + Lo, Cn, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0AC0..0x0ACF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0AD0..0x0ADF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0AE0..0x0AEF -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x0AF0..0x0AFF -- */ + No, No, No, No, No, No, No, No, No, No, No, No, No, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0B00..0x0B0F -- */ + So, So, So, So, So, So, So, So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0B10..0x0B1F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Cn, Cn, Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, +/* DATA_BLOCK: -- 0x0B20..0x0B2F -- */ + Pd, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0B30..0x0B3F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, So, Po, Lo, +/* DATA_BLOCK: -- 0x0B40..0x0B4F -- */ + Zs, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0B50..0x0B5F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Ps, Pe, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0B60..0x0B6F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Po, Po, Po, Nl, Nl, +/* DATA_BLOCK: -- 0x0B70..0x0B7F -- */ + Nl, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0B80..0x0B8F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, +/* DATA_BLOCK: -- 0x0B90..0x0B9F -- */ + Lo, Lo, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0BA0..0x0BAF -- */ + Lo, Lo, Mn, Mn, Mn, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0BB0..0x0BBF -- */ + Lo, Lo, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0BC0..0x0BCF -- */ + Lo, Cn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0BD0..0x0BDF -- */ + Lo, Lo, Lo, Lo, Mn, Mn, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mc, +/* DATA_BLOCK: -- 0x0BE0..0x0BEF -- */ + Mc, Mc, Mc, Mc, Mc, Mc, Mn, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0BF0..0x0BFF -- */ + Mn, Mn, Mn, Mn, Po, Po, Po, Lm, Po, Po, Po, Sc, Lo, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x0C00..0x0C0F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0C10..0x0C1F -- */ + No, No, No, No, No, No, No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0C20..0x0C2F -- */ + Po, Po, Po, Po, Po, Po, Pd, Po, Po, Po, Po, Mn, Mn, Mn, Cf, Cn, +/* DATA_BLOCK: -- 0x0C30..0x0C3F -- */ + Lo, Lo, Lo, Lm, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0C40..0x0C4F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0C50..0x0C5F -- */ + Lo, Lo, Lo, Lo, Lo, Mn, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0C60..0x0C6F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Lo, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0C70..0x0C7F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0C80..0x0C8F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, +/* DATA_BLOCK: -- 0x0C90..0x0C9F -- */ + Mn, Mn, Mn, Mc, Mc, Mc, Mc, Mn, Mn, Mc, Mc, Mc, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0CA0..0x0CAF -- */ + Mc, Mc, Mn, Mc, Mc, Mc, Mc, Mc, Mc, Mn, Mn, Mn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0CB0..0x0CBF -- */ + So, Cn, Cn, Cn, Po, Po, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x0CC0..0x0CCF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, +/* DATA_BLOCK: -- 0x0CD0..0x0CDF -- */ + Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0CE0..0x0CEF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0CF0..0x0CFF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0D00..0x0D0F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, No, Cn, Cn, Cn, So, So, +/* DATA_BLOCK: -- 0x0D10..0x0D1F -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x0D20..0x0D2F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mc, Mc, Mn, Cn, Cn, Po, Po, +/* DATA_BLOCK: -- 0x0D30..0x0D3F -- */ + Lo, Lo, Lo, Lo, Lo, Mc, Mn, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, +/* DATA_BLOCK: -- 0x0D40..0x0D4F -- */ + Mn, Mc, Mn, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x0D50..0x0D5F -- */ + Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Mn, +/* DATA_BLOCK: -- 0x0D60..0x0D6F -- */ + Po, Po, Po, Po, Po, Po, Po, Lm, Po, Po, Po, Po, Po, Po, Cn, Cn, +/* DATA_BLOCK: -- 0x0D70..0x0D7F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Me, Mn, +/* DATA_BLOCK: -- 0x0D80..0x0D8F -- */ + Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0D90..0x0D9F -- */ + Mn, Mn, Mn, Mn, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0DA0..0x0DAF -- */ + Lo, Lo, Lo, Lo, Mn, Mc, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x0DB0..0x0DBF -- */ + Mc, Mc, Mn, Mc, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0DC0..0x0DCF -- */ + Po, So, So, So, So, So, So, So, So, So, So, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0DD0..0x0DDF -- */ + Mn, Mn, Mn, Mn, So, So, So, So, So, So, So, So, So, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0DE0..0x0DEF -- */ + Mn, Mn, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0DF0..0x0DFF -- */ + Lo, Mc, Mn, Mn, Mn, Mn, Mc, Mc, Mn, Mn, Mc, Mn, Mn, Mn, Lo, Lo, +/* DATA_BLOCK: -- 0x0E00..0x0E0F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mc, Mn, Mn, Mc, Mc, Mc, Mn, Mc, Mn, +/* DATA_BLOCK: -- 0x0E10..0x0E1F -- */ + Mn, Mn, Mc, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x0E20..0x0E2F -- */ + Lo, Lo, Lo, Lo, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0E30..0x0E3F -- */ + Mn, Mn, Mn, Mn, Mc, Mc, Mn, Mn, Cn, Cn, Cn, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x0E40..0x0E4F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x0E50..0x0E5F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lm, Lm, Lm, Lm, Lm, Lm, Po, Po, +/* DATA_BLOCK: -- 0x0E60..0x0E6F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0E70..0x0E7F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Cn, Cn, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x0E80..0x0E8F -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0E90..0x0E9F -- */ + Mn, Mn, Mn, Po, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0EA0..0x0EAF -- */ + Mn, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Lo, Lo, Lo, Lo, Mn, Lo, Lo, +/* DATA_BLOCK: -- 0x0EB0..0x0EBF -- */ + Lo, Lo, Lo, Lo, Mn, Lo, Lo, Mc, Mn, Mn, Lo, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x0EC0..0x0ECF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x0ED0..0x0EDF -- */ + Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x0EE0..0x0EEF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lm, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x0EF0..0x0EFF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lm, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x0F00..0x0F0F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x0F10..0x0F1F -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x0F20..0x0F2F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x0F30..0x0F3F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, Lu, Lu, Lu, Lu, Lu, Lu, Cn, Cn, +/* DATA_BLOCK: -- 0x0F40..0x0F4F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Cn, Lu, Cn, Lu, Cn, Lu, Cn, Lu, +/* DATA_BLOCK: -- 0x0F50..0x0F5F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, +/* DATA_BLOCK: -- 0x0F60..0x0F6F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lt, Lt, Lt, Lt, Lt, Lt, Lt, Lt, +/* DATA_BLOCK: -- 0x0F70..0x0F7F -- */ + Ll, Ll, Ll, Ll, Ll, Cn, Ll, Ll, Lu, Lu, Lu, Lu, Lt, Sk, Ll, Sk, +/* DATA_BLOCK: -- 0x0F80..0x0F8F -- */ + Sk, Sk, Ll, Ll, Ll, Cn, Ll, Ll, Lu, Lu, Lu, Lu, Lt, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x0F90..0x0F9F -- */ + Ll, Ll, Ll, Ll, Cn, Cn, Ll, Ll, Lu, Lu, Lu, Lu, Cn, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x0FA0..0x0FAF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Lu, Lu, Lu, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x0FB0..0x0FBF -- */ + Cn, Cn, Ll, Ll, Ll, Cn, Ll, Ll, Lu, Lu, Lu, Lu, Lt, Sk, Sk, Cn, +/* DATA_BLOCK: -- 0x0FC0..0x0FCF -- */ + Zs, Zs, Zs, Zs, Zs, Zs, Zs, Zs, Zs, Zs, Zs, Cf, Cf, Cf, Cf, Cf, +/* DATA_BLOCK: -- 0x0FD0..0x0FDF -- */ + Pd, Pd, Pd, Pd, Pd, Pd, Po, Po, Pi, Pf, Ps, Pi, Pi, Pf, Ps, Pi, +/* DATA_BLOCK: -- 0x0FE0..0x0FEF -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Zl, Zp, Cf, Cf, Cf, Cf, Cf, Zs, +/* DATA_BLOCK: -- 0x0FF0..0x0FFF -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, Pi, Pf, Po, Po, Po, Po, Pc, +/* DATA_BLOCK: -- 0x1000..0x100F -- */ + Pc, Po, Po, Po, Sm, Ps, Pe, Po, Po, Po, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x1010..0x101F -- */ + Po, Po, Sm, Po, Pc, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Zs, +/* DATA_BLOCK: -- 0x1020..0x102F -- */ + Cf, Cf, Cf, Cf, Cf, Cn, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, +/* DATA_BLOCK: -- 0x1030..0x103F -- */ + No, Lm, Cn, Cn, No, No, No, No, No, No, Sm, Sm, Sm, Ps, Pe, Lm, +/* DATA_BLOCK: -- 0x1040..0x104F -- */ + No, No, No, No, No, No, No, No, No, No, Sm, Sm, Sm, Ps, Pe, Cn, +/* DATA_BLOCK: -- 0x1050..0x105F -- */ + Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1060..0x106F -- */ + Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, Sc, +/* DATA_BLOCK: -- 0x1070..0x107F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Me, Me, Me, +/* DATA_BLOCK: -- 0x1080..0x108F -- */ + Me, Mn, Me, Me, Me, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x1090..0x109F -- */ + So, So, Lu, So, So, So, So, Lu, So, So, Ll, Lu, Lu, Lu, Ll, Ll, +/* DATA_BLOCK: -- 0x10A0..0x10AF -- */ + Lu, Lu, Lu, Ll, So, Lu, So, So, Sm, Lu, Lu, Lu, Lu, Lu, So, So, +/* DATA_BLOCK: -- 0x10B0..0x10BF -- */ + So, So, So, So, Lu, So, Lu, So, Lu, So, Lu, Lu, Lu, Lu, So, Ll, +/* DATA_BLOCK: -- 0x10C0..0x10CF -- */ + Lu, Lu, Lu, Lu, Ll, Lo, Lo, Lo, Lo, Ll, So, So, Ll, Ll, Lu, Lu, +/* DATA_BLOCK: -- 0x10D0..0x10DF -- */ + Sm, Sm, Sm, Sm, Sm, Lu, Ll, Ll, Ll, Ll, So, Sm, So, So, Ll, So, +/* DATA_BLOCK: -- 0x10E0..0x10EF -- */ + No, No, No, No, No, No, No, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x10F0..0x10FF -- */ + Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, +/* DATA_BLOCK: -- 0x1100..0x110F -- */ + Nl, Nl, Nl, Lu, Ll, Nl, Nl, Nl, Nl, No, So, So, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1110..0x111F -- */ + Sm, Sm, Sm, Sm, Sm, So, So, So, So, So, Sm, Sm, So, So, So, So, +/* DATA_BLOCK: -- 0x1120..0x112F -- */ + Sm, So, So, Sm, So, So, Sm, So, So, So, So, So, So, So, Sm, So, +/* DATA_BLOCK: -- 0x1130..0x113F -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, So, Sm, Sm, +/* DATA_BLOCK: -- 0x1140..0x114F -- */ + So, So, Sm, So, Sm, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1150..0x115F -- */ + So, So, So, So, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x1160..0x116F -- */ + Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x1170..0x117F -- */ + So, So, So, So, So, So, So, So, Ps, Pe, Ps, Pe, So, So, So, So, +/* DATA_BLOCK: -- 0x1180..0x118F -- */ + Sm, Sm, So, So, So, So, So, So, So, Ps, Pe, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1190..0x119F -- */ + So, So, So, So, So, So, So, So, So, So, So, So, Sm, So, So, So, +/* DATA_BLOCK: -- 0x11A0..0x11AF -- */ + So, So, So, So, So, So, So, So, So, So, So, Sm, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x11B0..0x11BF -- */ + Sm, Sm, Sm, Sm, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x11C0..0x11CF -- */ + So, So, So, So, So, So, So, So, So, So, So, So, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x11D0..0x11DF -- */ + Sm, Sm, So, So, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x11E0..0x11EF -- */ + So, So, So, So, So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x11F0..0x11FF -- */ + So, So, So, So, So, So, So, So, So, So, So, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1200..0x120F -- */ + No, No, No, No, No, No, No, No, No, No, No, No, So, So, So, So, +/* DATA_BLOCK: -- 0x1210..0x121F -- */ + So, So, So, So, So, So, So, So, So, So, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1220..0x122F -- */ + So, So, So, So, So, So, So, Sm, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1230..0x123F -- */ + So, Sm, So, So, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1240..0x124F -- */ + So, So, So, So, So, So, So, So, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x1250..0x125F -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, So, So, Sm, +/* DATA_BLOCK: -- 0x1260..0x126F -- */ + So, So, So, So, So, So, So, So, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, +/* DATA_BLOCK: -- 0x1270..0x127F -- */ + Ps, Pe, Ps, Pe, Ps, Pe, No, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1280..0x128F -- */ + No, No, No, No, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1290..0x129F -- */ + Sm, Sm, Sm, Sm, Sm, Ps, Pe, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x12A0..0x12AF -- */ + Sm, Sm, Sm, Sm, Sm, Sm, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, +/* DATA_BLOCK: -- 0x12B0..0x12BF -- */ + Sm, Sm, Sm, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, +/* DATA_BLOCK: -- 0x12C0..0x12CF -- */ + Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Sm, Sm, Sm, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x12D0..0x12DF -- */ + Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Ps, Pe, Ps, Pe, Sm, Sm, Sm, Sm, +/* DATA_BLOCK: -- 0x12E0..0x12EF -- */ + Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Sm, Ps, Pe, Sm, Sm, +/* DATA_BLOCK: -- 0x12F0..0x12FF -- */ + Sm, Sm, Sm, Sm, Sm, So, So, Sm, Sm, Sm, Sm, Sm, Sm, So, So, So, +/* DATA_BLOCK: -- 0x1300..0x130F -- */ + So, So, So, So, Cn, Cn, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1310..0x131F -- */ + So, So, So, So, So, So, Cn, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1320..0x132F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Cn, +/* DATA_BLOCK: -- 0x1330..0x133F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Cn, +/* DATA_BLOCK: -- 0x1340..0x134F -- */ + Lu, Ll, Lu, Lu, Lu, Ll, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x1350..0x135F -- */ + Lu, Ll, Lu, Ll, Ll, Lu, Ll, Ll, Ll, Ll, Ll, Ll, Lm, Lm, Lu, Lu, +/* DATA_BLOCK: -- 0x1360..0x136F -- */ + Lu, Ll, Lu, Ll, Ll, So, So, So, So, So, So, Lu, Ll, Lu, Ll, Mn, +/* DATA_BLOCK: -- 0x1370..0x137F -- */ + Mn, Mn, Lu, Ll, Cn, Cn, Cn, Cn, Cn, Po, Po, Po, Po, No, Po, Po, +/* DATA_BLOCK: -- 0x1380..0x138F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Cn, Ll, Cn, Cn, Cn, Cn, Cn, Ll, Cn, Cn, +/* DATA_BLOCK: -- 0x1390..0x139F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lm, +/* DATA_BLOCK: -- 0x13A0..0x13AF -- */ + Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Mn, +/* DATA_BLOCK: -- 0x13B0..0x13BF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x13C0..0x13CF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, +/* DATA_BLOCK: -- 0x13D0..0x13DF -- */ + Po, Po, Pi, Pf, Pi, Pf, Po, Po, Po, Pi, Pf, Po, Pi, Pf, Po, Po, +/* DATA_BLOCK: -- 0x13E0..0x13EF -- */ + Po, Po, Po, Po, Po, Po, Po, Pd, Po, Po, Pd, Po, Pi, Pf, Po, Po, +/* DATA_BLOCK: -- 0x13F0..0x13FF -- */ + Pi, Pf, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Po, Po, Po, Po, Po, Lm, +/* DATA_BLOCK: -- 0x1400..0x140F -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Pd, Pd, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x1410..0x141F -- */ + Pd, Po, Ps, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x1420..0x142F -- */ + So, So, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1430..0x143F -- */ + So, So, So, So, So, So, So, So, So, So, Cn, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1440..0x144F -- */ + So, So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1450..0x145F -- */ + So, So, So, So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1460..0x146F -- */ + So, So, So, So, So, So, So, So, So, So, So, So, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1470..0x147F -- */ + Zs, Po, Po, Po, So, Lm, Lo, Nl, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, +/* DATA_BLOCK: -- 0x1480..0x148F -- */ + Ps, Pe, So, So, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Pd, Ps, Pe, Pe, +/* DATA_BLOCK: -- 0x1490..0x149F -- */ + So, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Mn, Mn, Mn, Mn, Mc, Mc, +/* DATA_BLOCK: -- 0x14A0..0x14AF -- */ + Pd, Lm, Lm, Lm, Lm, Lm, So, So, Nl, Nl, Nl, Lm, Lo, Po, So, So, +/* DATA_BLOCK: -- 0x14B0..0x14BF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Mn, Sk, Sk, Lm, Lm, Lo, +/* DATA_BLOCK: -- 0x14C0..0x14CF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Po, Lm, Lm, Lm, Lo, +/* DATA_BLOCK: -- 0x14D0..0x14DF -- */ + Cn, Cn, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x14E0..0x14EF -- */ + So, So, No, No, No, No, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x14F0..0x14FF -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, So, So, Cn, +/* DATA_BLOCK: -- 0x1500..0x150F -- */ + No, No, No, No, No, No, No, No, No, No, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1510..0x151F -- */ + So, So, So, So, So, So, So, So, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1520..0x152F -- */ + So, No, No, No, No, No, No, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1530..0x153F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x1540..0x154F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1550..0x155F -- */ + Lo, Lo, Lo, Lo, Lo, Lm, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1560..0x156F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lm, Po, Po, Po, +/* DATA_BLOCK: -- 0x1570..0x157F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Lo, Lo, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1580..0x158F -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lo, Mn, +/* DATA_BLOCK: -- 0x1590..0x159F -- */ + Me, Me, Me, Po, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Po, Lm, +/* DATA_BLOCK: -- 0x15A0..0x15AF -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lm, Lm, Mn, Mn, +/* DATA_BLOCK: -- 0x15B0..0x15BF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, +/* DATA_BLOCK: -- 0x15C0..0x15CF -- */ + Mn, Mn, Po, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x15D0..0x15DF -- */ + Sk, Sk, Sk, Sk, Sk, Sk, Sk, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x15E0..0x15EF -- */ + Sk, Sk, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x15F0..0x15FF -- */ + Ll, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x1600..0x160F -- */ + Lm, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Ll, Lu, Ll, Lu, Lu, Ll, +/* DATA_BLOCK: -- 0x1610..0x161F -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lm, Sk, Sk, Lu, Ll, Lu, Ll, Lo, +/* DATA_BLOCK: -- 0x1620..0x162F -- */ + Lu, Ll, Lu, Ll, Ll, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x1630..0x163F -- */ + Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Lu, Lu, Lu, Lu, Ll, +/* DATA_BLOCK: -- 0x1640..0x164F -- */ + Lu, Lu, Lu, Lu, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, Lu, Ll, +/* DATA_BLOCK: -- 0x1650..0x165F -- */ + Cn, Cn, Lu, Ll, Lu, Lu, Lu, Lu, Ll, Lu, Ll, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1660..0x166F -- */ + Cn, Cn, Cn, Cn, Cn, Lu, Ll, Lo, Lm, Lm, Ll, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1670..0x167F -- */ + Lo, Lo, Mn, Lo, Lo, Lo, Mn, Lo, Lo, Lo, Lo, Mn, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1680..0x168F -- */ + Lo, Lo, Lo, Mc, Mc, Mn, Mn, Mc, So, So, So, So, Mn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1690..0x169F -- */ + No, No, No, No, No, No, So, So, Sc, So, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x16A0..0x16AF -- */ + Lo, Lo, Lo, Lo, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x16B0..0x16BF -- */ + Mc, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x16C0..0x16CF -- */ + Lo, Lo, Lo, Lo, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x16D0..0x16DF -- */ + Mc, Mc, Mc, Mc, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, Po, +/* DATA_BLOCK: -- 0x16E0..0x16EF -- */ + Mn, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Po, Po, Po, Lo, Po, Lo, Lo, Mn, +/* DATA_BLOCK: -- 0x16F0..0x16FF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Po, Po, +/* DATA_BLOCK: -- 0x1700..0x170F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x1710..0x171F -- */ + Mn, Mn, Mc, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, +/* DATA_BLOCK: -- 0x1720..0x172F -- */ + Lo, Lo, Lo, Mn, Mc, Mc, Mn, Mn, Mn, Mn, Mc, Mc, Mn, Mn, Mc, Mc, +/* DATA_BLOCK: -- 0x1730..0x173F -- */ + Mc, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Cn, Lm, +/* DATA_BLOCK: -- 0x1740..0x174F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Cn, Cn, Po, Po, +/* DATA_BLOCK: -- 0x1750..0x175F -- */ + Lo, Lo, Lo, Lo, Lo, Mn, Lm, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1760..0x176F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Lo, Lo, Lo, Lo, Lo, Cn, +/* DATA_BLOCK: -- 0x1770..0x177F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mc, +/* DATA_BLOCK: -- 0x1780..0x178F -- */ + Mc, Mn, Mn, Mc, Mc, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1790..0x179F -- */ + Lo, Lo, Lo, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mc, Cn, Cn, +/* DATA_BLOCK: -- 0x17A0..0x17AF -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x17B0..0x17BF -- */ + Lm, Lo, Lo, Lo, Lo, Lo, Lo, So, So, So, Lo, Mc, Mn, Mc, Lo, Lo, +/* DATA_BLOCK: -- 0x17C0..0x17CF -- */ + Mn, Lo, Mn, Mn, Mn, Lo, Lo, Mn, Mn, Lo, Lo, Lo, Lo, Lo, Mn, Mn, +/* DATA_BLOCK: -- 0x17D0..0x17DF -- */ + Lo, Mn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x17E0..0x17EF -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Lo, Lm, Po, Po, +/* DATA_BLOCK: -- 0x17F0..0x17FF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mc, Mn, Mn, Mc, Mc, +/* DATA_BLOCK: -- 0x1800..0x180F -- */ + Po, Po, Lo, Lm, Lm, Mc, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1810..0x181F -- */ + Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, +/* DATA_BLOCK: -- 0x1820..0x182F -- */ + Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1830..0x183F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Sk, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x1840..0x184F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lm, Sk, Sk, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1850..0x185F -- */ + Lo, Lo, Lo, Mc, Mc, Mn, Mc, Mc, Mn, Mc, Mc, Po, Mc, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x1860..0x186F -- */ + Cn, Cn, Cn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1870..0x187F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1880..0x188F -- */ + Cs, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1890..0x189F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cs, +/* DATA_BLOCK: -- 0x18A0..0x18AF -- */ + Co, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x18B0..0x18BF -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Co, +/* DATA_BLOCK: -- 0x18C0..0x18CF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x18D0..0x18DF -- */ + Cn, Cn, Cn, Ll, Ll, Ll, Ll, Ll, Cn, Cn, Cn, Cn, Cn, Lo, Mn, Lo, +/* DATA_BLOCK: -- 0x18E0..0x18EF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Sm, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x18F0..0x18FF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Cn, +/* DATA_BLOCK: -- 0x1900..0x190F -- */ + Lo, Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1910..0x191F -- */ + Lo, Lo, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x1920..0x192F -- */ + Sk, Sk, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1930..0x193F -- */ + Cn, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1940..0x194F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Pe, Ps, +/* DATA_BLOCK: -- 0x1950..0x195F -- */ + Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1960..0x196F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Sc, So, Cn, Cn, +/* DATA_BLOCK: -- 0x1970..0x197F -- */ + Po, Po, Po, Po, Po, Po, Po, Ps, Pe, Po, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1980..0x198F -- */ + Po, Pd, Pd, Pc, Pc, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, Pe, Ps, +/* DATA_BLOCK: -- 0x1990..0x199F -- */ + Pe, Ps, Pe, Ps, Pe, Po, Po, Ps, Pe, Po, Po, Po, Po, Pc, Pc, Pc, +/* DATA_BLOCK: -- 0x19A0..0x19AF -- */ + Po, Po, Po, Cn, Po, Po, Po, Po, Pd, Ps, Pe, Ps, Pe, Ps, Pe, Po, +/* DATA_BLOCK: -- 0x19B0..0x19BF -- */ + Po, Po, Sm, Pd, Sm, Sm, Sm, Cn, Po, Sc, Po, Po, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x19C0..0x19CF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cf, +/* DATA_BLOCK: -- 0x19D0..0x19DF -- */ + Cn, Po, Po, Po, Sc, Po, Po, Po, Ps, Pe, Po, Sm, Po, Pd, Po, Po, +/* DATA_BLOCK: -- 0x19E0..0x19EF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ps, Sm, Pe, Sm, Ps, +/* DATA_BLOCK: -- 0x19F0..0x19FF -- */ + Pe, Po, Ps, Pe, Po, Po, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1A00..0x1A0F -- */ + Lm, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1A10..0x1A1F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lm, Lm, +/* DATA_BLOCK: -- 0x1A20..0x1A2F -- */ + Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1A30..0x1A3F -- */ + Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Lo, Lo, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1A40..0x1A4F -- */ + Sc, Sc, Sm, Sk, So, Sc, Sc, Cn, So, Sm, Sm, Sm, Sm, So, So, Cn, +/* DATA_BLOCK: -- 0x1A50..0x1A5F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cf, Cf, Cf, So, So, Cn, Cn, +/* DATA_BLOCK: -- 0x1A60..0x1A6F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1A70..0x1A7F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x1A80..0x1A8F -- */ + Po, Po, Po, Cn, Cn, Cn, Cn, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1A90..0x1A9F -- */ + No, No, No, No, Cn, Cn, Cn, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1AA0..0x1AAF -- */ + Nl, Nl, Nl, Nl, Nl, No, No, No, No, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x1AB0..0x1ABF -- */ + So, So, So, So, So, So, So, So, So, So, No, No, So, So, So, Cn, +/* DATA_BLOCK: -- 0x1AC0..0x1ACF -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1AD0..0x1ADF -- */ + So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1AE0..0x1AEF -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x1AF0..0x1AFF -- */ + Mn, No, No, No, No, No, No, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1B00..0x1B0F -- */ + No, No, No, No, No, No, No, No, No, No, No, No, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1B10..0x1B1F -- */ + No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1B20..0x1B2F -- */ + Lo, Nl, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Nl, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1B30..0x1B3F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1B40..0x1B4F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Po, +/* DATA_BLOCK: -- 0x1B50..0x1B5F -- */ + Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1B60..0x1B6F -- */ + Po, Nl, Nl, Nl, Nl, Nl, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1B70..0x1B7F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x1B80..0x1B8F -- */ + Lu, Lu, Lu, Lu, Cn, Cn, Cn, Cn, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x1B90..0x1B9F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1BA0..0x1BAF -- */ + Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, +/* DATA_BLOCK: -- 0x1BB0..0x1BBF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1BC0..0x1BCF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Cn, Cn, Cn, Lo, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x1BD0..0x1BDF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Po, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1BE0..0x1BEF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, So, So, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1BF0..0x1BFF -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1C00..0x1C0F -- */ + Lo, Lo, Lo, Cn, Lo, Lo, Cn, Cn, Cn, Cn, Cn, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1C10..0x1C1F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, No, No, No, No, No, No, Cn, Cn, Cn, Po, +/* DATA_BLOCK: -- 0x1C20..0x1C2F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Po, +/* DATA_BLOCK: -- 0x1C30..0x1C3F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, No, No, Lo, Lo, +/* DATA_BLOCK: -- 0x1C40..0x1C4F -- */ + Cn, Cn, No, No, No, No, No, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1C50..0x1C5F -- */ + Lo, Mn, Mn, Mn, Cn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x1C60..0x1C6F -- */ + Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1C70..0x1C7F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Mn, +/* DATA_BLOCK: -- 0x1C80..0x1C8F -- */ + No, No, No, No, No, No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1C90..0x1C9F -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1CA0..0x1CAF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, No, No, Po, +/* DATA_BLOCK: -- 0x1CB0..0x1CBF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, No, No, No, +/* DATA_BLOCK: -- 0x1CC0..0x1CCF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, So, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1CD0..0x1CDF -- */ + Lo, Lo, Lo, Lo, Lo, Mn, Mn, Cn, Cn, Cn, Cn, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1CE0..0x1CEF -- */ + Po, Po, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1CF0..0x1CFF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Po, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x1D00..0x1D0F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1D10..0x1D1F -- */ + Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1D20..0x1D2F -- */ + Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, Po, Po, Po, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1D30..0x1D3F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1D40..0x1D4F -- */ + Lu, Lu, Lu, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1D50..0x1D5F -- */ + Ll, Ll, Ll, Cn, Cn, Cn, Cn, Cn, Cn, Cn, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1D60..0x1D6F -- */ + Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1D70..0x1D7F -- */ + No, No, No, No, No, No, No, No, No, No, No, No, No, No, No, Cn, +/* DATA_BLOCK: -- 0x1D80..0x1D8F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Mn, Mn, Pd, Cn, Cn, +/* DATA_BLOCK: -- 0x1D90..0x1D9F -- */ + Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1DA0..0x1DAF -- */ + No, No, No, No, No, No, No, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1DB0..0x1DBF -- */ + Mn, No, No, No, No, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1DC0..0x1DCF -- */ + Lo, Lo, Lo, Lo, Lo, No, No, No, No, No, No, No, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1DD0..0x1DDF -- */ + Mc, Mn, Mc, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1DE0..0x1DEF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x1DF0..0x1DFF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Po, Po, Po, Po, Po, Po, Po, Cn, Cn, +/* DATA_BLOCK: -- 0x1E00..0x1E0F -- */ + No, No, No, No, No, No, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x1E10..0x1E1F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Mn, +/* DATA_BLOCK: -- 0x1E20..0x1E2F -- */ + Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mc, Mc, Mn, Mn, Po, Po, Cf, Po, Po, +/* DATA_BLOCK: -- 0x1E30..0x1E3F -- */ + Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cf, Cn, Cn, +/* DATA_BLOCK: -- 0x1E40..0x1E4F -- */ + Mn, Mn, Mn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1E50..0x1E5F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x1E60..0x1E6F -- */ + Mn, Mn, Mn, Mn, Mn, Cn, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x1E70..0x1E7F -- */ + Po, Po, Po, Po, Lo, Mc, Mc, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1E80..0x1E8F -- */ + Lo, Lo, Lo, Mn, Po, Po, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1E90..0x1E9F -- */ + Lo, Lo, Lo, Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, +/* DATA_BLOCK: -- 0x1EA0..0x1EAF -- */ + Mc, Lo, Lo, Lo, Lo, Po, Po, Po, Po, Mn, Mn, Mn, Mn, Po, Mc, Mn, +/* DATA_BLOCK: -- 0x1EB0..0x1EBF -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Lo, Po, Lo, Po, Po, Po, +/* DATA_BLOCK: -- 0x1EC0..0x1ECF -- */ + Cn, No, No, No, No, No, No, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x1ED0..0x1EDF -- */ + No, No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1EE0..0x1EEF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mc, Mc, Mc, Mn, +/* DATA_BLOCK: -- 0x1EF0..0x1EFF -- */ + Mn, Mn, Mc, Mc, Mn, Mc, Mn, Mn, Po, Po, Po, Po, Po, Po, Mn, Cn, +/* DATA_BLOCK: -- 0x1F00..0x1F0F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Cn, Lo, Lo, Lo, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x1F10..0x1F1F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x1F20..0x1F2F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Po, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1F30..0x1F3F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, +/* DATA_BLOCK: -- 0x1F40..0x1F4F -- */ + Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1F50..0x1F5F -- */ + Mn, Mn, Mc, Mc, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x1F60..0x1F6F -- */ + Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Mn, Mn, Lo, Mc, Mc, +/* DATA_BLOCK: -- 0x1F70..0x1F7F -- */ + Mn, Mc, Mc, Mc, Mc, Cn, Cn, Mc, Mc, Cn, Cn, Mc, Mc, Mc, Cn, Cn, +/* DATA_BLOCK: -- 0x1F80..0x1F8F -- */ + Lo, Cn, Cn, Cn, Cn, Cn, Cn, Mc, Cn, Cn, Cn, Cn, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x1F90..0x1F9F -- */ + Lo, Lo, Mc, Mc, Cn, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1FA0..0x1FAF -- */ + Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x1FB0..0x1FBF -- */ + Lo, Lo, Lo, Lo, Lo, Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x1FC0..0x1FCF -- */ + Mc, Mc, Mn, Mn, Mn, Mc, Mn, Lo, Lo, Lo, Lo, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x1FD0..0x1FDF -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Po, Po, Cn, Po, Mn, Lo, +/* DATA_BLOCK: -- 0x1FE0..0x1FEF -- */ + Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Mc, Mc, Mc, Mc, Mn, +/* DATA_BLOCK: -- 0x1FF0..0x1FFF -- */ + Mn, Mc, Mn, Mn, Lo, Lo, Po, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2000..0x200F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mc, +/* DATA_BLOCK: -- 0x2010..0x201F -- */ + Mc, Mc, Mn, Mn, Mn, Mn, Cn, Cn, Mc, Mc, Mc, Mc, Mn, Mn, Mc, Mn, +/* DATA_BLOCK: -- 0x2020..0x202F -- */ + Mn, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, +/* DATA_BLOCK: -- 0x2030..0x203F -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Lo, Lo, Lo, Lo, Mn, Mn, Cn, Cn, +/* DATA_BLOCK: -- 0x2040..0x204F -- */ + Mc, Mc, Mc, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mc, Mn, Mc, Mn, +/* DATA_BLOCK: -- 0x2050..0x205F -- */ + Mn, Po, Po, Po, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2060..0x206F -- */ + Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Po, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2070..0x207F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mc, Mn, Mc, Mc, +/* DATA_BLOCK: -- 0x2080..0x208F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2090..0x209F -- */ + Mc, Mc, Mn, Mn, Mn, Mn, Mc, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x20A0..0x20AF -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, No, No, Po, Po, Po, So, +/* DATA_BLOCK: -- 0x20B0..0x20BF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Mn, Po, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x20C0..0x20CF -- */ + No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, +/* DATA_BLOCK: -- 0x20D0..0x20DF -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Cn, Cn, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x20E0..0x20EF -- */ + Lo, Lo, Lo, Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x20F0..0x20FF -- */ + Mc, Mc, Mc, Mc, Mc, Mc, Cn, Mc, Mc, Cn, Cn, Mn, Mn, Mc, Mn, Lo, +/* DATA_BLOCK: -- 0x2100..0x210F -- */ + Mc, Lo, Mc, Mn, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2110..0x211F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2120..0x212F -- */ + Lo, Mc, Mc, Mc, Mn, Mn, Mn, Mn, Cn, Cn, Mn, Mn, Mc, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x2130..0x213F -- */ + Mn, Lo, Po, Lo, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2140..0x214F -- */ + Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2150..0x215F -- */ + Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Lo, Mn, Mn, Mn, Mn, Po, +/* DATA_BLOCK: -- 0x2160..0x216F -- */ + Po, Po, Po, Po, Po, Po, Po, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2170..0x217F -- */ + Lo, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mc, Mn, Mn, Mn, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2180..0x218F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x2190..0x219F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mn, Mn, Po, Po, Po, Lo, Po, Po, +/* DATA_BLOCK: -- 0x21A0..0x21AF -- */ + Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x21B0..0x21BF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mc, Mn, +/* DATA_BLOCK: -- 0x21C0..0x21CF -- */ + Lo, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x21D0..0x21DF -- */ + Po, Po, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x21E0..0x21EF -- */ + Cn, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x21F0..0x21FF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Mc, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x2200..0x220F -- */ + Mn, Mc, Mn, Mn, Mc, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2210..0x221F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2220..0x222F -- */ + Lo, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Mn, Cn, Mn, Mn, Cn, Mn, +/* DATA_BLOCK: -- 0x2230..0x223F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Lo, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2240..0x224F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2250..0x225F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mc, Mc, Mc, Mc, Mc, Cn, +/* DATA_BLOCK: -- 0x2260..0x226F -- */ + Mn, Mn, Cn, Mc, Mc, Mn, Mc, Mn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2270..0x227F -- */ + Lo, Lo, Lo, Mn, Mn, Mc, Mc, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2280..0x228F -- */ + No, No, No, No, No, So, So, So, So, So, So, So, So, Sc, Sc, Sc, +/* DATA_BLOCK: -- 0x2290..0x229F -- */ + Sc, So, So, So, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x22A0..0x22AF -- */ + So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Po, +/* DATA_BLOCK: -- 0x22B0..0x22BF -- */ + Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Nl, Cn, +/* DATA_BLOCK: -- 0x22C0..0x22CF -- */ + Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x22D0..0x22DF -- */ + Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x22E0..0x22EF -- */ + Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x22F0..0x22FF -- */ + Mn, Mn, Mn, Mn, Mn, Po, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2300..0x230F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Po, Po, Po, Po, Po, So, So, So, So, +/* DATA_BLOCK: -- 0x2310..0x231F -- */ + Lm, Lm, Lm, Lm, Po, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2320..0x232F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, No, No, No, No, No, +/* DATA_BLOCK: -- 0x2330..0x233F -- */ + No, No, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2340..0x234F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2350..0x235F -- */ + No, No, No, No, No, No, No, Po, Po, Po, Po, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2360..0x236F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Mn, +/* DATA_BLOCK: -- 0x2370..0x237F -- */ + Lo, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x2380..0x238F -- */ + Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x2390..0x239F -- */ + Mc, Mc, Mc, Mc, Mc, Mc, Mc, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Mn, +/* DATA_BLOCK: -- 0x23A0..0x23AF -- */ + Mn, Mn, Mn, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Lm, +/* DATA_BLOCK: -- 0x23B0..0x23BF -- */ + Lm, Lm, Po, Lm, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x23C0..0x23CF -- */ + Mc, Mc, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x23D0..0x23DF -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x23E0..0x23EF -- */ + Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x23F0..0x23FF -- */ + Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2400..0x240F -- */ + Cn, Cn, Cn, Cn, Lo, Lo, Lo, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2410..0x241F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Cn, So, Mn, Mn, Po, +/* DATA_BLOCK: -- 0x2420..0x242F -- */ + Cf, Cf, Cf, Cf, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2430..0x243F -- */ + So, So, So, So, So, So, So, Cn, Cn, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x2440..0x244F -- */ + So, So, So, So, So, Mc, Mc, Mn, Mn, Mn, So, So, So, Mc, Mc, Mc, +/* DATA_BLOCK: -- 0x2450..0x245F -- */ + Mc, Mc, Mc, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x2460..0x246F -- */ + Mn, Mn, Mn, So, So, Mn, Mn, Mn, Mn, Mn, Mn, Mn, So, So, So, So, +/* DATA_BLOCK: -- 0x2470..0x247F -- */ + So, So, So, So, So, So, So, So, So, So, Mn, Mn, Mn, Mn, So, So, +/* DATA_BLOCK: -- 0x2480..0x248F -- */ + So, So, So, So, So, So, So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2490..0x249F -- */ + So, So, Mn, Mn, Mn, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x24A0..0x24AF -- */ + No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x24B0..0x24BF -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x24C0..0x24CF -- */ + Ll, Ll, Ll, Ll, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x24D0..0x24DF -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Ll, Ll, +/* DATA_BLOCK: -- 0x24E0..0x24EF -- */ + Ll, Ll, Ll, Ll, Ll, Cn, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x24F0..0x24FF -- */ + Lu, Lu, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2500..0x250F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Cn, Lu, Lu, +/* DATA_BLOCK: -- 0x2510..0x251F -- */ + Cn, Cn, Lu, Cn, Cn, Lu, Lu, Cn, Cn, Lu, Lu, Lu, Lu, Cn, Lu, Lu, +/* DATA_BLOCK: -- 0x2520..0x252F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Ll, Ll, Ll, Ll, Cn, Ll, Cn, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2530..0x253F -- */ + Ll, Ll, Ll, Ll, Cn, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2540..0x254F -- */ + Ll, Ll, Ll, Ll, Lu, Lu, Cn, Lu, Lu, Lu, Lu, Cn, Cn, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x2550..0x255F -- */ + Lu, Lu, Lu, Lu, Lu, Cn, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Cn, Ll, Ll, +/* DATA_BLOCK: -- 0x2560..0x256F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Cn, Lu, Lu, Lu, Lu, Cn, +/* DATA_BLOCK: -- 0x2570..0x257F -- */ + Lu, Lu, Lu, Lu, Lu, Cn, Lu, Cn, Cn, Cn, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x2580..0x258F -- */ + Lu, Cn, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2590..0x259F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x25A0..0x25AF -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x25B0..0x25BF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Cn, Cn, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x25C0..0x25CF -- */ + Lu, Sm, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x25D0..0x25DF -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Sm, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x25E0..0x25EF -- */ + Ll, Ll, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x25F0..0x25FF -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Sm, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2600..0x260F -- */ + Ll, Ll, Ll, Ll, Ll, Sm, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x2610..0x261F -- */ + Lu, Lu, Lu, Lu, Lu, Sm, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2620..0x262F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Sm, +/* DATA_BLOCK: -- 0x2630..0x263F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, +/* DATA_BLOCK: -- 0x2640..0x264F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Sm, +/* DATA_BLOCK: -- 0x2650..0x265F -- */ + Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Ll, Sm, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2660..0x266F -- */ + Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Lu, Sm, Ll, Ll, Ll, Ll, Ll, Ll, +/* DATA_BLOCK: -- 0x2670..0x267F -- */ + Ll, Ll, Ll, Sm, Ll, Ll, Ll, Ll, Ll, Ll, Lu, Ll, Cn, Cn, Nd, Nd, +/* DATA_BLOCK: -- 0x2680..0x268F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, +/* DATA_BLOCK: -- 0x2690..0x269F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, So, So, So, So, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x26A0..0x26AF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, So, So, So, +/* DATA_BLOCK: -- 0x26B0..0x26BF -- */ + So, So, So, So, So, Mn, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x26C0..0x26CF -- */ + So, So, So, So, Mn, So, So, Po, Po, Po, Po, Po, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x26D0..0x26DF -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x26E0..0x26EF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x26F0..0x26FF -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Mn, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x2700..0x270F -- */ + Mn, Mn, Cn, Mn, Mn, Cn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2710..0x271F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Lm, Lm, Lm, Lm, Lm, Lm, Lm, Cn, Cn, +/* DATA_BLOCK: -- 0x2720..0x272F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Cn, Cn, Lo, So, +/* DATA_BLOCK: -- 0x2730..0x273F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Mn, Mn, Mn, Mn, +/* DATA_BLOCK: -- 0x2740..0x274F -- */ + Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Nd, Cn, Cn, Cn, Cn, Cn, Sc, +/* DATA_BLOCK: -- 0x2750..0x275F -- */ + Lo, Lo, Lo, Lo, Lo, Cn, Cn, No, No, No, No, No, No, No, No, No, +/* DATA_BLOCK: -- 0x2760..0x276F -- */ + Mn, Mn, Mn, Mn, Mn, Mn, Mn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2770..0x277F -- */ + Ll, Ll, Ll, Ll, Mn, Mn, Mn, Mn, Mn, Mn, Mn, Lm, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2780..0x278F -- */ + No, No, No, No, No, No, No, No, No, No, No, No, So, No, No, No, +/* DATA_BLOCK: -- 0x2790..0x279F -- */ + Sc, No, No, No, No, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x27A0..0x27AF -- */ + No, No, No, No, No, No, No, No, No, No, No, No, No, No, So, No, +/* DATA_BLOCK: -- 0x27B0..0x27BF -- */ + No, No, No, No, No, No, No, No, No, No, No, No, No, No, Cn, Cn, +/* DATA_BLOCK: -- 0x27C0..0x27CF -- */ + Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x27D0..0x27DF -- */ + Cn, Lo, Lo, Cn, Lo, Cn, Cn, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x27E0..0x27EF -- */ + Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Cn, Lo, Cn, Lo, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x27F0..0x27FF -- */ + Cn, Cn, Lo, Cn, Cn, Cn, Cn, Lo, Cn, Lo, Cn, Lo, Cn, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2800..0x280F -- */ + Cn, Lo, Lo, Cn, Lo, Cn, Cn, Lo, Cn, Lo, Cn, Lo, Cn, Lo, Cn, Lo, +/* DATA_BLOCK: -- 0x2810..0x281F -- */ + Cn, Lo, Lo, Cn, Lo, Cn, Cn, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2820..0x282F -- */ + Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Cn, Lo, Cn, +/* DATA_BLOCK: -- 0x2830..0x283F -- */ + Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2840..0x284F -- */ + Cn, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, Cn, Lo, Lo, Lo, Lo, Lo, +/* DATA_BLOCK: -- 0x2850..0x285F -- */ + Sm, Sm, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2860..0x286F -- */ + Cn, So, So, So, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x2870..0x287F -- */ + No, No, No, No, No, No, No, No, No, No, No, No, No, So, So, So, +/* DATA_BLOCK: -- 0x2880..0x288F -- */ + So, So, So, So, So, So, So, So, So, So, So, So, So, So, Cn, Cn, +/* DATA_BLOCK: -- 0x2890..0x289F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x28A0..0x28AF -- */ + So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x28B0..0x28BF -- */ + So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x28C0..0x28CF -- */ + So, So, So, So, So, So, So, So, So, So, So, Sk, Sk, Sk, Sk, Sk, +/* DATA_BLOCK: -- 0x28D0..0x28DF -- */ + So, So, So, So, So, So, So, So, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x28E0..0x28EF -- */ + So, So, So, So, So, So, So, So, So, Cn, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x28F0..0x28FF -- */ + So, So, So, So, So, So, So, So, So, So, So, So, Cn, So, So, So, +/* DATA_BLOCK: -- 0x2900..0x290F -- */ + So, So, So, So, So, Cn, Cn, Cn, So, So, So, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2910..0x291F -- */ + So, So, So, Cn, So, So, So, So, So, So, So, So, So, So, So, So, +/* DATA_BLOCK: -- 0x2920..0x292F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Cn, Cn, +/* DATA_BLOCK: -- 0x2930..0x293F -- */ + Cn, Cn, Cn, Cn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2940..0x294F -- */ + Cn, Lo, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2950..0x295F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Lo, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2960..0x296F -- */ + Cn, Cf, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, +/* DATA_BLOCK: -- 0x2970..0x297F -- */ + Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, Cf, +/* DATA_BLOCK: -- 0x2980..0x298F -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Co, Cn, Cn, +/* DATA_BLOCK: -- 0x2990..0x299D -- */ + Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Cn, Co +}; + +static const SBUInt16 MainGeneralCategoryIndexes[4096] = { +/* INDEX_BLOCK: -- 0x0000..0x003F -- */ + 0x0000, 0x0000, 0x0010, 0x0020, 0x0030, 0x0040, 0x0050, 0x0060, 0x0000, 0x0000, 0x0070, 0x0080, + 0x0090, 0x00A0, 0x00B0, 0x00C0, 0x00D0, 0x00D0, 0x00D0, 0x00E0, 0x00F0, 0x00D0, 0x00D0, 0x0100, + 0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0160, 0x00D0, 0x0170, 0x00D0, 0x00D0, 0x00D0, 0x0180, + 0x0190, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x01A0, 0x00B0, 0x01B0, 0x01C0, 0x01D0, 0x01E0, 0x01F0, + 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0210, 0x0220, 0x0230, 0x0240, 0x00B0, + 0x0250, 0x0260, 0x00D0, 0x0270, +/* INDEX_BLOCK: -- 0x0040..0x007F -- */ + 0x0090, 0x0090, 0x0090, 0x00B0, 0x00B0, 0x00B0, 0x00D0, 0x00D0, 0x0280, 0x00D0, 0x00D0, 0x00D0, + 0x0290, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x02A0, 0x0090, 0x02B0, 0x00B0, 0x00B0, + 0x02C0, 0x02D0, 0x0200, 0x02E0, 0x02F0, 0x0300, 0x0310, 0x0320, 0x0330, 0x0340, 0x0300, 0x0300, + 0x0350, 0x0200, 0x0360, 0x0370, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0380, 0x0390, 0x03A0, + 0x03B0, 0x03C0, 0x0300, 0x0200, 0x03D0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03F0, + 0x0400, 0x0300, 0x0410, 0x0420, +/* INDEX_BLOCK: -- 0x0080..0x00BF -- */ + 0x0300, 0x0430, 0x0440, 0x0450, 0x0300, 0x0460, 0x0470, 0x0480, 0x0480, 0x0480, 0x0300, 0x0490, + 0x04A0, 0x04B0, 0x04C0, 0x0200, 0x04D0, 0x0300, 0x0300, 0x04E0, 0x04F0, 0x0500, 0x0510, 0x0520, + 0x0530, 0x0540, 0x0550, 0x0560, 0x0570, 0x0580, 0x0590, 0x05A0, 0x05B0, 0x0540, 0x0550, 0x05C0, + 0x05D0, 0x05E0, 0x05F0, 0x0600, 0x0610, 0x0620, 0x0550, 0x0630, 0x0640, 0x0650, 0x0590, 0x0660, + 0x0670, 0x0540, 0x0550, 0x0680, 0x0690, 0x06A0, 0x0590, 0x06B0, 0x06C0, 0x06D0, 0x06E0, 0x06F0, + 0x0700, 0x0710, 0x05F0, 0x0720, +/* INDEX_BLOCK: -- 0x00C0..0x00FF -- */ + 0x0730, 0x0740, 0x0550, 0x0750, 0x0760, 0x0770, 0x0590, 0x0780, 0x0790, 0x0740, 0x0550, 0x07A0, + 0x07B0, 0x07C0, 0x0590, 0x07D0, 0x07E0, 0x0740, 0x0300, 0x07F0, 0x0800, 0x0810, 0x0590, 0x0820, + 0x0830, 0x0840, 0x0300, 0x0850, 0x0860, 0x0870, 0x05F0, 0x0880, 0x0890, 0x0300, 0x0300, 0x08A0, + 0x08B0, 0x08C0, 0x0480, 0x0480, 0x08D0, 0x0300, 0x08E0, 0x08F0, 0x0900, 0x0910, 0x0480, 0x0480, + 0x0920, 0x0930, 0x0940, 0x0950, 0x0960, 0x0300, 0x0970, 0x0980, 0x0990, 0x09A0, 0x0200, 0x09B0, + 0x09C0, 0x09D0, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0100..0x013F -- */ + 0x0300, 0x0300, 0x09E0, 0x09F0, 0x0A00, 0x0A10, 0x0A20, 0x0A30, 0x0A40, 0x0A50, 0x0090, 0x0090, + 0x0A60, 0x00B0, 0x00B0, 0x0A70, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0A80, 0x0A90, 0x0300, 0x0300, 0x0A80, 0x0300, 0x0300, 0x0AA0, 0x0AB0, 0x0AC0, 0x0300, 0x0300, + 0x0300, 0x0AB0, 0x0300, 0x0300, 0x0300, 0x0AD0, 0x0AE0, 0x0AF0, 0x0300, 0x0B00, 0x0090, 0x0090, + 0x0090, 0x0090, 0x0090, 0x0B10, +/* INDEX_BLOCK: -- 0x0140..0x017F -- */ + 0x0B20, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0B30, 0x0300, 0x0B40, 0x0B50, 0x0300, 0x0300, 0x0300, 0x0300, 0x0B60, 0x0B70, + 0x0B80, 0x0B90, 0x0300, 0x0BA0, 0x0300, 0x0BB0, 0x0B80, 0x0BC0, 0x0300, 0x0300, 0x0300, 0x0BD0, + 0x0BE0, 0x0BF0, 0x0C00, 0x0C10, +/* INDEX_BLOCK: -- 0x0180..0x01BF -- */ + 0x0C20, 0x0C00, 0x0300, 0x0300, 0x0C30, 0x0300, 0x0300, 0x0C40, 0x0C50, 0x0300, 0x0C60, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0C70, 0x0300, 0x0C80, 0x0C90, 0x0CA0, 0x0CB0, 0x0300, 0x0CC0, 0x0CD0, + 0x0300, 0x0300, 0x0CE0, 0x0300, 0x0CF0, 0x0D00, 0x0D10, 0x0D10, 0x0300, 0x0D20, 0x0300, 0x0300, + 0x0300, 0x0D30, 0x0D40, 0x0D50, 0x0C00, 0x0C00, 0x0D60, 0x0D70, 0x0D80, 0x0480, 0x0480, 0x0480, + 0x0D90, 0x0300, 0x0300, 0x0DA0, 0x0DB0, 0x0A00, 0x0DC0, 0x0DD0, 0x0DE0, 0x0300, 0x0DF0, 0x0400, + 0x0300, 0x0300, 0x0E00, 0x0E10, +/* INDEX_BLOCK: -- 0x01C0..0x01FF -- */ + 0x0300, 0x0300, 0x0E20, 0x0E30, 0x0E40, 0x0400, 0x0300, 0x0E50, 0x0E60, 0x0090, 0x0090, 0x0E70, + 0x0E80, 0x0E90, 0x0EA0, 0x0EB0, 0x00B0, 0x00B0, 0x0EC0, 0x01B0, 0x01B0, 0x01B0, 0x0ED0, 0x0EE0, + 0x00B0, 0x0EF0, 0x01B0, 0x01B0, 0x0200, 0x0200, 0x0200, 0x0F00, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x0F10, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x0F20, 0x0F30, 0x0F20, 0x0F20, 0x0F30, 0x0F40, 0x0F20, 0x0F50, 0x0F60, 0x0F60, 0x0F60, 0x0F70, + 0x0F80, 0x0F90, 0x0FA0, 0x0FB0, +/* INDEX_BLOCK: -- 0x0200..0x023F -- */ + 0x0FC0, 0x0FD0, 0x0FE0, 0x0FF0, 0x1000, 0x1010, 0x1020, 0x1030, 0x1040, 0x1050, 0x1060, 0x1060, + 0x0480, 0x1070, 0x1080, 0x0D80, 0x1090, 0x10A0, 0x10B0, 0x10C0, 0x10D0, 0x10E0, 0x10F0, 0x10F0, + 0x1100, 0x1110, 0x1120, 0x0D10, 0x1130, 0x1140, 0x0D10, 0x1150, 0x1160, 0x1160, 0x1160, 0x1160, + 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, + 0x1170, 0x0D10, 0x1180, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1190, 0x0D10, 0x11A0, 0x1160, 0x11B0, + 0x0D10, 0x11C0, 0x11D0, 0x0D10, +/* INDEX_BLOCK: -- 0x0240..0x027F -- */ + 0x0D10, 0x0D10, 0x11E0, 0x0480, 0x11F0, 0x0480, 0x10E0, 0x10E0, 0x10E0, 0x1200, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x1210, 0x10E0, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x1220, 0x1230, 0x0D10, 0x0D10, 0x1240, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x1250, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1260, 0x1270, 0x10E0, 0x1280, 0x0D10, 0x0D10, + 0x1290, 0x1160, 0x12A0, 0x1160, +/* INDEX_BLOCK: -- 0x0280..0x02BF -- */ + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, + 0x12B0, 0x12C0, 0x1160, 0x1160, 0x1160, 0x12D0, 0x1160, 0x12E0, 0x1160, 0x1160, 0x1160, 0x1160, + 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, + 0x0D10, 0x0D10, 0x0D10, 0x1160, 0x12F0, 0x0D10, 0x0D10, 0x1300, 0x0D10, 0x1310, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, +/* INDEX_BLOCK: -- 0x02C0..0x02FF -- */ + 0x0090, 0x0090, 0x1320, 0x00B0, 0x00B0, 0x1330, 0x1340, 0x1350, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x00D0, 0x00D0, 0x1360, 0x1370, 0x00B0, 0x00B0, 0x1380, 0x0300, 0x0300, 0x0300, 0x1390, 0x13A0, + 0x0300, 0x13B0, 0x13C0, 0x13C0, 0x13C0, 0x13C0, 0x0200, 0x0200, 0x13D0, 0x13E0, 0x13F0, 0x1400, + 0x1410, 0x1420, 0x0480, 0x0480, 0x0D10, 0x1430, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1440, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x1450, 0x0480, 0x1460, +/* INDEX_BLOCK: -- 0x0300..0x033F -- */ + 0x1470, 0x1480, 0x1490, 0x14A0, 0x0890, 0x0300, 0x0300, 0x0300, 0x0300, 0x14B0, 0x0B20, 0x0300, + 0x0300, 0x0300, 0x0300, 0x14C0, 0x14D0, 0x0300, 0x0300, 0x0890, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0C80, 0x14E0, 0x0300, 0x0300, 0x0D10, 0x0D10, 0x1440, 0x0300, 0x0D10, 0x14F0, 0x1500, 0x0D10, + 0x1510, 0x1520, 0x0D10, 0x0D10, 0x1500, 0x0D10, 0x0D10, 0x1520, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, +/* INDEX_BLOCK: -- 0x0340..0x037F -- */ + 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0380..0x03BF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x03C0..0x03FF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x1530, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0650, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0400..0x043F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x1540, +/* INDEX_BLOCK: -- 0x0440..0x047F -- */ + 0x0300, 0x1550, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, +/* INDEX_BLOCK: -- 0x0480..0x04BF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0970, 0x0D10, 0x0D10, 0x0D10, + 0x11E0, 0x0300, 0x0300, 0x0E50, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x1560, 0x0300, 0x1570, 0x0480, + 0x00D0, 0x00D0, 0x1580, 0x1590, 0x00D0, 0x15A0, 0x0300, 0x0300, 0x0300, 0x0300, 0x15B0, 0x15C0, + 0x01F0, 0x15D0, 0x15E0, 0x15F0, 0x00D0, 0x00D0, 0x00D0, 0x1600, 0x1610, 0x1620, 0x1630, 0x1640, + 0x1650, 0x0480, 0x0480, 0x1660, +/* INDEX_BLOCK: -- 0x04C0..0x04FF -- */ + 0x1670, 0x0300, 0x1680, 0x1690, 0x0300, 0x0300, 0x0300, 0x16A0, 0x16B0, 0x0300, 0x0300, 0x16C0, + 0x16D0, 0x0C00, 0x0200, 0x16E0, 0x0400, 0x0300, 0x16F0, 0x0300, 0x1700, 0x1710, 0x0300, 0x0970, + 0x04D0, 0x0300, 0x0300, 0x1720, 0x1730, 0x1740, 0x1750, 0x1760, 0x0300, 0x0300, 0x1770, 0x1780, + 0x1790, 0x17A0, 0x0300, 0x17B0, 0x0300, 0x0300, 0x0300, 0x17C0, 0x17D0, 0x17E0, 0x17F0, 0x1800, + 0x1810, 0x1820, 0x13C0, 0x00B0, 0x00B0, 0x1830, 0x1840, 0x00B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x0300, 0x0300, 0x1850, 0x0C00, +/* INDEX_BLOCK: -- 0x0500..0x053F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x1860, 0x0300, + 0x1870, 0x0300, 0x0300, 0x0CE0, +/* INDEX_BLOCK: -- 0x0540..0x057F -- */ + 0x1880, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x1890, 0x1880, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x1890, +/* INDEX_BLOCK: -- 0x0580..0x05BF -- */ + 0x1880, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x1890, +/* INDEX_BLOCK: -- 0x05C0..0x05FF -- */ + 0x18A0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0600..0x063F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x18B0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0CC0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CF0, 0x0480, 0x0480, + 0x18C0, 0x18D0, 0x18E0, 0x18F0, 0x1900, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x1910, + 0x1920, 0x1930, 0x0300, 0x0300, +/* INDEX_BLOCK: -- 0x0640..0x067F -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x1940, 0x0480, 0x0300, 0x0300, 0x0300, + 0x0300, 0x1950, 0x0300, 0x0300, 0x04A0, 0x0480, 0x0480, 0x1960, 0x0200, 0x1970, 0x0200, 0x1980, + 0x1990, 0x19A0, 0x19B0, 0x0490, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x19C0, + 0x19D0, 0x0020, 0x0030, 0x0040, 0x0050, 0x19E0, 0x19F0, 0x1A00, 0x0300, 0x1A10, 0x0300, 0x0C80, + 0x1A20, 0x1A30, 0x1A40, 0x1A50, +/* INDEX_BLOCK: -- 0x0680..0x06BF -- */ + 0x1A60, 0x0300, 0x0AC0, 0x1A70, 0x0CC0, 0x0CC0, 0x0480, 0x0480, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0470, 0x1A80, 0x10E0, 0x10E0, 0x1A90, 0x10F0, 0x10F0, 0x10F0, 0x1AA0, + 0x1AB0, 0x1AC0, 0x1AD0, 0x0480, 0x0480, 0x0D10, 0x0D10, 0x1AE0, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0970, 0x0300, 0x0300, 0x0300, 0x0650, 0x1AF0, 0x1B00, + 0x0300, 0x0300, 0x1B10, 0x0300, 0x1B20, 0x0300, 0x0300, 0x1B30, 0x0300, 0x1B40, 0x0300, 0x0300, + 0x1B50, 0x1B60, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x06C0..0x06FF -- */ + 0x0090, 0x0090, 0x1B70, 0x00B0, 0x00B0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CC0, 0x0C00, 0x0090, + 0x0090, 0x1B80, 0x00B0, 0x1B90, 0x0300, 0x0300, 0x04A0, 0x0300, 0x0300, 0x0300, 0x1BA0, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x13B0, 0x0300, 0x0C70, 0x04A0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0700..0x073F -- */ + 0x1BB0, 0x0300, 0x0300, 0x1BC0, 0x0300, 0x1BD0, 0x0300, 0x1BE0, 0x0300, 0x0C80, 0x1BF0, 0x0480, + 0x0480, 0x0480, 0x0300, 0x1C00, 0x0300, 0x1C10, 0x0300, 0x1C20, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0300, 0x0300, 0x0300, 0x1C30, 0x10E0, 0x1C40, 0x10E0, 0x10E0, 0x1C50, 0x1C60, 0x0300, 0x1C70, + 0x1C80, 0x1C90, 0x0300, 0x1CA0, 0x0300, 0x1CB0, 0x0480, 0x0480, 0x1CC0, 0x0300, 0x1CD0, 0x1CE0, + 0x0300, 0x0300, 0x0300, 0x1CF0, 0x0300, 0x1D00, 0x0300, 0x1D10, 0x0300, 0x1D20, 0x1D30, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0740..0x077F -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0C40, 0x0480, 0x0480, 0x0480, 0x0090, 0x0090, 0x0090, 0x1D40, + 0x00B0, 0x00B0, 0x00B0, 0x1D50, 0x0300, 0x0300, 0x1D60, 0x0C00, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x10E0, 0x1D70, 0x0300, 0x0300, 0x1D80, 0x1D90, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0300, 0x1CB0, 0x1DA0, 0x0300, 0x03E0, 0x1DB0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, + 0x1DC0, 0x0480, 0x0300, 0x13B0, +/* INDEX_BLOCK: -- 0x0780..0x07BF -- */ + 0x1DD0, 0x0300, 0x0300, 0x1DE0, 0x1DF0, 0x1C40, 0x1E00, 0x1E10, 0x0DE0, 0x0300, 0x0300, 0x1E20, + 0x1E30, 0x0300, 0x0C40, 0x0C00, 0x1E40, 0x0300, 0x1E50, 0x1E60, 0x1E70, 0x0300, 0x0300, 0x1E80, + 0x0DE0, 0x0300, 0x0300, 0x1E90, 0x1EA0, 0x1EB0, 0x1EC0, 0x1ED0, 0x0300, 0x0620, 0x1EE0, 0x1EF0, + 0x0480, 0x0480, 0x0480, 0x0480, 0x1F00, 0x1F10, 0x1F20, 0x0300, 0x0300, 0x1F30, 0x1F40, 0x0C00, + 0x1F50, 0x0540, 0x0550, 0x1F60, 0x1F70, 0x1F80, 0x1F90, 0x1FA0, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x07C0..0x07FF -- */ + 0x0300, 0x0300, 0x0300, 0x1FB0, 0x1FC0, 0x1FD0, 0x1D90, 0x0480, 0x0300, 0x0300, 0x0300, 0x1FE0, + 0x1FF0, 0x0C00, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0300, 0x0300, 0x2000, 0x2010, 0x2020, 0x2030, 0x0480, 0x0480, 0x0300, 0x0300, 0x0300, 0x2040, + 0x2050, 0x0C00, 0x2060, 0x0480, 0x0300, 0x0300, 0x2070, 0x2080, 0x0C00, 0x0480, 0x0480, 0x0480, + 0x0300, 0x0AD0, 0x2090, 0x20A0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0800..0x083F -- */ + 0x0300, 0x0300, 0x1EE0, 0x20B0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0090, 0x0090, + 0x00B0, 0x00B0, 0x0940, 0x20C0, 0x20D0, 0x20E0, 0x0300, 0x20F0, 0x2100, 0x0C00, 0x0480, 0x0480, + 0x0480, 0x0480, 0x2110, 0x0300, 0x0300, 0x2120, 0x2130, 0x0480, 0x2140, 0x0300, 0x0300, 0x2150, + 0x2160, 0x2170, 0x0300, 0x0300, 0x2180, 0x2190, 0x21A0, 0x0480, 0x0300, 0x0300, 0x0300, 0x0C40, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0840..0x087F -- */ + 0x0550, 0x0300, 0x2000, 0x21B0, 0x21C0, 0x0940, 0x0AF0, 0x21D0, 0x0300, 0x21E0, 0x21F0, 0x2200, + 0x0480, 0x0480, 0x0480, 0x0480, 0x2210, 0x0300, 0x0300, 0x2220, 0x2230, 0x0C00, 0x2240, 0x0300, + 0x2250, 0x2260, 0x0C00, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x2270, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0650, + 0x10E0, 0x2280, 0x2290, 0x22A0, +/* INDEX_BLOCK: -- 0x0880..0x08BF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CF0, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x08C0..0x08FF -- */ + 0x10F0, 0x10F0, 0x10F0, 0x10F0, 0x10F0, 0x10F0, 0x22B0, 0x22C0, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x22D0, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0900..0x093F -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, +/* INDEX_BLOCK: -- 0x0940..0x097F -- */ + 0x0300, 0x0300, 0x0C80, 0x22E0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0980..0x09BF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x13B0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x09C0..0x09FF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0C40, + 0x0300, 0x0C80, 0x1740, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0CC0, 0x22F0, + 0x0300, 0x0300, 0x0300, 0x2300, 0x2310, 0x2320, 0x2330, 0x2340, 0x0300, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0A00..0x0A3F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0090, 0x0090, 0x00B0, 0x00B0, 0x10E0, 0x2350, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0300, 0x0300, 0x0300, 0x0300, 0x2360, 0x2370, 0x2380, 0x2380, 0x2390, 0x23A0, 0x0480, 0x0480, + 0x0480, 0x0480, 0x23B0, 0x23C0, +/* INDEX_BLOCK: -- 0x0A40..0x0A7F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x23D0, +/* INDEX_BLOCK: -- 0x0A80..0x0ABF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0C70, 0x0480, 0x0480, 0x23E0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0AC0..0x0AFF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0C80, 0x0480, 0x0480, 0x0480, 0x23F0, 0x2400, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CE0, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0B00..0x0B3F -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0470, 0x0970, 0x0C40, 0x2410, 0x2420, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0B40..0x0B7F -- */ + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x1450, 0x0D10, 0x0D10, 0x2430, 0x0D10, 0x0D10, 0x0D10, 0x2440, 0x2450, + 0x2460, 0x0D10, 0x2470, 0x0D10, 0x0D10, 0x0D10, 0x2480, 0x0480, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x2490, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x10E0, 0x24A0, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x11E0, 0x10E0, 0x1C80, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0B80..0x0BBF -- */ + 0x0090, 0x24B0, 0x00B0, 0x24C0, 0x24D0, 0x24E0, 0x0F20, 0x0090, 0x24F0, 0x2500, 0x2510, 0x2520, + 0x2530, 0x0090, 0x24B0, 0x00B0, 0x2540, 0x2550, 0x00B0, 0x2560, 0x2570, 0x2580, 0x2590, 0x0090, + 0x25A0, 0x00B0, 0x0090, 0x24B0, 0x00B0, 0x24C0, 0x24D0, 0x00B0, 0x0F20, 0x0090, 0x24F0, 0x2590, + 0x0090, 0x25A0, 0x00B0, 0x0090, 0x24B0, 0x00B0, 0x25B0, 0x0090, 0x25C0, 0x25D0, 0x25E0, 0x25F0, + 0x00B0, 0x2600, 0x0090, 0x2610, 0x2620, 0x2630, 0x2640, 0x00B0, 0x2650, 0x0090, 0x2660, 0x00B0, + 0x2670, 0x2680, 0x2680, 0x2680, +/* INDEX_BLOCK: -- 0x0BC0..0x0BFF -- */ + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0200, 0x0200, 0x0200, 0x2690, + 0x0200, 0x0200, 0x26A0, 0x26B0, 0x26C0, 0x26D0, 0x02D0, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0C00..0x0C3F -- */ + 0x26E0, 0x26F0, 0x2700, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0300, 0x0970, 0x2710, 0x2720, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0300, 0x0300, 0x2730, 0x2740, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0C40..0x0C7F -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x2750, 0x2760, 0x0480, 0x0480, 0x0090, 0x0090, 0x24F0, 0x00B0, 0x2770, 0x1740, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0C80..0x0CBF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x1EC0, 0x10E0, 0x10E0, 0x2780, 0x2790, + 0x0480, 0x0480, 0x0480, 0x0480, 0x1EC0, 0x10E0, 0x27A0, 0x27B0, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x27C0, 0x0300, 0x27D0, 0x27E0, + 0x27F0, 0x2800, 0x2810, 0x2820, 0x2830, 0x0CE0, 0x2840, 0x0CE0, 0x0480, 0x0480, 0x0480, 0x2850, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0CC0..0x0CFF -- */ + 0x0D10, 0x0D10, 0x1460, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1440, 0x14F0, 0x2860, + 0x2860, 0x2860, 0x0D10, 0x1450, 0x2870, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x2880, 0x0480, 0x0480, 0x0480, 0x2890, 0x0D10, 0x28A0, 0x0D10, 0x0D10, 0x1460, + 0x2480, 0x28B0, 0x1450, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x28C0, +/* INDEX_BLOCK: -- 0x0D00..0x0D3F -- */ + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x28D0, 0x1AC0, 0x1AC0, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x1440, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x2480, 0x1460, 0x0480, +/* INDEX_BLOCK: -- 0x0D40..0x0D7F -- */ + 0x1460, 0x0D10, 0x0D10, 0x0D10, 0x28D0, 0x0B00, 0x0D10, 0x0D10, 0x28D0, 0x0D10, 0x2880, 0x28B0, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x28E0, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x28F0, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, + 0x0D10, 0x1440, 0x2880, 0x2900, 0x11E0, 0x0D10, 0x2480, 0x11E0, 0x28A0, 0x11E0, 0x0480, 0x0480, + 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x0D10, 0x2910, 0x0D10, 0x0D10, + 0x11F0, 0x0480, 0x0480, 0x0C00, +/* INDEX_BLOCK: -- 0x0D80..0x0DBF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x2920, 0x0480, 0x0480, + 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0DC0..0x0DFF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x2930, 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0E00..0x0E3F -- */ + 0x0480, 0x2920, 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0E40..0x0E7F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x2940, 0x0650, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0E80..0x0EBF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0650, 0x0480, +/* INDEX_BLOCK: -- 0x0EC0..0x0EFF -- */ + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0CC0, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0F00..0x0F3F -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x2950, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0F40..0x0F7F -- */ + 0x2960, 0x0480, 0x2970, 0x2970, 0x2970, 0x2970, 0x2970, 0x2970, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, + 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0200, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, +/* INDEX_BLOCK: -- 0x0F80..0x0FBF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x2980, +/* INDEX_BLOCK: -- 0x0FC0..0x0FFF -- */ + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, 0x0480, + 0x0480, 0x0480, 0x0480, 0x2990 +}; + +static const SBUInt16 BranchGeneralCategoryIndexes[1088] = { + 0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240, 0x0280, 0x02C0, + 0x0300, 0x0340, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x03C0, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0400, 0x0440, 0x0480, 0x04C0, 0x0340, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0500, 0x0540, 0x0580, 0x05C0, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0600, 0x0640, 0x0680, 0x06C0, 0x0700, 0x0740, 0x0780, 0x07C0, 0x0800, 0x0840, + 0x0880, 0x08C0, 0x0380, 0x0380, 0x0900, 0x0940, 0x0380, 0x0380, 0x0380, 0x0980, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x09C0, 0x0A00, 0x0340, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0A40, 0x0900, 0x0A80, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0AC0, 0x0380, 0x0380, 0x0B00, 0x0380, 0x0380, 0x0380, 0x0380, 0x0B40, 0x0B80, 0x0BC0, 0x0380, + 0x0C00, 0x0380, 0x0C40, 0x0C80, 0x0CC0, 0x0D00, 0x0D40, 0x0380, 0x0340, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0D80, 0x0380, 0x0380, 0x0380, 0x0DC0, 0x0E00, 0x0380, 0x0380, 0x0380, 0x0380, 0x0E40, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0E80, 0x0380, 0x0380, 0x0380, 0x0EC0, 0x0380, + 0x0340, 0x0380, 0x0380, 0x0380, 0x0F00, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0F40, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x05C0, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0F80, 0x05C0, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, + 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0380, 0x0FC0 +}; + +SB_INTERNAL SBGeneralCategory LookupGeneralCategory(SBCodepoint codepoint) { + if (codepoint <= 0x10FFFD) { + return PrimaryGeneralCategoryData[ + MainGeneralCategoryIndexes[ + BranchGeneralCategoryIndexes[ + codepoint / 0x0400 + ] + (codepoint % 0x0400) / 0x0010 + ] + (codepoint % 0x0010) + ]; + } + + return Cn; +} + +#undef Cc +#undef Cf +#undef Cn +#undef Co +#undef Cs +#undef Ll +#undef Lm +#undef Lo +#undef Lt +#undef Lu +#undef Mc +#undef Me +#undef Mn +#undef Nd +#undef Nl +#undef No +#undef Pc +#undef Pd +#undef Pe +#undef Pf +#undef Pi +#undef Po +#undef Ps +#undef Sc +#undef Sk +#undef Sm +#undef So +#undef Zl +#undef Zp +#undef Zs diff --git a/lib/sheenbidi/Source/GeneralCategoryLookup.h b/lib/sheenbidi/Source/GeneralCategoryLookup.h new file mode 100644 index 000000000..9a0f6aac4 --- /dev/null +++ b/lib/sheenbidi/Source/GeneralCategoryLookup.h @@ -0,0 +1,16 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + */ + +#ifndef _SB_INTERNAL_GENERAL_CATEGORY_LOOKUP_H +#define _SB_INTERNAL_GENERAL_CATEGORY_LOOKUP_H + +#include <SBConfig.h> +#include <SBGeneralCategory.h> + +#include "SBBase.h" + +SB_INTERNAL SBGeneralCategory LookupGeneralCategory(SBCodepoint codepoint); + +#endif diff --git a/lib/sheenbidi/Source/IsolatingRun.c b/lib/sheenbidi/Source/IsolatingRun.c new file mode 100644 index 000000000..a5e8c87cc --- /dev/null +++ b/lib/sheenbidi/Source/IsolatingRun.c @@ -0,0 +1,529 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> + +#include "BidiChain.h" +#include "BracketQueue.h" +#include "BracketType.h" +#include "LevelRun.h" +#include "PairingLookup.h" +#include "SBAssert.h" +#include "SBBase.h" +#include "SBLog.h" +#include "IsolatingRun.h" + +static void ResolveAvailableBracketPairs(IsolatingRunRef isolatingRun); + +static void AttachLevelRunLinks(IsolatingRunRef isolatingRun) +{ + BidiChainRef chain = isolatingRun->bidiChain; + LevelRunRef baseLevelRun = isolatingRun->baseLevelRun; + LevelRunRef current; + LevelRunRef next; + + isolatingRun->_originalLink = BidiChainGetNext(chain, chain->roller); + BidiChainSetNext(chain, chain->roller, baseLevelRun->firstLink); + + /* Iterate over level runs and attach their links to form an isolating run. */ + for (current = baseLevelRun; (next = current->next); current = next) { + BidiChainSetNext(chain, current->lastLink, next->firstLink); + } + BidiChainSetNext(chain, current->lastLink, chain->roller); + + isolatingRun->_lastLevelRun = current; + isolatingRun->_sos = RunExtrema_SOR(baseLevelRun->extrema); + + if (!RunKindIsPartialIsolate(baseLevelRun->kind)) { + isolatingRun->_eos = RunExtrema_EOR(current->extrema); + } else { + SBLevel paragraphLevel = isolatingRun->paragraphLevel; + SBLevel runLevel = baseLevelRun->level; + SBLevel eosLevel = (runLevel > paragraphLevel ? runLevel : paragraphLevel); + isolatingRun->_eos = ((eosLevel & 1) ? SBBidiTypeR : SBBidiTypeL); + } +} + +static void AttachOriginalLinks(IsolatingRunRef isolatingRun) +{ + BidiChainRef chain = isolatingRun->bidiChain; + LevelRunRef current; + + BidiChainSetNext(chain, chain->roller, isolatingRun->_originalLink); + + /* Iterate over level runs and attach original subsequent links. */ + for (current = isolatingRun->baseLevelRun; current; current = current->next) { + BidiChainSetNext(chain, current->lastLink, current->subsequentLink); + } +} + +static BidiLink ResolveWeakTypes(IsolatingRunRef isolatingRun) +{ + BidiChainRef chain = isolatingRun->bidiChain; + BidiLink roller = chain->roller; + BidiLink link; + + BidiLink priorLink; + SBBidiType sos; + + SBBidiType w1PriorType; + SBBidiType w2StrongType; + SBBidiType w4PriorType; + SBBidiType w5PriorType; + SBBidiType w7StrongType; + + priorLink = roller; + sos = isolatingRun->_sos; + + w1PriorType = sos; + w2StrongType = sos; + + BidiChainForEach(chain, roller, link) { + SBBidiType type = BidiChainGetType(chain, link); + SBBoolean forceMerge = SBFalse; + + /* Rule W1 */ + if (type == SBBidiTypeNSM) { + /* Change the 'type' variable as well because it can be EN on which W2 depends. */ + type = (SBBidiTypeIsIsolate(w1PriorType) ? SBBidiTypeON : w1PriorType); + BidiChainSetType(chain, link, type); + + /* Fix for 3rd point of rule N0. */ + if (w1PriorType == SBBidiTypeON) { + forceMerge = SBTrue; + } + } + w1PriorType = type; + + /* Rule W2 */ + if (type == SBBidiTypeEN) { + if (w2StrongType == SBBidiTypeAL) { + BidiChainSetType(chain, link, SBBidiTypeAN); + } + } + /* + * Rule W3 + * NOTE: It is safe to apply W3 in 'else-if' statement because it only depends on type AL. + * Even if W2 changes EN to AN, there won't be any harm. + */ + else if (type == SBBidiTypeAL) { + BidiChainSetType(chain, link, SBBidiTypeR); + } + + if (SBBidiTypeIsStrong(type)) { + /* Save the strong type as it is checked in W2. */ + w2StrongType = type; + } + + if ((type != SBBidiTypeON && BidiChainGetType(chain, priorLink) == type) || forceMerge) { + BidiChainAbandonNext(chain, priorLink); + } else { + priorLink = link; + } + } + + priorLink = roller; + w4PriorType = sos; + w5PriorType = sos; + w7StrongType = sos; + + BidiChainForEach(chain, roller, link) { + SBBidiType type = BidiChainGetType(chain, link); + SBBidiType nextType = BidiChainGetType(chain, BidiChainGetNext(chain, link)); + + /* Rule W4 */ + if (BidiChainIsSingle(chain, link) + && SBBidiTypeIsNumberSeparator(type) + && SBBidiTypeIsNumber(w4PriorType) + && (w4PriorType == nextType) + && (w4PriorType == SBBidiTypeEN || type == SBBidiTypeCS)) + { + /* Change the current type as well because it can be EN on which W5 depends. */ + type = w4PriorType; + BidiChainSetType(chain, link, type); + } + w4PriorType = type; + + /* Rule W5 */ + if (type == SBBidiTypeET && (w5PriorType == SBBidiTypeEN || nextType == SBBidiTypeEN)) { + /* Change the current type as well because it is EN on which W7 depends. */ + type = SBBidiTypeEN; + BidiChainSetType(chain, link, type); + } + w5PriorType = type; + + switch (type) { + /* Rule W6 */ + case SBBidiTypeET: + case SBBidiTypeCS: + case SBBidiTypeES: + BidiChainSetType(chain, link, SBBidiTypeON); + break; + + /* + * Rule W7 + * NOTE: W7 is expected to be applied after W6. However this is not the case here. The + * reason is that W6 can only create the type ON which is not tested in W7 by any + * means. So it won't affect the algorithm. + */ + case SBBidiTypeEN: + if (w7StrongType == SBBidiTypeL) { + BidiChainSetType(chain, link, SBBidiTypeL); + } + break; + + /* + * Save the strong type for W7. + * NOTE: The strong type is expected to be saved after applying W7 because W7 itself creates + * a strong type. However the strong type being saved here is based on the type after + * W5. This won't effect the algorithm because a single link contains all consecutive + * EN types. This means that even if W7 creates a strong type, it will be saved in + * next iteration. + */ + case SBBidiTypeL: + case SBBidiTypeR: + w7StrongType = type; + break; + } + + if (type != SBBidiTypeON && BidiChainGetType(chain, priorLink) == type) { + BidiChainAbandonNext(chain, priorLink); + } else { + priorLink = link; + } + } + + return priorLink; +} + +static void ResolveBrackets(IsolatingRunRef isolatingRun) +{ + const SBCodepointSequence *sequence = isolatingRun->codepointSequence; + SBUInteger paragraphOffset = isolatingRun->paragraphOffset; + BracketQueueRef queue = &isolatingRun->_bracketQueue; + BidiChainRef chain = isolatingRun->bidiChain; + BidiLink roller = chain->roller; + BidiLink link; + + BidiLink priorStrongLink; + SBLevel runLevel; + + priorStrongLink = BidiLinkNone; + runLevel = isolatingRun->baseLevelRun->level; + + BracketQueueReset(queue, SBLevelAsNormalBidiType(runLevel)); + + BidiChainForEach(chain, roller, link) { + SBUInteger stringIndex; + SBCodepoint codepoint; + SBBidiType type; + + SBCodepoint bracketValue; + BracketType bracketType; + + type = BidiChainGetType(chain, link); + + switch (type) { + case SBBidiTypeON: + stringIndex = BidiChainGetOffset(chain, link) + paragraphOffset; + codepoint = SBCodepointSequenceGetCodepointAt(sequence, &stringIndex); + bracketValue = LookupBracketPair(codepoint, &bracketType); + + switch (bracketType) { + case BracketTypeOpen: + if (queue->count < BracketQueueGetMaxCapacity()) { + BracketQueueEnqueue(queue, priorStrongLink, link, bracketValue); + } else { + goto Resolve; + } + break; + + case BracketTypeClose: + if (queue->count != 0) { + BracketQueueClosePair(queue, link, codepoint); + + if (BracketQueueShouldDequeue(queue)) { + ResolveAvailableBracketPairs(isolatingRun); + } + } + break; + } + break; + + case SBBidiTypeEN: + case SBBidiTypeAN: + type = SBBidiTypeR; + + case SBBidiTypeR: + case SBBidiTypeL: + if (queue->count != 0) { + BracketQueueSetStrongType(queue, type); + } + + priorStrongLink = link; + break; + } + } + +Resolve: + ResolveAvailableBracketPairs(isolatingRun); +} + +static void ResolveAvailableBracketPairs(IsolatingRunRef isolatingRun) +{ + BracketQueueRef queue = &isolatingRun->_bracketQueue; + BidiChainRef chain = isolatingRun->bidiChain; + + SBLevel runLevel; + SBBidiType embeddingDirection; + SBBidiType oppositeDirection; + + runLevel = isolatingRun->baseLevelRun->level; + embeddingDirection = SBLevelAsNormalBidiType(runLevel); + oppositeDirection = SBLevelAsOppositeBidiType(runLevel); + + while (queue->count != 0) { + BidiLink openingLink = BracketQueueGetOpeningLink(queue); + BidiLink closingLink = BracketQueueGetClosingLink(queue); + + if ((openingLink != BidiLinkNone) && (closingLink != BidiLinkNone)) { + SBBidiType innerStrongType; + SBBidiType pairType; + + innerStrongType = BracketQueueGetStrongType(queue); + + /* Rule: N0.b */ + if (innerStrongType == embeddingDirection) { + pairType = innerStrongType; + } + /* Rule: N0.c */ + else if (innerStrongType == oppositeDirection) { + BidiLink priorStrongLink; + SBBidiType priorStrongType; + + priorStrongLink = BracketQueueGetPriorStrongLink(queue); + + if (priorStrongLink != BidiLinkNone) { + BidiLink link; + + priorStrongType = BidiChainGetType(chain, priorStrongLink); + if (SBBidiTypeIsNumber(priorStrongType)) { + priorStrongType = SBBidiTypeR; + } + + link = BidiChainGetNext(chain, priorStrongLink); + + while (link != openingLink) { + SBBidiType type = BidiChainGetType(chain, link); + if (type == SBBidiTypeL || type == SBBidiTypeR) { + priorStrongType = type; + } + + link = BidiChainGetNext(chain, link); + } + } else { + priorStrongType = isolatingRun->_sos; + } + + /* Rule: N0.c.1 */ + if (priorStrongType == oppositeDirection) { + pairType = oppositeDirection; + } + /* Rule: N0.c.2 */ + else { + pairType = embeddingDirection; + } + } + /* Rule: N0.d */ + else { + pairType = SBBidiTypeNil; + } + + if (pairType != SBBidiTypeNil) { + /* Do the substitution */ + BidiChainSetType(chain, openingLink, pairType); + BidiChainSetType(chain, closingLink, pairType); + } + } + + BracketQueueDequeue(queue); + } +} + +static void ResolveNeutrals(IsolatingRunRef isolatingRun) +{ + BidiChainRef chain = isolatingRun->bidiChain; + BidiLink roller = chain->roller; + BidiLink link; + + SBLevel runLevel; + SBBidiType strongType; + BidiLink neutralLink; + + runLevel = isolatingRun->baseLevelRun->level; + strongType = isolatingRun->_sos; + neutralLink = BidiLinkNone; + + BidiChainForEach(chain, roller, link) { + SBBidiType type = BidiChainGetType(chain, link); + SBBidiType nextType; + + SBAssert(SBBidiTypeIsStrongOrNumber(type) || SBBidiTypeIsNeutralOrIsolate(type)); + + switch (type) { + case SBBidiTypeL: + strongType = SBBidiTypeL; + break; + + case SBBidiTypeR: + case SBBidiTypeEN: + case SBBidiTypeAN: + strongType = SBBidiTypeR; + break; + + case SBBidiTypeB: + case SBBidiTypeS: + case SBBidiTypeWS: + case SBBidiTypeON: + case SBBidiTypeLRI: + case SBBidiTypeRLI: + case SBBidiTypeFSI: + case SBBidiTypePDI: + if (neutralLink == BidiLinkNone) { + neutralLink = link; + } + + nextType = BidiChainGetType(chain, BidiChainGetNext(chain, link)); + if (SBBidiTypeIsNumber(nextType)) { + nextType = SBBidiTypeR; + } else if (nextType == SBBidiTypeNil) { + nextType = isolatingRun->_eos; + } + + if (SBBidiTypeIsStrong(nextType)) { + /* Rules N1, N2 */ + SBBidiType resolvedType = (strongType == nextType + ? strongType + : SBLevelAsNormalBidiType(runLevel)); + + do { + BidiChainSetType(chain, neutralLink, resolvedType); + neutralLink = BidiChainGetNext(chain, neutralLink); + } while (neutralLink != BidiChainGetNext(chain, link)); + + neutralLink = BidiLinkNone; + } + break; + } + } +} + +static void ResolveImplicitLevels(IsolatingRunRef isolatingRun) +{ + BidiChainRef chain = isolatingRun->bidiChain; + BidiLink roller = chain->roller; + BidiLink link; + + SBLevel runLevel = isolatingRun->baseLevelRun->level; + + if ((runLevel & 1) == 0) { + BidiChainForEach(chain, roller, link) { + SBBidiType type = BidiChainGetType(chain, link); + SBLevel level = BidiChainGetLevel(chain, link); + + SBAssert(SBBidiTypeIsStrongOrNumber(type)); + + /* Rule I1 */ + if (type == SBBidiTypeR) { + BidiChainSetLevel(chain, link, level + 1); + } else if (type != SBBidiTypeL) { + BidiChainSetLevel(chain, link, level + 2); + } + } + } else { + BidiChainForEach(chain, roller, link) { + SBBidiType type = BidiChainGetType(chain, link); + SBLevel level = BidiChainGetLevel(chain, link); + + SBAssert(SBBidiTypeIsStrongOrNumber(type)); + + /* Rule I2 */ + if (type != SBBidiTypeR) { + BidiChainSetLevel(chain, link, level + 1); + } + } + } +} + +SB_INTERNAL void IsolatingRunInitialize(IsolatingRunRef isolatingRun) +{ + BracketQueueInitialize(&isolatingRun->_bracketQueue); +} + +SB_INTERNAL void IsolatingRunResolve(IsolatingRunRef isolatingRun) +{ + BidiLink lastLink; + BidiLink subsequentLink; + + SB_LOG_BLOCK_OPENER("Identified Isolating Run"); + + /* Attach level run links to form isolating run. */ + AttachLevelRunLinks(isolatingRun); + /* Save last subsequent link. */ + subsequentLink = isolatingRun->_lastLevelRun->subsequentLink; + + SB_LOG_STATEMENT("Range", 1, SB_LOG_RUN_RANGE(isolatingRun)); + SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun)); + SB_LOG_STATEMENT("Level", 1, SB_LOG_LEVEL(isolatingRun->baseLevelRun->level)); + SB_LOG_STATEMENT("SOS", 1, SB_LOG_BIDI_TYPE(isolatingRun->_sos)); + SB_LOG_STATEMENT("EOS", 1, SB_LOG_BIDI_TYPE(isolatingRun->_eos)); + + /* Rules W1-W7 */ + lastLink = ResolveWeakTypes(isolatingRun); + SB_LOG_BLOCK_OPENER("Resolved Weak Types"); + SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun)); + SB_LOG_BLOCK_CLOSER(); + + /* Rule N0 */ + ResolveBrackets(isolatingRun); + SB_LOG_BLOCK_OPENER("Resolved Brackets"); + SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun)); + SB_LOG_BLOCK_CLOSER(); + + /* Rules N1, N2 */ + ResolveNeutrals(isolatingRun); + SB_LOG_BLOCK_OPENER("Resolved Neutrals"); + SB_LOG_STATEMENT("Types", 1, SB_LOG_RUN_TYPES(isolatingRun)); + SB_LOG_BLOCK_CLOSER(); + + /* Rules I1, I2 */ + ResolveImplicitLevels(isolatingRun); + SB_LOG_BLOCK_OPENER("Resolved Implicit Levels"); + SB_LOG_STATEMENT("Levels", 1, SB_LOG_RUN_LEVELS(isolatingRun)); + SB_LOG_BLOCK_CLOSER(); + + /* Re-attach original links. */ + AttachOriginalLinks(isolatingRun); + /* Attach new final link (of isolating run) with last subsequent link. */ + BidiChainSetNext(isolatingRun->bidiChain, lastLink, subsequentLink); + + SB_LOG_BLOCK_CLOSER(); +} + +SB_INTERNAL void IsolatingRunFinalize(IsolatingRunRef isolatingRun) +{ + BracketQueueFinalize(&isolatingRun->_bracketQueue); +} diff --git a/lib/sheenbidi/Source/IsolatingRun.h b/lib/sheenbidi/Source/IsolatingRun.h new file mode 100644 index 000000000..3119a56da --- /dev/null +++ b/lib/sheenbidi/Source/IsolatingRun.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_ISOLATING_RUN_H +#define _SB_INTERNAL_ISOLATING_RUN_H + +#include <SBConfig.h> + +#include "BidiChain.h" +#include "BracketQueue.h" +#include "LevelRun.h" +#include "SBBase.h" +#include "SBCodepointSequence.h" + +typedef struct _IsolatingRun { + const SBCodepointSequence *codepointSequence; + const SBBidiType *bidiTypes; + BidiChainRef bidiChain; + LevelRunRef baseLevelRun; + LevelRunRef _lastLevelRun; + BracketQueue _bracketQueue; + SBUInteger paragraphOffset; + BidiLink _originalLink; + SBBidiType _sos; + SBBidiType _eos; + SBLevel paragraphLevel; +} IsolatingRun, *IsolatingRunRef; + +SB_INTERNAL void IsolatingRunInitialize(IsolatingRunRef isolatingRun); +SB_INTERNAL void IsolatingRunResolve(IsolatingRunRef isolatingRun); + +SB_INTERNAL void IsolatingRunFinalize(IsolatingRunRef isolatingRun); + +#endif diff --git a/lib/sheenbidi/Source/LevelRun.c b/lib/sheenbidi/Source/LevelRun.c new file mode 100644 index 000000000..267a3acc1 --- /dev/null +++ b/lib/sheenbidi/Source/LevelRun.c @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> + +#include "BidiChain.h" +#include "RunExtrema.h" +#include "RunKind.h" +#include "SBAssert.h" +#include "LevelRun.h" + +SB_INTERNAL void LevelRunInitialize(LevelRunRef levelRun, + BidiChainRef bidiChain, BidiLink firstLink, BidiLink lastLink, + SBBidiType sor, SBBidiType eor) +{ + SBBidiType firstType = BidiChainGetType(bidiChain, firstLink); + SBBidiType lastType = BidiChainGetType(bidiChain, lastLink); + + levelRun->next = NULL; + levelRun->firstLink = firstLink; + levelRun->lastLink = lastLink; + levelRun->subsequentLink = BidiChainGetNext(bidiChain, lastLink); + levelRun->extrema = RunExtremaMake(sor, eor); + levelRun->kind = RunKindMake + ( + SBBidiTypeIsIsolateInitiator(lastType), + SBBidiTypeIsIsolateTerminator(firstType) + ); + levelRun->level = BidiChainGetLevel(bidiChain, firstLink); +} + +SB_INTERNAL void LevelRunAttach(LevelRunRef levelRun, LevelRunRef next) +{ + /* Only the runs of same level can be attached. */ + SBAssert(levelRun->level == next->level); + /* No other run can be attached with a simple run. */ + SBAssert(!RunKindIsSimple(levelRun->kind)); + /* No other run can be attached with a complete isolating run. */ + SBAssert(!RunKindIsCompleteIsolate(levelRun->kind)); + /* Only a terminating run can be attached with an isolating run. */ + SBAssert(RunKindIsIsolate(levelRun->kind) && RunKindIsTerminating(next->kind)); + /* The next run must be unattached. */ + SBAssert(!RunKindIsAttachedTerminating(next->kind)); + + if (RunKindIsTerminating(next->kind)) { + RunKindMakeAttached(next->kind); + } + + if (RunKindIsIsolate(levelRun->kind)) { + RunKindMakeComplete(levelRun->kind); + } + + levelRun->next = next; +} diff --git a/lib/sheenbidi/Source/LevelRun.h b/lib/sheenbidi/Source/LevelRun.h new file mode 100644 index 000000000..e7e392dee --- /dev/null +++ b/lib/sheenbidi/Source/LevelRun.h @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_LEVEL_RUN_H +#define _SB_INTERNAL_LEVEL_RUN_H + +#include <SBConfig.h> + +#include "BidiChain.h" +#include "RunExtrema.h" +#include "RunKind.h" +#include "SBBase.h" + +typedef struct _LevelRun { + struct _LevelRun *next; /**< Reference to the next sequence of run links. */ + BidiLink firstLink; /**< First link of the run. */ + BidiLink lastLink; /**< Last link of the run. */ + BidiLink subsequentLink; /**< Subsequent link of the run. */ + RunExtrema extrema; + RunKind kind; + SBLevel level; +} LevelRun, *LevelRunRef; + +SB_INTERNAL void LevelRunInitialize(LevelRunRef levelRun, + BidiChainRef bidiChain, BidiLink firstLink, BidiLink lastLink, + SBBidiType sor, SBBidiType eor); +SB_INTERNAL void LevelRunAttach(LevelRunRef levelRun, LevelRunRef next); + +#endif diff --git a/lib/sheenbidi/Source/PairingLookup.c b/lib/sheenbidi/Source/PairingLookup.c new file mode 100644 index 000000000..a177e3997 --- /dev/null +++ b/lib/sheenbidi/Source/PairingLookup.c @@ -0,0 +1,256 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + * + * REQUIRED MEMORY: (37)+2326+(579*2) = 3558 Bytes + */ + +#include "PairingLookup.h" + +static const SBInt16 PairDifferences[37] = { + 0, 1, -1, 2, -2, 16, -16, 3, -3, 2016, 2527, 1923, 1914, 1918, + 2250, 138, 7, -7, 1824, 2104, 2108, 2106, 1316, -138, 8, -8, -1316, + -1914, -1918, -1923, -1824, -2016, -2104, -2106, -2108, -2250, -2527 +}; + +static const SBUInt8 PairData[2326] = { +/* DATA_BLOCK: -- 0x0000..0x0070 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 132, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x0071..0x00E1 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 132, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x00E2..0x0152 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x0153..0x01C3 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, + 130, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x01C4..0x0234 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x0235..0x02A5 -- */ + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x02A6..0x0316 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 8, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 15, 0, 16, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, +/* DATA_BLOCK: -- 0x0317..0x0387 -- */ + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 1, 2, 1, 2, 0, + 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 19, + 0, 20, 21, 0, 21, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, + 23, 0, 0, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, +/* DATA_BLOCK: -- 0x0388..0x03F8 -- */ + 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, 2, + 24, 24, 24, 0, 16, 16, 0, 0, 25, 25, 25, 17, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 65, 130, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x03F9..0x0469 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, 65, 130, 65, 130, 65, + 130, 65, 130, 65, 130, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x046A..0x04DA -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 65, 130, 0, 1, 2, 0, 3, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 26, 1, 2, 0, + 0, 0, 1, 2, 1, 2, 65, 130, 65, 130, 65, 130, 65, 130, 65, 130, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x04DB..0x054B -- */ + 0, 0, 0, 0, 0, 65, 130, 65, 130, 65, 130, 65, 130, 65, 130, 71, 129, 66, 136, + 65, 130, 65, 130, 65, 130, 65, 130, 0, 0, 27, 0, 0, 0, 0, 28, 0, 0, 29, + 1, 2, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 1, 2, 0, 1, 2, 0, 0, 65, 130, 65, 130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x054C..0x05BC -- */ + 0, 0, 0, 0, 0, 0, 31, 0, 0, 1, 2, 0, 0, 65, 130, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, + 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x05BD..0x062D -- */ + 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, + 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 1, 2, 1, 2, 1, 2, + 1, 2, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, + 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, +/* DATA_BLOCK: -- 0x062E..0x069E -- */ + 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 33, + 34, 33, 0, 0, 0, 0, 0, 0, 1, 2, 35, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x069F..0x070F -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x0710..0x0780 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 0, 0, 0, 1, 2, 0, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 1, + 2, 65, 130, 65, 130, 65, 130, 65, 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x0781..0x07F1 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, 65, + 130, 65, 130, 65, 130, 65, 130, 0, 0, 65, 130, 65, 130, 65, 130, 65, 130, 0, +/* DATA_BLOCK: -- 0x07F2..0x0862 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 130, 65, 130, 65, 130, 0, 0, 0, 0, 0, 1, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* DATA_BLOCK: -- 0x0863..0x08D3 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 130, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, +/* DATA_BLOCK: -- 0x08D4..0x0915 -- */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 67, 0, 132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 67, 0, 132, 0, 65, 130, 0, 65, 130, +}; + +static const SBUInt16 PairIndexes[579] = { + 0x0000, 0x0071, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x0153, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x01C4, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x0235, 0x00E2, 0x00E2, 0x00E2, 0x02A6, 0x0317, 0x0388, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x03F9, 0x046A, 0x00E2, 0x00E2, 0x00E2, 0x04DB, 0x054C, + 0x05BD, 0x062E, 0x00E2, 0x069F, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x0710, 0x00E2, 0x00E2, 0x00E2, + 0x0781, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, 0x00E2, + 0x07F2, 0x0863, 0x08D4 +}; + +SB_INTERNAL SBCodepoint LookupMirror(SBCodepoint codepoint) +{ + if (codepoint <= 0xFF63) { + SBInt16 diff = PairDifferences[ + PairData[ + PairIndexes[ + codepoint / 0x071 + ] + (codepoint % 0x071) + ] & BracketTypeInverseMask + ]; + + if (diff != 0) { + return (codepoint + diff); + } + } + + return 0; +} + +SB_INTERNAL SBCodepoint LookupBracketPair(SBCodepoint codepoint, BracketType *type) +{ + if (codepoint <= 0xFF63) { + SBUInt8 data = PairData[ + PairIndexes[ + codepoint / 0x071 + ] + (codepoint % 0x071) + ]; + *type = (data & BracketTypePrimaryMask); + + if (*type != 0) { + SBInt16 diff = PairDifferences[ + data & BracketTypeInverseMask + ]; + return (codepoint + diff); + } + } else { + *type = BracketTypeNone; + } + + return 0; +} diff --git a/lib/sheenbidi/Source/PairingLookup.h b/lib/sheenbidi/Source/PairingLookup.h new file mode 100644 index 000000000..28a0e9feb --- /dev/null +++ b/lib/sheenbidi/Source/PairingLookup.h @@ -0,0 +1,17 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + */ + +#ifndef _SB_INTERNAL_PAIRING_LOOKUP_H +#define _SB_INTERNAL_PAIRING_LOOKUP_H + +#include <SBConfig.h> + +#include "BracketType.h" +#include "SBBase.h" + +SB_INTERNAL SBCodepoint LookupMirror(SBCodepoint codepoint); +SB_INTERNAL SBCodepoint LookupBracketPair(SBCodepoint codepoint, BracketType *bracketType); + +#endif diff --git a/lib/sheenbidi/Source/RunExtrema.h b/lib/sheenbidi/Source/RunExtrema.h new file mode 100644 index 000000000..3ce68d340 --- /dev/null +++ b/lib/sheenbidi/Source/RunExtrema.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_RUN_EXTREMA_H +#define _SB_INTERNAL_RUN_EXTREMA_H + +#include "SBBase.h" + +enum { + RunExtremaLeadingL = SBBidiTypeL << 0, + RunExtremaLeadingR = SBBidiTypeR << 0, + + RunExtremaTrailingL = SBBidiTypeL << 4, + RunExtremaTrailingR = SBBidiTypeR << 4 +}; +typedef SBUInt8 RunExtrema; + +#define RunExtremaMake(sor, eor) \ +(RunExtrema) \ +( \ + ((sor) << 0) \ + | ((eor) << 4) \ +) + +#define RunExtrema_SOR(e) \ +(RunExtrema) \ +( \ + (e) & 0xF \ +) + +#define RunExtrema_EOR(e) \ +(RunExtrema) \ +( \ + (e) >> 4 \ +) + +#endif diff --git a/lib/sheenbidi/Source/RunKind.h b/lib/sheenbidi/Source/RunKind.h new file mode 100644 index 000000000..ebda9fa55 --- /dev/null +++ b/lib/sheenbidi/Source/RunKind.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_RUN_KIND_H +#define _SB_INTERNAL_RUN_KIND_H + +#include "SBBase.h" + +enum { + RunKindSimple = 0x00, + + RunKindIsolate = 0x01, + RunKindPartial = 0x02, + RunKindPartialIsolate = RunKindIsolate | RunKindPartial, + + RunKindTerminating = 0x04, + RunKindAttached = 0x08 +}; +typedef SBUInt8 RunKind; + +#define RunKindMake(i, t) \ +( \ + ((i) ? RunKindPartialIsolate : 0) \ + | ((t) ? RunKindTerminating : 0) \ +) + +#define RunKindMakeComplete(k) \ +( \ + (k) &= ~RunKindPartial \ +) + +#define RunKindMakeAttached(k) \ +( \ + (k) |= RunKindAttached \ +) + +#define RunKindIsSimple(k) \ +( \ + (k) == RunKindSimple \ +) + +#define RunKindIsIsolate(k) \ +( \ + (k) & RunKindIsolate \ +) + +#define RunKindIsTerminating(k) \ +( \ + (k) & RunKindTerminating \ +) + +#define RunKindIsPartialIsolate(k) \ +( \ + (k) & RunKindPartial \ +) + +#define RunKindIsCompleteIsolate(k) \ +( \ + ((k) & RunKindPartialIsolate) \ + == RunKindIsolate \ +) + +#define RunKindIsAttachedTerminating(k) \ +( \ + (k) & RunKindAttached \ +) + +#endif diff --git a/lib/sheenbidi/Source/RunQueue.c b/lib/sheenbidi/Source/RunQueue.c new file mode 100644 index 000000000..e3b5cb950 --- /dev/null +++ b/lib/sheenbidi/Source/RunQueue.c @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> +#include <stdlib.h> + +#include "LevelRun.h" +#include "SBAssert.h" +#include "SBBase.h" +#include "RunQueue.h" + +static void FindPreviousPartialRun(RunQueueRef queue) +{ + RunQueueListRef list = queue->_partialList; + SBInteger top = queue->_partialTop; + + do { + SBInteger limit = (list == queue->_frontList ? queue->_frontTop : 0); + + do { + LevelRunRef levelRun = &list->elements[top]; + if (RunKindIsPartialIsolate(levelRun->kind)) { + queue->_partialList = list; + queue->_partialTop = top; + return; + } + } while (top-- > limit); + + list = list->previous; + top = RunQueueList_MaxIndex; + } while (list); + + queue->_partialList = NULL; + queue->_partialTop = -1; + queue->shouldDequeue = SBFalse; +} + +SB_INTERNAL void RunQueueInitialize(RunQueueRef queue) +{ + /* Initialize first list. */ + queue->_firstList.previous = NULL; + queue->_firstList.next = NULL; + + /* Initialize front and rear lists with first list. */ + queue->_frontList = &queue->_firstList; + queue->_rearList = &queue->_firstList; + queue->_partialList = NULL; + + /* Initialize list indexes. */ + queue->_frontTop = 0; + queue->_rearTop = -1; + queue->_partialTop = -1; + + /* Initialize rest of the elements. */ + queue->count = 0; + queue->peek = &queue->_frontList->elements[queue->_frontTop]; + queue->shouldDequeue = SBFalse; +} + +SB_INTERNAL void RunQueueEnqueue(RunQueueRef queue, const LevelRunRef levelRun) +{ + LevelRunRef element; + + if (queue->_rearTop != RunQueueList_MaxIndex) { + element = &queue->_rearList->elements[++queue->_rearTop]; + } else { + RunQueueListRef previousList = queue->_rearList; + RunQueueListRef rearList = previousList->next; + + if (!rearList) { + rearList = malloc(sizeof(RunQueueList)); + rearList->previous = previousList; + rearList->next = NULL; + + previousList->next = rearList; + } + + queue->_rearList = rearList; + queue->_rearTop = 0; + + element = &rearList->elements[0]; + } + queue->count += 1; + + /* Copy the level run into current element. */ + *element = *levelRun; + + /* Complete the latest isolating run with this terminating run */ + if (queue->_partialTop != -1 && RunKindIsTerminating(element->kind)) { + LevelRunRef incompleteRun = &queue->_partialList->elements[queue->_partialTop]; + LevelRunAttach(incompleteRun, element); + FindPreviousPartialRun(queue); + } + + /* Save the location of the isolating run */ + if (RunKindIsIsolate(element->kind)) { + queue->_partialList = queue->_rearList; + queue->_partialTop = queue->_rearTop; + } +} + +SB_INTERNAL void RunQueueDequeue(RunQueueRef queue) +{ + /* The queue should not be empty. */ + SBAssert(queue->count != 0); + + if (queue->_frontTop != RunQueueList_MaxIndex) { + queue->_frontTop += 1; + } else { + RunQueueListRef frontList = queue->_frontList; + + if (frontList == queue->_rearList) { + queue->_rearTop = -1; + } else { + queue->_frontList = frontList->next; + } + + queue->_frontTop = 0; + } + + queue->count -= 1; + queue->peek = &queue->_frontList->elements[queue->_frontTop]; +} + +SB_INTERNAL void RunQueueFinalize(RunQueueRef queue) +{ + RunQueueListRef list = queue->_firstList.next; + + while (list) { + RunQueueListRef next = list->next; + free(list); + list = next; + }; +} diff --git a/lib/sheenbidi/Source/RunQueue.h b/lib/sheenbidi/Source/RunQueue.h new file mode 100644 index 000000000..3fba5cabb --- /dev/null +++ b/lib/sheenbidi/Source/RunQueue.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_RUN_QUEUE_H +#define _SB_INTERNAL_RUN_QUEUE_H + +#include <SBConfig.h> + +#include "LevelRun.h" +#include "SBBase.h" + +#define RunQueueList_Length 8 +#define RunQueueList_MaxIndex (RunQueueList_Length - 1) + +typedef struct _RunQueueList { + LevelRun elements[RunQueueList_Length]; + + struct _RunQueueList *previous; /**< Reference to the previous list of queue elements */ + struct _RunQueueList *next; /**< Reference to the next list of queue elements */ +} RunQueueList, *RunQueueListRef; + +typedef struct _RunQueue { + RunQueueList _firstList; /**< First list of elements, which is part of the queue */ + RunQueueListRef _frontList; /**< The list containing front element of the queue */ + RunQueueListRef _rearList; /**< The list containing rear element of the queue */ + RunQueueListRef _partialList; /**< The list containing latest partial isolating run */ + SBInteger _frontTop; /**< Index of front element in front list */ + SBInteger _rearTop; /**< Index of rear element in rear list */ + SBInteger _partialTop; /**< Index of partial run in partial list */ + LevelRunRef peek; /**< Peek element of the queue */ + SBUInteger count; /**< Number of elements the queue contains */ + SBBoolean shouldDequeue; +} RunQueue, *RunQueueRef; + +SB_INTERNAL void RunQueueInitialize(RunQueueRef queue); + +SB_INTERNAL void RunQueueEnqueue(RunQueueRef queue, const LevelRunRef levelRun); +SB_INTERNAL void RunQueueDequeue(RunQueueRef queue); + +SB_INTERNAL void RunQueueFinalize(RunQueueRef queue); + +#endif diff --git a/lib/sheenbidi/Source/SBAlgorithm.c b/lib/sheenbidi/Source/SBAlgorithm.c new file mode 100644 index 000000000..d784b617c --- /dev/null +++ b/lib/sheenbidi/Source/SBAlgorithm.c @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2016-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> +#include <stdlib.h> + +#include "BidiTypeLookup.h" +#include "SBBase.h" +#include "SBCodepointSequence.h" +#include "SBLog.h" +#include "SBParagraph.h" +#include "SBAlgorithm.h" + +static SBAlgorithmRef AlgorithmAllocate(SBUInteger stringLength) +{ + const SBUInteger sizeAlgorithm = sizeof(SBAlgorithm); + const SBUInteger sizeTypes = sizeof(SBBidiType) * stringLength; + + const SBUInteger sizeMemory = sizeAlgorithm + + sizeTypes; + + SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory); + + SBUInteger offset = 0; + SBAlgorithmRef algorithm = (SBAlgorithmRef)(memory + offset); + + offset += sizeAlgorithm; + algorithm->fixedTypes = (SBBidiType *)(memory + offset); + + return algorithm; +} + +static void DetermineBidiTypes(const SBCodepointSequence *sequence, SBBidiType *types) +{ + SBUInteger stringIndex = 0; + SBUInteger firstIndex = 0; + SBCodepoint codepoint; + + while ((codepoint = SBCodepointSequenceGetCodepointAt(sequence, &stringIndex)) != SBCodepointInvalid) { + types[firstIndex] = LookupBidiType(codepoint); + + /* Subsequent code units get 'BN' type. */ + while (++firstIndex < stringIndex) { + types[firstIndex] = SBBidiTypeBN; + } + } +} + +SBAlgorithmRef SBAlgorithmCreate(const SBCodepointSequence *codepointSequence) +{ + if (SBCodepointSequenceIsValid(codepointSequence)) { + SBUInteger stringLength = codepointSequence->stringLength; + SBAlgorithmRef algorithm; + + SB_LOG_BLOCK_OPENER("Algorithm Input"); + SB_LOG_STATEMENT("Codepoints", 1, SB_LOG_CODEPOINT_SEQUENCE(codepointSequence)); + SB_LOG_BLOCK_CLOSER(); + + algorithm = AlgorithmAllocate(stringLength); + algorithm->codepointSequence = *codepointSequence; + algorithm->retainCount = 1; + + DetermineBidiTypes(codepointSequence, algorithm->fixedTypes); + + SB_LOG_BLOCK_OPENER("Determined Types"); + SB_LOG_STATEMENT("Types", 1, SB_LOG_BIDI_TYPES_ARRAY(algorithm->fixedTypes, stringLength)); + SB_LOG_BLOCK_CLOSER(); + + SB_LOG_BREAKER(); + + return algorithm; + } + + return NULL; +} + +const SBBidiType *SBAlgorithmGetBidiTypesPtr(SBAlgorithmRef algorithm) +{ + return algorithm->fixedTypes; +} + +SB_INTERNAL SBUInteger SBAlgorithmGetSeparatorLength(SBAlgorithmRef algorithm, SBUInteger separatorIndex) +{ + const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence; + SBUInteger stringIndex = separatorIndex; + SBCodepoint codepoint; + SBUInteger separatorLength; + + codepoint = SBCodepointSequenceGetCodepointAt(codepointSequence, &stringIndex); + separatorLength = stringIndex - separatorIndex; + + if (codepoint == '\r') { + /* Don't break in between 'CR' and 'LF'. */ + if (stringIndex < codepointSequence->stringLength) { + codepoint = SBCodepointSequenceGetCodepointAt(codepointSequence, &stringIndex); + + if (codepoint == '\n') { + separatorLength = stringIndex - separatorIndex; + } + } + } + + return separatorLength; +} + +void SBAlgorithmGetParagraphBoundary(SBAlgorithmRef algorithm, + SBUInteger paragraphOffset, SBUInteger suggestedLength, + SBUInteger *acutalLength, SBUInteger *separatorLength) +{ + const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence; + SBBidiType *bidiTypes = algorithm->fixedTypes; + SBUInteger limitIndex; + SBUInteger startIndex; + + SBUIntegerNormalizeRange(codepointSequence->stringLength, ¶graphOffset, &suggestedLength); + limitIndex = paragraphOffset + suggestedLength; + + for (startIndex = paragraphOffset; startIndex < limitIndex; startIndex++) { + SBBidiType currentType = bidiTypes[startIndex]; + + if (currentType == SBBidiTypeB) { + if (separatorLength) { + *separatorLength = SBAlgorithmGetSeparatorLength(algorithm, startIndex); + } + break; + } + } + + if (acutalLength) { + *acutalLength = startIndex - paragraphOffset; + } +} + +SBParagraphRef SBAlgorithmCreateParagraph(SBAlgorithmRef algorithm, + SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel) +{ + const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence; + SBUInteger stringLength = codepointSequence->stringLength; + + SBUIntegerNormalizeRange(stringLength, ¶graphOffset, &suggestedLength); + + if (suggestedLength > 0) { + return SBParagraphCreate(algorithm, paragraphOffset, suggestedLength, baseLevel); + } + + return NULL; +} + +SBAlgorithmRef SBAlgorithmRetain(SBAlgorithmRef algorithm) +{ + if (algorithm) { + algorithm->retainCount += 1; + } + + return algorithm; +} + +void SBAlgorithmRelease(SBAlgorithmRef algorithm) +{ + if (algorithm && --algorithm->retainCount == 0) { + free(algorithm); + } +} diff --git a/lib/sheenbidi/Source/SBAlgorithm.h b/lib/sheenbidi/Source/SBAlgorithm.h new file mode 100644 index 000000000..6d417a319 --- /dev/null +++ b/lib/sheenbidi/Source/SBAlgorithm.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2016-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_ALGORITHM_H +#define _SB_INTERNAL_ALGORITHM_H + +#include <SBAlgorithm.h> +#include <SBBase.h> +#include <SBBidiType.h> +#include <SBCodepointSequence.h> +#include <SBConfig.h> + +typedef struct _SBAlgorithm { + SBCodepointSequence codepointSequence; + SBBidiType *fixedTypes; + SBUInteger retainCount; +} SBAlgorithm; + +SB_INTERNAL SBUInteger SBAlgorithmGetSeparatorLength(SBAlgorithmRef algorithm, SBUInteger separatorIndex); + +#endif diff --git a/lib/sheenbidi/Source/SBAssert.h b/lib/sheenbidi/Source/SBAssert.h new file mode 100644 index 000000000..22923c72b --- /dev/null +++ b/lib/sheenbidi/Source/SBAssert.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2014 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_ASSERT_H +#define _SB_INTERNAL_ASSERT_H + +#include <assert.h> + +#define SBAssert(exp) assert(exp) + +#endif diff --git a/lib/sheenbidi/Source/SBBase.c b/lib/sheenbidi/Source/SBBase.c new file mode 100644 index 000000000..c5323a9c9 --- /dev/null +++ b/lib/sheenbidi/Source/SBBase.c @@ -0,0 +1,420 @@ +/* + * Copyright (C) 2016-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> + +#include "BidiTypeLookup.h" +#include "GeneralCategoryLookup.h" +#include "PairingLookup.h" +#include "ScriptLookup.h" +#include "SBBase.h" + +#define TAG(a, b, c, d) \ +(SBUInt32) \ +( \ + ((SBUInt8)(a) << 24) \ + | ((SBUInt8)(b) << 16) \ + | ((SBUInt8)(c) << 8) \ + | ((SBUInt8)(d) << 0) \ +) + +SB_INTERNAL void SBUIntegerNormalizeRange(SBUInteger actualLength, + SBUInteger *rangeOffset, SBUInteger *rangeLength) +{ + /** + * Assume: + * Actual Length = 10 + * + * Case 1: + * Offset = 0, Length = 10 + * Result: + * Offset = 0, Length = 10 + * + * Case 2: + * Offset = 0, Length = 11 + * Result: + * Offset = 0, Length = 10 + * + * Case 3: + * Offset = 1, Length = -1 (MAX) + * Result: + * Offset = 1, Length = 9 + * + * Case 4: + * Offset = 10, Length = 0 + * Result: + * Offset = Invalid, Length = 0 + * + * Case 5: + * Offset = -1 (MAX), Length = 1 + * Result: + * Offset = Invalid, Length = 0 + */ + + if (*rangeOffset < actualLength) { + SBUInteger possibleLimit = *rangeOffset + *rangeLength; + + if (*rangeOffset <= possibleLimit && possibleLimit <= actualLength) { + /* The range is valid. Nothing to do here. */ + } else { + *rangeLength = actualLength - *rangeOffset; + } + } else { + *rangeOffset = SBInvalidIndex; + *rangeLength = 0; + } +} + +SB_INTERNAL SBBoolean SBUIntegerVerifyRange(SBUInteger actualLength, + SBUInteger rangeOffset, SBUInteger rangeLength) +{ + SBUInteger possibleLimit = rangeOffset + rangeLength; + + return rangeOffset < actualLength + && rangeOffset <= possibleLimit + && possibleLimit <= actualLength; +} + +SBBidiType SBCodepointGetBidiType(SBCodepoint codepoint) +{ + return LookupBidiType(codepoint); +} + +SBGeneralCategory SBCodepointGetGeneralCategory(SBCodepoint codepoint) +{ + return LookupGeneralCategory(codepoint); +} + +SBCodepoint SBCodepointGetMirror(SBCodepoint codepoint) +{ + return LookupMirror(codepoint); +} + +SBScript SBCodepointGetScript(SBCodepoint codepoint) +{ + return LookupScript(codepoint); +} + +SBUInt32 SBScriptGetOpenTypeTag(SBScript script) +{ + /* Reference: https://docs.microsoft.com/en-us/typography/opentype/spec/scripttags */ + /* Dated: 07/24/2017 */ + + switch (script) { + case SBScriptADLM: + return TAG('a', 'd', 'l', 'm'); + case SBScriptAHOM: + return TAG('a', 'h', 'o', 'm'); + case SBScriptHLUW: + return TAG('h', 'l', 'u', 'w'); + case SBScriptARAB: + return TAG('a', 'r', 'a', 'b'); + case SBScriptARMN: + return TAG('a', 'r', 'm', 'n'); + case SBScriptAVST: + return TAG('a', 'v', 's', 't'); + case SBScriptBALI: + return TAG('b', 'a', 'l', 'i'); + case SBScriptBAMU: + return TAG('b', 'a', 'm', 'u'); + case SBScriptBASS: + return TAG('b', 'a', 's', 's'); + case SBScriptBATK: + return TAG('b', 'a', 't', 'k'); + /* case SBScriptBENG: + return TAG('b', 'e', 'n', 'g'); */ + case SBScriptBENG: + return TAG('b', 'n', 'g', '2'); + case SBScriptBHKS: + return TAG('b', 'h', 'k', 's'); + case SBScriptBOPO: + return TAG('b', 'o', 'p', 'o'); + case SBScriptBRAH: + return TAG('b', 'r', 'a', 'h'); + case SBScriptBRAI: + return TAG('b', 'r', 'a', 'i'); + case SBScriptBUGI: + return TAG('b', 'u', 'g', 'i'); + case SBScriptBUHD: + return TAG('b', 'u', 'h', 'd'); + /* case SBScriptBYZM: + return TAG('b', 'y', 'z', 'm'); */ + case SBScriptCANS: + return TAG('c', 'a', 'n', 's'); + case SBScriptCARI: + return TAG('c', 'a', 'r', 'i'); + case SBScriptAGHB: + return TAG('a', 'g', 'h', 'b'); + case SBScriptCAKM: + return TAG('c', 'a', 'k', 'm'); + case SBScriptCHAM: + return TAG('c', 'h', 'a', 'm'); + case SBScriptCHER: + return TAG('c', 'h', 'e', 'r'); + case SBScriptHANI: + return TAG('h', 'a', 'n', 'i'); + case SBScriptCOPT: + return TAG('c', 'o', 'p', 't'); + case SBScriptCPRT: + return TAG('c', 'p', 'r', 't'); + case SBScriptCYRL: + return TAG('c', 'y', 'r', 'l'); + /* case SBScriptDFLT: + return TAG('D', 'F', 'L', 'T'); */ + case SBScriptDSRT: + return TAG('d', 's', 'r', 't'); + /* case SBScriptDEVA: + return TAG('d', 'e', 'v', 'a'); */ + case SBScriptDEVA: + return TAG('d', 'e', 'v', '2'); + case SBScriptDUPL: + return TAG('d', 'u', 'p', 'l'); + case SBScriptEGYP: + return TAG('e', 'g', 'y', 'p'); + case SBScriptELBA: + return TAG('e', 'l', 'b', 'a'); + case SBScriptETHI: + return TAG('e', 't', 'h', 'i'); + case SBScriptGEOR: + return TAG('g', 'e', 'o', 'r'); + case SBScriptGLAG: + return TAG('g', 'l', 'a', 'g'); + case SBScriptGOTH: + return TAG('g', 'o', 't', 'h'); + case SBScriptGRAN: + return TAG('g', 'r', 'a', 'n'); + case SBScriptGREK: + return TAG('g', 'r', 'e', 'k'); + /* case SBScriptGUJR: + return TAG('g', 'u', 'j', 'r'); */ + case SBScriptGUJR: + return TAG('g', 'j', 'r', '2'); + /* case SBScriptGURU: + return TAG('g', 'u', 'r', 'u'); */ + case SBScriptGURU: + return TAG('g', 'u', 'r', '2'); + case SBScriptHANG: + return TAG('h', 'a', 'n', 'g'); + /* case SBScriptJAMO: + return TAG('j', 'a', 'm', 'o'); */ + case SBScriptHANO: + return TAG('h', 'a', 'n', 'o'); + case SBScriptHATR: + return TAG('h', 'a', 't', 'r'); + case SBScriptHEBR: + return TAG('h', 'e', 'b', 'r'); + case SBScriptHIRA: + return TAG('k', 'a', 'n', 'a'); + case SBScriptARMI: + return TAG('a', 'r', 'm', 'i'); + case SBScriptPHLI: + return TAG('p', 'h', 'l', 'i'); + case SBScriptPRTI: + return TAG('p', 'r', 't', 'i'); + case SBScriptJAVA: + return TAG('j', 'a', 'v', 'a'); + case SBScriptKTHI: + return TAG('k', 't', 'h', 'i'); + /* case SBScriptKNDA: + return TAG('k', 'n', 'd', 'a'); */ + case SBScriptKNDA: + return TAG('k', 'n', 'd', '2'); + case SBScriptKANA: + return TAG('k', 'a', 'n', 'a'); + case SBScriptKALI: + return TAG('k', 'a', 'l', 'i'); + case SBScriptKHAR: + return TAG('k', 'h', 'a', 'r'); + case SBScriptKHMR: + return TAG('k', 'h', 'm', 'r'); + case SBScriptKHOJ: + return TAG('k', 'h', 'o', 'j'); + case SBScriptSIND: + return TAG('s', 'i', 'n', 'd'); + case SBScriptLAOO: + return TAG('l', 'a', 'o', ' '); + case SBScriptLATN: + return TAG('l', 'a', 't', 'n'); + case SBScriptLEPC: + return TAG('l', 'e', 'p', 'c'); + case SBScriptLIMB: + return TAG('l', 'i', 'm', 'b'); + case SBScriptLINA: + return TAG('l', 'i', 'n', 'a'); + case SBScriptLINB: + return TAG('l', 'i', 'n', 'b'); + case SBScriptLISU: + return TAG('l', 'i', 's', 'u'); + case SBScriptLYCI: + return TAG('l', 'y', 'c', 'i'); + case SBScriptLYDI: + return TAG('l', 'y', 'd', 'i'); + case SBScriptMAHJ: + return TAG('m', 'a', 'h', 'j'); + /* case SBScriptMLYM: + return TAG('m', 'l', 'y', 'm'); */ + case SBScriptMLYM: + return TAG('m', 'l', 'm', '2'); + case SBScriptMAND: + return TAG('m', 'a', 'n', 'd'); + case SBScriptMANI: + return TAG('m', 'a', 'n', 'i'); + case SBScriptMARC: + return TAG('m', 'a', 'r', 'c'); + /* case SBScriptMATH: + return TAG('m', 'a', 't', 'h'); */ + case SBScriptMTEI: + return TAG('m', 't', 'e', 'i'); + case SBScriptMEND: + return TAG('m', 'e', 'n', 'd'); + case SBScriptMERC: + return TAG('m', 'e', 'r', 'c'); + case SBScriptMERO: + return TAG('m', 'e', 'r', 'o'); + case SBScriptPLRD: + return TAG('p', 'l', 'r', 'd'); + case SBScriptMODI: + return TAG('m', 'o', 'd', 'i'); + case SBScriptMONG: + return TAG('m', 'o', 'n', 'g'); + case SBScriptMROO: + return TAG('m', 'r', 'o', 'o'); + case SBScriptMULT: + return TAG('m', 'u', 'l', 't'); + /* case SBScriptMUSC: + return TAG('m', 'u', 's', 'c'); */ + /* case SBScriptMYMR: + return TAG('m', 'y', 'm', 'r'); */ + case SBScriptMYMR: + return TAG('m', 'y', 'm', '2'); + case SBScriptNBAT: + return TAG('n', 'b', 'a', 't'); + case SBScriptNEWA: + return TAG('n', 'e', 'w', 'a'); + case SBScriptTALU: + return TAG('t', 'a', 'l', 'u'); + case SBScriptNKOO: + return TAG('n', 'k', 'o', ' '); + /* case SBScriptORYA: + return TAG('o', 'r', 'y', 'a'); */ + case SBScriptORYA: + return TAG('o', 'r', 'y', '2'); + case SBScriptOGAM: + return TAG('o', 'g', 'a', 'm'); + case SBScriptOLCK: + return TAG('o', 'l', 'c', 'k'); + case SBScriptITAL: + return TAG('i', 't', 'a', 'l'); + case SBScriptHUNG: + return TAG('h', 'u', 'n', 'g'); + case SBScriptNARB: + return TAG('n', 'a', 'r', 'b'); + case SBScriptPERM: + return TAG('p', 'e', 'r', 'm'); + case SBScriptXPEO: + return TAG('x', 'p', 'e', 'o'); + case SBScriptSARB: + return TAG('s', 'a', 'r', 'b'); + case SBScriptORKH: + return TAG('o', 'r', 'k', 'h'); + case SBScriptOSGE: + return TAG('o', 's', 'g', 'e'); + case SBScriptOSMA: + return TAG('o', 's', 'm', 'a'); + case SBScriptHMNG: + return TAG('h', 'm', 'n', 'g'); + case SBScriptPALM: + return TAG('p', 'a', 'l', 'm'); + case SBScriptPAUC: + return TAG('p', 'a', 'u', 'c'); + case SBScriptPHAG: + return TAG('p', 'h', 'a', 'g'); + case SBScriptPHNX: + return TAG('p', 'h', 'n', 'x'); + case SBScriptPHLP: + return TAG('p', 'h', 'l', 'p'); + case SBScriptRJNG: + return TAG('r', 'j', 'n', 'g'); + case SBScriptRUNR: + return TAG('r', 'u', 'n', 'r'); + case SBScriptSAMR: + return TAG('s', 'a', 'm', 'r'); + case SBScriptSAUR: + return TAG('s', 'a', 'u', 'r'); + case SBScriptSHRD: + return TAG('s', 'h', 'r', 'd'); + case SBScriptSHAW: + return TAG('s', 'h', 'a', 'w'); + case SBScriptSIDD: + return TAG('s', 'i', 'd', 'd'); + case SBScriptSGNW: + return TAG('s', 'g', 'n', 'w'); + case SBScriptSINH: + return TAG('s', 'i', 'n', 'h'); + case SBScriptSORA: + return TAG('s', 'o', 'r', 'a'); + case SBScriptXSUX: + return TAG('x', 's', 'u', 'x'); + case SBScriptSUND: + return TAG('s', 'u', 'n', 'd'); + case SBScriptSYLO: + return TAG('s', 'y', 'l', 'o'); + case SBScriptSYRC: + return TAG('s', 'y', 'r', 'c'); + case SBScriptTGLG: + return TAG('t', 'g', 'l', 'g'); + case SBScriptTAGB: + return TAG('t', 'a', 'g', 'b'); + case SBScriptTALE: + return TAG('t', 'a', 'l', 'e'); + case SBScriptLANA: + return TAG('l', 'a', 'n', 'a'); + case SBScriptTAVT: + return TAG('t', 'a', 'v', 't'); + case SBScriptTAKR: + return TAG('t', 'a', 'k', 'r'); + /* case SBScriptTAML: + return TAG('t', 'a', 'm', 'l'); */ + case SBScriptTAML: + return TAG('t', 'm', 'l', '2'); + case SBScriptTANG: + return TAG('t', 'a', 'n', 'g'); + /* case SBScriptTELU: + return TAG('t', 'e', 'l', 'u'); */ + case SBScriptTELU: + return TAG('t', 'e', 'l', '2'); + case SBScriptTHAA: + return TAG('t', 'h', 'a', 'a'); + case SBScriptTHAI: + return TAG('t', 'h', 'a', 'i'); + case SBScriptTIBT: + return TAG('t', 'i', 'b', 't'); + case SBScriptTFNG: + return TAG('t', 'f', 'n', 'g'); + case SBScriptTIRH: + return TAG('t', 'i', 'r', 'h'); + case SBScriptUGAR: + return TAG('u', 'g', 'a', 'r'); + case SBScriptVAII: + return TAG('v', 'a', 'i', ' '); + case SBScriptWARA: + return TAG('w', 'a', 'r', 'a'); + case SBScriptYIII: + return TAG('y', 'i', ' ', ' '); + default: + return TAG('D', 'F', 'L', 'T'); + } +} diff --git a/lib/sheenbidi/Source/SBBase.h b/lib/sheenbidi/Source/SBBase.h new file mode 100644 index 000000000..00cc977f6 --- /dev/null +++ b/lib/sheenbidi/Source/SBBase.h @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2016-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_BASE_H +#define _SB_INTERNAL_BASE_H + +#include <SBBase.h> +#include <SBBidiType.h> +#include <SBCodepoint.h> +#include <SBConfig.h> +#include <SBGeneralCategory.h> +#include <SBScript.h> + +/** + * A value that indicates an invalid unsigned index. + */ +#define SBInvalidIndex (SBUInteger)(-1) + +SB_INTERNAL void SBUIntegerNormalizeRange(SBUInteger actualLength, + SBUInteger *rangeOffset, SBUInteger *rangeLength); + +SB_INTERNAL SBBoolean SBUIntegerVerifyRange(SBUInteger actualLength, + SBUInteger rangeOffset, SBUInteger rangeLength); + + +#define SBNumberGetMax(first, second) \ +( \ + (first) > (second) \ + ? (first) \ + : (second) \ +) + +#define SBNumberLimitIncrement(number, limit) \ +( \ + (number) < (limit) \ + ? (number) + (1) \ + : (limit) \ +) + +#define SBNumberLimitDecrement(number, limit) \ +( \ + (number) > (limit) \ + ? (number) - (1) \ + : (limit) \ +) + +#define SBNumberRingAdd(number, count, capacity) \ + (((number) + (count)) % (capacity)) + +#define SBNumberRingIncrement(number, capacity) \ + SBNumberRingAdd(number, 1, capacity) + +#define SBNumberRingSubtract(number, count, capacity) \ + (((number) + (capacity) - (count)) % (capacity)) + +#define SBNumberRingDecrement(number, capacity) \ + SBNumberRingSubtract(number, 1, capacity) + + +#define SBLevelAsNormalBidiType(level) \ +( \ + ((level) & 1) \ + ? SBBidiTypeR \ + : SBBidiTypeL \ +) + +#define SBLevelAsOppositeBidiType(level) \ +( \ + ((level) & 1) \ + ? SBBidiTypeL \ + : SBBidiTypeR \ +) + + +#define SBBidiTypeIsEqual(t1, t2) ((t1) == (t2)) + +#define SBBidiTypeIsNumber(t) SBUInt8InRange(t, SBBidiTypeAN, SBBidiTypeEN) +#define SBBidiTypeIsIsolate(t) SBUInt8InRange(t, SBBidiTypeLRI, SBBidiTypePDI) + +#define SBBidiTypeIsStrongOrNumber(t) (SBBidiTypeIsStrong(t) || SBBidiTypeIsNumber(t)) +#define SBBidiTypeIsNumberSeparator(t) SBUInt8InRange(t, SBBidiTypeES, SBBidiTypeCS) +#define SBBidiTypeIsIsolateInitiator(t) SBUInt8InRange(t, SBBidiTypeLRI, SBBidiTypeFSI) +#define SBBidiTypeIsIsolateTerminator(t) SBBidiTypeIsEqual(t, SBBidiTypePDI) +#define SBBidiTypeIsNeutralOrIsolate(t) SBUInt8InRange(t, SBBidiTypeWS, SBBidiTypePDI) + + +#define SBCodepointMax 0x10FFFF +#define SBCodepointInRange(v, s, e) SBUInt32InRange(v, s, e) +#define SBCodepointIsSurrogate(c) SBCodepointInRange(c, 0xD800, 0xDFFF) +#define SBCodepointIsValid(c) (!SBCodepointIsSurrogate(c) && (c) <= SBCodepointMax) + + +#define SBScriptIsCommonOrInherited(s) ((s) <= SBScriptZYYY) + +#endif diff --git a/lib/sheenbidi/Source/SBCodepointSequence.c b/lib/sheenbidi/Source/SBCodepointSequence.c new file mode 100644 index 000000000..3828fa776 --- /dev/null +++ b/lib/sheenbidi/Source/SBCodepointSequence.c @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2016-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> + +#include <stddef.h> +#include <stdlib.h> + +#include "SBAssert.h" +#include "SBBase.h" +#include "SBCodepointSequence.h" + +typedef struct { + SBUInt8 valid; + SBUInt8 total; + SBUInt8 start; + SBUInt8 end; +} UTF8State; + +static const UTF8State UTF8StateTable[9] = { + {1,0,0x00,0x00}, {0,0,0x00,0x00}, {1,2,0x80,0xBF}, {1,3,0xA0,0xBF}, {1,3,0x80,0xBF}, + {1,3,0x80,0x9F}, {1,4,0x90,0xBF}, {1,4,0x80,0xBF}, {1,4,0x80,0x8F} +}; + +static const SBUInt8 UTF8LookupTable[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, +/* LEAD: -- 80..BF -- */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, +/* LEAD: -- C0..C1 -- */ + 1, 1, +/* LEAD: -- C2..DF -- */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* LEAD: -- E0..E0 -- */ + 3, +/* LEAD: -- E1..EC -- */ + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, +/* LEAD: -- ED..ED -- */ + 5, +/* LEAD: -- EE..EF -- */ + 4, 4, +/* LEAD: -- F0..F0 -- */ + 6, +/* LEAD: -- F1..F3 -- */ + 7, 7, 7, +/* LEAD: -- F4..F4 -- */ + 8, +/* LEAD: -- F5..F7 -- */ + 1, 1, 1, +/* LEAD: -- F8..FB -- */ + 1, 1, 1, 1, +/* LEAD: -- FC..FD -- */ + 1, 1, +/* LEAD: -- FE..FF -- */ + 1, 1 +}; + +static SBCodepoint GetUTF8CodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex); +static SBCodepoint GetUTF8CodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex); +static SBCodepoint GetUTF16CodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex); +static SBCodepoint GetUTF16CodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex); +static SBCodepoint GetUTF32CodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex); +static SBCodepoint GetUTF32CodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex); + +SB_INTERNAL SBBoolean SBCodepointSequenceIsValid(const SBCodepointSequence *codepointSequence) +{ + if (codepointSequence) { + SBBoolean encodingValid = SBFalse; + + switch (codepointSequence->stringEncoding) { + case SBStringEncodingUTF8: + case SBStringEncodingUTF16: + case SBStringEncodingUTF32: + encodingValid = SBTrue; + break; + } + + return (encodingValid && codepointSequence->stringBuffer && codepointSequence->stringLength > 0); + } + + return SBFalse; +} + +SBCodepoint SBCodepointSequenceGetCodepointBefore(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex) +{ + SBCodepoint codepoint = SBCodepointInvalid; + + if ((*stringIndex - 1) < codepointSequence->stringLength) { + switch (codepointSequence->stringEncoding) { + case SBStringEncodingUTF8: + codepoint = GetUTF8CodepointBefore(codepointSequence, stringIndex); + break; + + case SBStringEncodingUTF16: + codepoint = GetUTF16CodepointBefore(codepointSequence, stringIndex); + break; + + case SBStringEncodingUTF32: + codepoint = GetUTF32CodepointBefore(codepointSequence, stringIndex); + break; + } + } + + return codepoint; +} + +SBCodepoint SBCodepointSequenceGetCodepointAt(const SBCodepointSequence *codepointSequence, SBUInteger *stringIndex) +{ + SBCodepoint codepoint = SBCodepointInvalid; + + if (*stringIndex < codepointSequence->stringLength) { + switch (codepointSequence->stringEncoding) { + case SBStringEncodingUTF8: + codepoint = GetUTF8CodepointAt(codepointSequence, stringIndex); + break; + + case SBStringEncodingUTF16: + codepoint = GetUTF16CodepointAt(codepointSequence, stringIndex); + break; + + case SBStringEncodingUTF32: + codepoint = GetUTF32CodepointAt(codepointSequence, stringIndex); + break; + } + } + + return codepoint; +} + +static SBCodepoint GetUTF8CodepointAt(const SBCodepointSequence *sequence, SBUInteger *index) +{ + const SBUInt8 *buffer = sequence->stringBuffer; + SBUInteger length = sequence->stringLength; + SBUInt8 lead; + UTF8State state; + SBUInteger limit; + SBCodepoint codepoint; + + lead = buffer[*index]; + state = UTF8StateTable[UTF8LookupTable[lead]]; + limit = *index + state.total; + + if (limit > length) { + limit = length; + state.valid = SBFalse; + } + + codepoint = lead & (0x7F >> state.total); + + while (++(*index) < limit) { + SBUInt8 byte = buffer[*index]; + + if (byte >= state.start && byte <= state.end) { + codepoint = (codepoint << 6) | (byte & 0x3F); + } else { + state.valid = SBFalse; + break; + } + + state.start = 0x80; + state.end = 0xBF; + } + + if (state.valid) { + return codepoint; + } + + return SBCodepointFaulty; +} + +static SBCodepoint GetUTF8CodepointBefore(const SBCodepointSequence *sequence, SBUInteger *index) +{ + const SBUInt8 *buffer = sequence->stringBuffer; + SBUInteger startIndex = *index; + SBUInteger limitIndex; + SBUInteger continuation; + SBCodepoint codepoint; + + continuation = 7; + + while (--continuation && --startIndex) { + SBUInt8 codeunit = buffer[startIndex]; + + if ((codeunit & 0xC0) != 0x80) { + break; + } + } + + limitIndex = startIndex; + codepoint = GetUTF8CodepointAt(sequence, &limitIndex); + + if (limitIndex == *index) { + *index = startIndex; + } else { + codepoint = SBCodepointFaulty; + *index -= 1; + } + + return codepoint; +} + +static SBCodepoint GetUTF16CodepointAt(const SBCodepointSequence *sequence, SBUInteger *index) +{ + const SBUInt16 *buffer = sequence->stringBuffer; + SBUInteger length = sequence->stringLength; + SBCodepoint codepoint; + SBUInt16 lead; + + codepoint = SBCodepointFaulty; + + lead = buffer[*index]; + *index += 1; + + if (!SBCodepointIsSurrogate(lead)) { + codepoint = lead; + } else if (lead <= 0xDBFF) { + if (*index < length) { + SBUInt16 trail = buffer[*index]; + + if (SBUInt16InRange(trail, 0xDC00, 0xDFFF)) { + codepoint = (lead << 10) + trail - ((0xD800 << 10) + 0xDC00 - 0x10000); + *index += 1; + } + } + } + + return codepoint; +} + +static SBCodepoint GetUTF16CodepointBefore(const SBCodepointSequence *sequence, SBUInteger *index) +{ + const SBUInt16 *buffer = sequence->stringBuffer; + SBCodepoint codepoint; + SBUInt16 trail; + + codepoint = SBCodepointFaulty; + + *index -= 1; + trail = buffer[*index]; + + if (!SBCodepointIsSurrogate(trail)) { + codepoint = trail; + } else if (trail >= 0xDC00) { + if (*index > 0) { + SBUInt16 lead = buffer[*index - 1]; + + if (SBUInt16InRange(lead, 0xD800, 0xDBFF)) { + codepoint = (lead << 10) + trail - ((0xD800 << 10) + 0xDC00 - 0x10000); + *index -= 1; + } + } + } + + return codepoint; +} + +static SBCodepoint GetUTF32CodepointAt(const SBCodepointSequence *sequence, SBUInteger *index) +{ + const SBUInt32 *buffer = sequence->stringBuffer; + SBCodepoint codepoint; + + codepoint = buffer[*index]; + *index += 1; + + if (SBCodepointIsValid(codepoint)) { + return codepoint; + } + + return SBCodepointFaulty; +} + +static SBCodepoint GetUTF32CodepointBefore(const SBCodepointSequence *sequence, SBUInteger *index) +{ + const SBUInt32 *buffer = sequence->stringBuffer; + SBCodepoint codepoint; + + *index -= 1; + codepoint = buffer[*index]; + + if (SBCodepointIsValid(codepoint)) { + return codepoint; + } + + return SBCodepointFaulty; +} diff --git a/lib/sheenbidi/Source/SBCodepointSequence.h b/lib/sheenbidi/Source/SBCodepointSequence.h new file mode 100644 index 000000000..e5967c450 --- /dev/null +++ b/lib/sheenbidi/Source/SBCodepointSequence.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2016 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_CODEPOINT_SEQUENCE_H +#define _SB_INTERNAL_CODEPOINT_SEQUENCE_H + +#include <SBConfig.h> +#include <SBCodepointSequence.h> + +SB_INTERNAL SBBoolean SBCodepointSequenceIsValid(const SBCodepointSequence *codepointSequence); + +#endif diff --git a/lib/sheenbidi/Source/SBLine.c b/lib/sheenbidi/Source/SBLine.c new file mode 100644 index 000000000..8de303768 --- /dev/null +++ b/lib/sheenbidi/Source/SBLine.c @@ -0,0 +1,300 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> +#include <stdlib.h> + +#include "PairingLookup.h" +#include "SBAlgorithm.h" +#include "SBAssert.h" +#include "SBBase.h" +#include "SBCodepointSequence.h" +#include "SBParagraph.h" +#include "SBRun.h" +#include "SBLine.h" + +typedef struct _LineContext { + const SBBidiType *refTypes; + SBLevel *fixedLevels; + SBUInteger runCount; + SBLevel maxLevel; +} LineContext, *LineContextRef; + +static SBLevel CopyLevels(SBLevel *destination, + const SBLevel *source, SBUInteger length, SBUInteger *runCount) +{ + SBLevel lastLevel = SBLevelInvalid; + SBLevel maxLevel = 0; + SBUInteger totalRuns = 0; + + while (length--) { + SBLevel level = *(source++); + *(destination++) = level; + + if (level != lastLevel) { + totalRuns += 1; + + if (level > maxLevel) { + maxLevel = level; + } + } + } + + *runCount = totalRuns; + + return maxLevel; +} + +static LineContextRef CreateLineContext(const SBBidiType *types, const SBLevel *levels, SBUInteger length) +{ + const SBUInteger sizeContext = sizeof(LineContext); + const SBUInteger sizeLevels = sizeof(SBLevel) * length; + const SBUInteger sizeMemory = sizeContext + sizeLevels; + + const SBUInteger offsetContext = 0; + const SBUInteger offsetLevels = offsetContext + sizeContext; + + SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory); + LineContextRef context = (LineContextRef)(memory + offsetContext); + SBLevel *fixedLevels = (SBLevel *)(memory + offsetLevels); + + context->refTypes = types; + context->fixedLevels = fixedLevels; + context->maxLevel = CopyLevels(fixedLevels, levels, length, &context->runCount); + + return context; +} + +static void DisposeLineContext(LineContextRef context) +{ + free(context); +} + +static SBLineRef AllocateLine(SBUInteger runCount) +{ + const SBUInteger sizeLine = sizeof(SBLine); + const SBUInteger sizeRuns = sizeof(SBRun) * runCount; + const SBUInteger sizeMemory = sizeLine + sizeRuns; + + const SBUInteger offsetLine = 0; + const SBUInteger offsetRuns = offsetLine + sizeLine; + + SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory); + SBLineRef line = (SBLineRef)(memory + offsetLine); + SBRun *runs = (SBRun *)(memory + offsetRuns); + + line->fixedRuns = runs; + + return line; +} + +static void SetNewLevel(SBLevel *levels, SBUInteger length, SBLevel newLevel) +{ + SBUInteger index = length; + + while (index--) { + levels[index] = newLevel; + } +} + +static void ResetLevels(LineContextRef context, SBLevel baseLevel, SBUInteger charCount) +{ + const SBBidiType *types = context->refTypes; + SBLevel *levels = context->fixedLevels; + SBUInteger index; + SBUInteger length; + SBBoolean reset; + + index = charCount; + length = 0; + reset = SBTrue; + + while (index--) { + SBBidiType type = types[index]; + + switch (type) { + case SBBidiTypeB: + case SBBidiTypeS: + SetNewLevel(levels + index, length + 1, baseLevel); + length = 0; + reset = SBTrue; + context->runCount += 1; + break; + + case SBBidiTypeLRE: + case SBBidiTypeRLE: + case SBBidiTypeLRO: + case SBBidiTypeRLO: + case SBBidiTypePDF: + case SBBidiTypeBN: + length += 1; + break; + + case SBBidiTypeWS: + case SBBidiTypeLRI: + case SBBidiTypeRLI: + case SBBidiTypeFSI: + case SBBidiTypePDI: + if (reset) { + SetNewLevel(levels + index, length + 1, baseLevel); + length = 0; + + context->runCount += 1; + } + break; + + default: + length = 0; + reset = SBFalse; + break; + } + } +} + +static SBUInteger InitializeRuns(SBRun *runs, + const SBLevel *levels, SBUInteger length, SBUInteger lineOffset) +{ + SBUInteger index; + SBUInteger runCount = 1; + + (*runs).offset = lineOffset; + (*runs).level = levels[0]; + + for (index = 0; index < length; index++) { + SBLevel level = levels[index]; + + if (level != (*runs).level) { + (*runs).length = index + lineOffset - (*runs).offset; + + ++runs; + (*runs).offset = lineOffset + index; + (*runs).level = level; + + runCount += 1; + } + } + + (*runs).length = index + lineOffset - (*runs).offset; + + return runCount; +} + +static void ReverseRunSequence(SBRun *runs, SBUInteger runCount) +{ + SBUInteger halfCount = runCount / 2; + SBUInteger finalIndex = runCount - 1; + SBUInteger index; + + for (index = 0; index < halfCount; index++) { + SBUInteger tieIndex; + SBRun tempRun; + + tieIndex = finalIndex - index; + + tempRun = runs[index]; + runs[index] = runs[tieIndex]; + runs[tieIndex] = tempRun; + } +} + +static void ReorderRuns(SBRun *runs, SBUInteger runCount, SBLevel maxLevel) +{ + SBLevel newLevel; + + for (newLevel = maxLevel; newLevel; newLevel--) { + SBUInteger start = runCount; + + while (start--) { + if (runs[start].level >= newLevel) { + SBUInteger count = 1; + + for (; start && runs[start - 1].level >= newLevel; start--) { + count += 1; + } + + ReverseRunSequence(runs + start, count); + } + } + } +} + +SB_INTERNAL SBLineRef SBLineCreate(SBParagraphRef paragraph, + SBUInteger lineOffset, SBUInteger lineLength) +{ + SBUInteger innerOffset = lineOffset - paragraph->offset; + const SBBidiType *refTypes = paragraph->refTypes + innerOffset; + const SBLevel *refLevels = paragraph->fixedLevels + innerOffset; + LineContextRef context; + SBLineRef line; + + /* Line range MUST be valid. */ + SBAssert(lineOffset < (lineOffset + lineLength) + && lineOffset >= paragraph->offset + && (lineOffset + lineLength) <= (paragraph->offset + paragraph->length)); + + context = CreateLineContext(refTypes, refLevels, lineLength); + ResetLevels(context, paragraph->baseLevel, lineLength); + + line = AllocateLine(context->runCount); + line->runCount = InitializeRuns(line->fixedRuns, context->fixedLevels, lineLength, lineOffset); + ReorderRuns(line->fixedRuns, line->runCount, context->maxLevel); + + line->codepointSequence = paragraph->algorithm->codepointSequence; + line->offset = lineOffset; + line->length = lineLength; + line->retainCount = 1; + + DisposeLineContext(context); + + return line; +} + +SBUInteger SBLineGetOffset(SBLineRef line) +{ + return line->offset; +} + +SBUInteger SBLineGetLength(SBLineRef line) +{ + return line->length; +} + +SBUInteger SBLineGetRunCount(SBLineRef line) +{ + return line->runCount; +} + +const SBRun *SBLineGetRunsPtr(SBLineRef line) +{ + return line->fixedRuns; +} + +SBLineRef SBLineRetain(SBLineRef line) +{ + if (line) { + line->retainCount += 1; + } + + return line; +} + +void SBLineRelease(SBLineRef line) +{ + if (line && --line->retainCount == 0) { + free(line); + } +} diff --git a/lib/sheenbidi/Source/SBLine.h b/lib/sheenbidi/Source/SBLine.h new file mode 100644 index 000000000..6ecf10365 --- /dev/null +++ b/lib/sheenbidi/Source/SBLine.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_LINE_H +#define _SB_INTERNAL_LINE_H + +#include <SBBase.h> +#include <SBCodepointSequence.h> +#include <SBConfig.h> +#include <SBLine.h> +#include <SBParagraph.h> +#include <SBRun.h> + +typedef struct _SBLine { + SBCodepointSequence codepointSequence; + SBRun *fixedRuns; + SBUInteger runCount; + SBUInteger offset; + SBUInteger length; + SBUInteger retainCount; +} SBLine; + +SB_INTERNAL SBLineRef SBLineCreate(SBParagraphRef paragraph, + SBUInteger lineOffset, SBUInteger lineLength); + +#endif diff --git a/lib/sheenbidi/Source/SBLog.c b/lib/sheenbidi/Source/SBLog.c new file mode 100644 index 000000000..a77591fef --- /dev/null +++ b/lib/sheenbidi/Source/SBLog.c @@ -0,0 +1,303 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> + +#ifdef SB_CONFIG_LOG + +#include "SBBase.h" +#include "SBBidiChain.h" +#include "SBBidiType.h" +#include "SBIsolatingRun.h" +#include "SBLog.h" + +int _SBLogPosition = 0; + +SB_INTERNAL void PrintBaseLevel(SBLevel baseLevel) +{ + switch (baseLevel) { + case SBLevelDefaultLTR: + SB_LOG_STRING("Auto-LTR"); + break; + + case SBLevelDefaultRTL: + SB_LOG_STRING("Auto-RTL"); + break; + + case 0: + SB_LOG_STRING("LTR"); + break; + + case 1: + SB_LOG_STRING("RTL"); + break; + + default: + SB_LOG(("Level - %d", baseLevel)); + break; + } +} + +SB_INTERNAL void PrintBidiType(SBBidiType type) +{ + switch (type) { + case SBBidiTypeNil: + SB_LOG_STRING("Nil"); + break; + + case SBBidiTypeL: + SB_LOG_STRING("L"); + break; + + case SBBidiTypeR: + SB_LOG_STRING("R"); + break; + + case SBBidiTypeAL: + SB_LOG_STRING("AL"); + break; + + case SBBidiTypeEN: + SB_LOG_STRING("EN"); + break; + + case SBBidiTypeES: + SB_LOG_STRING("ES"); + break; + + case SBBidiTypeET: + SB_LOG_STRING("EN"); + break; + + case SBBidiTypeAN: + SB_LOG_STRING("AN"); + break; + + case SBBidiTypeCS: + SB_LOG_STRING("CS"); + break; + + case SBBidiTypeNSM: + SB_LOG_STRING("NSM"); + break; + + case SBBidiTypeBN: + SB_LOG_STRING("BN"); + break; + + case SBBidiTypeB: + SB_LOG_STRING("B"); + break; + + case SBBidiTypeS: + SB_LOG_STRING("S"); + break; + + case SBBidiTypeWS: + SB_LOG_STRING("WS"); + break; + + case SBBidiTypeON: + SB_LOG_STRING("ON"); + break; + + case SBBidiTypeLRE: + SB_LOG_STRING("LRE"); + break; + + case SBBidiTypeRLE: + SB_LOG_STRING("RLE"); + break; + + case SBBidiTypeLRO: + SB_LOG_STRING("LRO"); + break; + + case SBBidiTypeRLO: + SB_LOG_STRING("RLO"); + break; + + case SBBidiTypePDF: + SB_LOG_STRING("PDF"); + break; + + case SBBidiTypeLRI: + SB_LOG_STRING("LRI"); + break; + + case SBBidiTypeRLI: + SB_LOG_STRING("RLI"); + break; + + case SBBidiTypeFSI: + SB_LOG_STRING("FSI"); + break; + + case SBBidiTypePDI: + SB_LOG_STRING("PDI"); + break; + } +} + +SB_INTERNAL void PrintCodepointSequence(const SBCodepointSequence *codepointSequence) +{ + SBUInteger stringIndex = 0; + SBCodepoint codepoint; + + while ((codepoint = SBCodepointSequenceGetCodepointAt(codepointSequence, &stringIndex)) != SBCodepointInvalid) { + SB_LOG(("%04X ", codepoint)); + } +} + +SB_INTERNAL void PrintBidiTypesArray(SBBidiType *types, SBUInteger length) +{ + SBUInteger index; + + for (index = 0; index < length; ++index) { + SB_LOG_BIDI_TYPE(types[index]); + SB_LOG_DIVIDER(1); + } +} + +SB_INTERNAL void PrintLevelsArray(SBLevel *levels, SBUInteger length) +{ + SBUInteger index; + + for (index = 0; index < length; ++index) { + SB_LOG_LEVEL(levels[index]); + SB_LOG_DIVIDER(1); + } +} + +typedef struct { + void *object; + BidiLink link; + SBUInteger length; +} IsolatingContext; + +typedef void (*IsolatingConsumer)(IsolatingRunRef isolatingRun, IsolatingContext *context); + +SB_INTERNAL void IsolatingRunForEach(IsolatingRunRef isolatingRun, + IsolatingContext *context, IsolatingConsumer consumer) +{ + BidiChainRef bidiChain = isolatingRun->bidiChain; + LevelRunRef levelRun; + + /* Iterate over individual level runs of the isolating run. */ + for (levelRun = isolatingRun->baseLevelRun; levelRun; levelRun = levelRun->next) { + BidiLink breakLink = BidiChainGetNext(bidiChain, levelRun->lastLink); + BidiLink currentLink = levelRun->firstLink; + BidiLink subsequentLink = levelRun->subsequentLink; + + /* Iterate over each link of the level run. */ + while (currentLink != breakLink) { + BidiLink nextLink = BidiChainGetNext(bidiChain, currentLink); + SBUInteger linkOffset = BidiChainGetOffset(bidiChain, currentLink); + SBUInteger linkLength; + SBUInteger index; + + if (nextLink != breakLink) { + linkLength = BidiChainGetOffset(bidiChain, nextLink) - linkOffset; + } else { + linkLength = BidiChainGetOffset(bidiChain, subsequentLink) - linkOffset; + } + + /* Skip any sequence of BN character types. */ + for (index = 1; index < linkLength; index++) { + SBBidiType bidiType = BidiChainGetType(bidiChain, currentLink + index); + if (bidiType == SBBidiTypeBN) { + linkLength = index; + break; + } + } + + context->link = currentLink; + context->length = linkLength; + consumer(isolatingRun, context); + + currentLink = nextLink; + } + } +} + +static void PrintTypesOperation(IsolatingRunRef isolatingRun, IsolatingContext *context) +{ + SBBidiType bidiType = BidiChainGetType(isolatingRun->bidiChain, context->link); + + while (context->length--) { + SB_LOG_BIDI_TYPE(bidiType); + SB_LOG_DIVIDER(1); + } +} + +SB_INTERNAL void PrintRunTypes(IsolatingRunRef isolatingRun) +{ + IsolatingContext context; + IsolatingRunForEach(isolatingRun, &context, _SBPrintTypesOperation); +} + +static void PrintLevelsOperation(IsolatingRunRef isolatingRun, IsolatingContext *context) +{ + SBLevel charLevel = BidiChainGetLevel(isolatingRun->bidiChain, context->link); + + while (context->length--) { + SB_LOG_LEVEL(charLevel); + SB_LOG_DIVIDER(1); + } +} + +SB_INTERNAL void PrintRunLevels(IsolatingRunRef isolatingRun) +{ + IsolatingContext context; + IsolatingRunForEach(isolatingRun, &context, _SBPrintLevelsOperation); +} + +typedef struct { + SBUInteger offset; + SBUInteger length; +} IsolatingRange; + +static void PrintRangeOperation(IsolatingRunRef isolatingRun, IsolatingContext *context) +{ + IsolatingRange *range = context->object; + SBUInteger offset = BidiChainGetOffset(isolatingRun->bidiChain, context->link); + + if (range->length == 0) { + range->offset = offset; + range->length = context->length; + } else if (offset == (range->offset + range->length)) { + range->length += context->length; + } else { + SB_LOG_RANGE(range->offset, range->length); + SB_LOG_DIVIDER(1); + + range->offset = offset; + range->length = context->length; + } +} + +SB_INTERNAL void PrintRunRange(IsolatingRunRef isolatingRun) +{ + IsolatingRange range = { 0, 0 }; + IsolatingContext context; + context.object = ⦥ + + IsolatingRunForEach(isolatingRun, &context, _SBPrintRangeOperation); + SB_LOG_RANGE(range.offset, range.length); + SB_LOG_DIVIDER(1); +} + +#endif diff --git a/lib/sheenbidi/Source/SBLog.h b/lib/sheenbidi/Source/SBLog.h new file mode 100644 index 000000000..5c70508fe --- /dev/null +++ b/lib/sheenbidi/Source/SBLog.h @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_LOG_H +#define _SB_INTERNAL_LOG_H + +#include <SBConfig.h> + +#ifdef SB_CONFIG_LOG + +#include <stdio.h> + +#include "SBBase.h" +#include "SBBidiType.h" +#include "SBCodepointSequence.h" +#include "SBIsolatingRun.h" + +SB_INTERNAL void PrintBaseLevel(SBLevel baseLevel); +SB_INTERNAL void PrintBidiType(SBBidiType type); + +SB_INTERNAL void PrintCodepointSequence(const SBCodepointSequence *codepointSequence); +SB_INTERNAL void PrintBidiTypesArray(SBBidiType *types, SBUInteger length); +SB_INTERNAL void PrintLevelsArray(SBLevel *levels, SBUInteger length); + +SB_INTERNAL void PrintRunTypes(IsolatingRunRef isolatingRun); +SB_INTERNAL void PrintRunLevels(IsolatingRunRef isolatingRun); +SB_INTERNAL void PrintRunRange(IsolatingRunRef isolatingRun); + +extern int _SBLogPosition; + +#define SB_LOG_BEGIN() (++_SBLogPosition) +#define SB_LOG_END() (--_SBLogPosition) + +#define SB_LOG(s) printf s + +#define SB_LOG_NUMBER(n) \ +SB_LOG(("%ld", (long)n)) + +#define SB_LOG_RANGE(o, l) \ +SB_LOG(("[%ld, %ld]", (long)o, (long)(o + l - 1))) + +#define SB_LOG_CHAR(c) \ +SBLOG(("%c", c)) + +#define SB_LOG_STRING(s) \ +SB_LOG(("%s", s)) + +#define SB_LOG_LEVEL(l) \ +SB_LOG_NUMBER(l) + +#define SB_LOG_BREAKER() \ +SB_LOG(("\n")) + +#define SB_LOG_DIVIDER(n) \ +SB_LOG(("%.*s", n, "\t\t\t\t\t\t\t\t\t\t")) + +#define SB_LOG_INITIATOR() \ +SB_LOG_DIVIDER(_SBLogPosition) + +#define SB_LOG_CAPTION(c) \ +SB_LOG((c":")) + +#define SB_LOG_STATEMENT_TEXT(t) \ +(t) + +#define SB_LOG_LINE(s) \ +do { \ + SB_LOG(s); \ + SB_LOG_BREAKER(); \ +} while (0) + +#define SB_LOG_STATEMENT(c, d, t) \ +do { \ + SB_LOG_INITIATOR(); \ + SB_LOG_CAPTION(c); \ + SB_LOG_DIVIDER(d); \ + SB_LOG_STATEMENT_TEXT(t); \ + SB_LOG_BREAKER(); \ +} while (0) + +#define SB_LOG_BLOCK_OPENER(c) \ +do { \ + SB_LOG_INITIATOR(); \ + SB_LOG_CAPTION(c); \ + SB_LOG_BREAKER(); \ + SB_LOG_BEGIN(); \ +} while (0) + +#define SB_LOG_BLOCK_CLOSER() SB_LOG_END() + +#define SB_LOG_BASE_LEVEL(l) PrintBaseLevel(l) +#define SB_LOG_BIDI_TYPE(t) PrintBidiType(t) + +#define SB_LOG_CODEPOINT_SEQUENCE(s) PrintCodepointSequence(s) +#define SB_LOG_BIDI_TYPES_ARRAY(a, l) PrintBidiTypesArray(a, l) +#define SB_LOG_LEVELS_ARRAY(a, l) PrintLevelsArray(a, l) + +#define SB_LOG_RUN_TYPES(r) PrintRunTypes(r) +#define SB_LOG_RUN_LEVELS(r) PrintRunLevels(r) +#define SB_LOG_RUN_RANGE(r) PrintRunRange(r) + +#else + +#define SB_LOG_NONE() + +#define SB_LOG(s) SB_LOG_NONE() + +#define SB_LOG_NUMBER(n) SB_LOG_NONE() +#define SB_LOG_RANGE(o, l) SB_LOG_NONE() +#define SB_LOG_CHAR(c) SB_LOG_NONE() +#define SB_LOG_STRING(s) SB_LOG_NONE() +#define SB_LOG_LEVEL(l) SB_LOG_NONE() + +#define SB_LOG_BREAKER() SB_LOG_NONE() +#define SB_LOG_DIVIDER(n) SB_LOG_NONE() +#define SB_LOG_INITIATOR() SB_LOG_NONE() +#define SB_LOG_CAPTION(c) SB_LOG_NONE() +#define SB_LOG_STATEMENT_TEXT(t) SB_LOG_NONE() + +#define SB_LOG_LINE(s) SB_LOG_NONE() +#define SB_LOG_STATEMENT(c, d, t) SB_LOG_NONE() + +#define SB_LOG_BLOCK_OPENER(c) SB_LOG_NONE() +#define SB_LOG_BLOCK_CLOSER() SB_LOG_NONE() + +#define SB_LOG_BASE_LEVEL(l) SB_LOG_NONE() +#define SB_LOG_BIDI_TYPE(t) SB_LOG_NONE() + +#define SB_LOG_CODEPOINT_SEQUENCE(s) SB_LOG_NONE() +#define SB_LOG_BIDI_TYPES_ARRAY(a, l) SB_LOG_NONE() +#define SB_LOG_LEVELS_ARRAY(a, l) SB_LOG_NONE() + +#define SB_LOG_RUN_TYPES(r) SB_LOG_NONE() +#define SB_LOG_RUN_LEVELS(r) SB_LOG_NONE() + +#define SB_LOG_RUN_RANGE(r) SB_LOG_NONE() + +#endif + +#endif diff --git a/lib/sheenbidi/Source/SBMirrorLocator.c b/lib/sheenbidi/Source/SBMirrorLocator.c new file mode 100644 index 000000000..b926cb37b --- /dev/null +++ b/lib/sheenbidi/Source/SBMirrorLocator.c @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stddef.h> +#include <stdlib.h> + +#include "PairingLookup.h" +#include "SBBase.h" +#include "SBLine.h" +#include "SBMirrorLocator.h" + +SBMirrorLocatorRef SBMirrorLocatorCreate(void) +{ + SBMirrorLocatorRef locator; + + locator = malloc(sizeof(SBMirrorLocator)); + locator->_line = NULL; + locator->retainCount = 1; + SBMirrorLocatorReset(locator); + + return locator; +} + +void SBMirrorLocatorLoadLine(SBMirrorLocatorRef locator, SBLineRef line, void *stringBuffer) +{ + SBLineRelease(locator->_line); + + if (line && stringBuffer == line->codepointSequence.stringBuffer) { + locator->_line = SBLineRetain(line); + } + + SBMirrorLocatorReset(locator); +} + +const SBMirrorAgent *SBMirrorLocatorGetAgent(SBMirrorLocatorRef locator) +{ + return &locator->agent; +} + +SBBoolean SBMirrorLocatorMoveNext(SBMirrorLocatorRef locator) +{ + SBLineRef line = locator->_line; + + if (line) { + const SBCodepointSequence *sequence = &line->codepointSequence; + + do { + const SBRun *run = &line->fixedRuns[locator->_runIndex]; + + if (run->level & 1) { + SBUInteger stringIndex; + SBUInteger stringLimit; + + stringIndex = locator->_stringIndex; + if (stringIndex == SBInvalidIndex) { + stringIndex = run->offset; + } + stringLimit = run->offset + run->length; + + while (stringIndex < stringLimit) { + SBUInteger initialIndex = stringIndex; + SBCodepoint codepoint = SBCodepointSequenceGetCodepointAt(sequence, &stringIndex); + SBCodepoint mirror = LookupMirror(codepoint); + + if (mirror) { + locator->_stringIndex = stringIndex; + locator->agent.index = initialIndex; + locator->agent.mirror = mirror; + locator->agent.codepoint = codepoint; + + return SBTrue; + } + } + } + + locator->_stringIndex = SBInvalidIndex; + } while (++locator->_runIndex < line->runCount); + + SBMirrorLocatorReset(locator); + } + + return SBFalse; +} + +void SBMirrorLocatorReset(SBMirrorLocatorRef locator) +{ + locator->_runIndex = 0; + locator->_stringIndex = SBInvalidIndex; + locator->agent.index = SBInvalidIndex; + locator->agent.mirror = 0; +} + +SBMirrorLocatorRef SBMirrorLocatorRetain(SBMirrorLocatorRef locator) +{ + if (locator) { + locator->retainCount += 1; + } + + return locator; +} + +void SBMirrorLocatorRelease(SBMirrorLocatorRef locator) +{ + if (locator && --locator->retainCount == 0) { + SBLineRelease(locator->_line); + free(locator); + } +} diff --git a/lib/sheenbidi/Source/SBMirrorLocator.h b/lib/sheenbidi/Source/SBMirrorLocator.h new file mode 100644 index 000000000..2f4463a68 --- /dev/null +++ b/lib/sheenbidi/Source/SBMirrorLocator.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_MIRROR_LOCATOR_H +#define _SB_INTERNAL_MIRROR_LOCATOR_H + +#include <SBBase.h> +#include <SBMirrorLocator.h> +#include <SBLine.h> + +typedef struct _SBMirrorLocator { + SBLineRef _line; + SBUInteger _runIndex; + SBUInteger _stringIndex; + SBMirrorAgent agent; + SBUInteger retainCount; +} SBMirrorLocator; + +#endif diff --git a/lib/sheenbidi/Source/SBParagraph.c b/lib/sheenbidi/Source/SBParagraph.c new file mode 100644 index 000000000..36d562cf8 --- /dev/null +++ b/lib/sheenbidi/Source/SBParagraph.c @@ -0,0 +1,646 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> +#include <stdlib.h> + +#include "BidiChain.h" +#include "BidiTypeLookup.h" +#include "IsolatingRun.h" +#include "LevelRun.h" +#include "RunQueue.h" +#include "SBAlgorithm.h" +#include "SBAssert.h" +#include "SBBase.h" +#include "SBCodepointSequence.h" +#include "SBLine.h" +#include "SBLog.h" +#include "StatusStack.h" +#include "SBParagraph.h" + +typedef struct _ParagraphContext { + BidiChain bidiChain; + StatusStack statusStack; + RunQueue runQueue; + IsolatingRun isolatingRun; +} ParagraphContext, *ParagraphContextRef; + +static void PopulateBidiChain(BidiChainRef chain, const SBBidiType *types, SBUInteger length); +static void ProcessRun(ParagraphContextRef context, const LevelRunRef levelRun, SBBoolean forceFinish); + +static ParagraphContextRef CreateParagraphContext(const SBBidiType *types, SBLevel *levels, SBUInteger length) +{ + const SBUInteger sizeContext = sizeof(ParagraphContext); + const SBUInteger sizeLinks = sizeof(BidiLink) * (length + 2); + const SBUInteger sizeTypes = sizeof(SBBidiType) * (length + 2); + const SBUInteger sizeMemory = sizeContext + sizeLinks + sizeTypes; + + const SBUInteger offsetContext = 0; + const SBUInteger offsetLinks = offsetContext + sizeContext; + const SBUInteger offsetTypes = offsetLinks + sizeLinks; + + SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory); + ParagraphContextRef context = (ParagraphContextRef)(memory + offsetContext); + BidiLink *fixedLinks = (BidiLink *)(memory + offsetLinks); + SBBidiType *fixedTypes = (SBBidiType *)(memory + offsetTypes); + + BidiChainInitialize(&context->bidiChain, fixedTypes, levels, fixedLinks); + StatusStackInitialize(&context->statusStack); + RunQueueInitialize(&context->runQueue); + IsolatingRunInitialize(&context->isolatingRun); + + PopulateBidiChain(&context->bidiChain, types, length); + + return context; +} + +static void DisposeParagraphContext(ParagraphContextRef context) +{ + StatusStackFinalize(&context->statusStack); + RunQueueFinalize(&context->runQueue); + IsolatingRunFinalize(&context->isolatingRun); + free(context); +} + +static SBParagraphRef ParagraphAllocate(SBUInteger length) +{ + const SBUInteger sizeParagraph = sizeof(SBParagraph); + const SBUInteger sizeLevels = sizeof(SBLevel) * (length + 2); + const SBUInteger sizeMemory = sizeParagraph + sizeLevels; + + const SBUInteger offsetParagraph = 0; + const SBUInteger offsetLevels = offsetParagraph + sizeParagraph; + + SBUInt8 *memory = (SBUInt8 *)malloc(sizeMemory); + SBParagraphRef paragraph = (SBParagraphRef)(memory + offsetParagraph); + SBLevel *levels = (SBLevel *)(memory + offsetLevels); + + paragraph->fixedLevels = levels; + + return paragraph; +} + +static SBUInteger DetermineBoundary(SBAlgorithmRef algorithm, SBUInteger paragraphOffset, SBUInteger suggestedLength) +{ + SBBidiType *bidiTypes = algorithm->fixedTypes; + SBUInteger suggestedLimit = paragraphOffset + suggestedLength; + SBUInteger stringIndex; + + for (stringIndex = paragraphOffset; stringIndex < suggestedLimit; stringIndex++) { + if (bidiTypes[stringIndex] == SBBidiTypeB) { + goto Return; + } + } + +Return: + stringIndex += SBAlgorithmGetSeparatorLength(algorithm, stringIndex); + + return (stringIndex - paragraphOffset); +} + +static void PopulateBidiChain(BidiChainRef chain, const SBBidiType *types, SBUInteger length) +{ + SBBidiType type = SBBidiTypeNil; + SBUInteger priorIndex = SBInvalidIndex; + SBUInteger index; + + for (index = 0; index < length; index++) { + SBBidiType priorType = type; + type = types[index]; + + switch (type) { + case SBBidiTypeB: + case SBBidiTypeON: + case SBBidiTypeLRE: + case SBBidiTypeRLE: + case SBBidiTypeLRO: + case SBBidiTypeRLO: + case SBBidiTypePDF: + case SBBidiTypeLRI: + case SBBidiTypeRLI: + case SBBidiTypeFSI: + case SBBidiTypePDI: + BidiChainAdd(chain, type, index - priorIndex); + priorIndex = index; + + if (type == SBBidiTypeB) { + index = length; + goto AddLast; + } + break; + + default: + if (type != priorType) { + BidiChainAdd(chain, type, index - priorIndex); + priorIndex = index; + } + break; + } + } + +AddLast: + BidiChainAdd(chain, SBBidiTypeNil, index - priorIndex); +} + +static BidiLink SkipIsolatingRun(BidiChainRef chain, BidiLink skipLink, BidiLink breakLink) +{ + BidiLink link = skipLink; + SBUInteger depth = 1; + + while ((link = BidiChainGetNext(chain, link)) != breakLink) { + SBBidiType type = BidiChainGetType(chain, link); + + switch (type) { + case SBBidiTypeLRI: + case SBBidiTypeRLI: + case SBBidiTypeFSI: + depth += 1; + break; + + case SBBidiTypePDI: + if (--depth == 0) { + return link; + } + break; + } + } + + return BidiLinkNone; +} + +static SBLevel DetermineBaseLevel(BidiChainRef chain, BidiLink skipLink, BidiLink breakLink, SBLevel defaultLevel, SBBoolean isIsolate) +{ + BidiLink link = skipLink; + + /* Rules P2, P3 */ + while ((link = BidiChainGetNext(chain, link)) != breakLink) { + SBBidiType type = BidiChainGetType(chain, link); + + switch (type) { + case SBBidiTypeL: + return 0; + + case SBBidiTypeAL: + case SBBidiTypeR: + return 1; + + case SBBidiTypeLRI: + case SBBidiTypeRLI: + case SBBidiTypeFSI: + link = SkipIsolatingRun(chain, link, breakLink); + if (link == BidiLinkNone) { + goto Default; + } + break; + + case SBBidiTypePDI: + if (isIsolate) { + /* + * In case of isolating run, the PDI will be the last code point. + * NOTE: + * The inner isolating runs will be skipped by the case above this one. + */ + goto Default; + } + break; + } + } + +Default: + return defaultLevel; +} + +static SBLevel DetermineParagraphLevel(BidiChainRef chain, SBLevel baseLevel) +{ + if (baseLevel >= SBLevelMax) { + return DetermineBaseLevel(chain, chain->roller, chain->roller, + (baseLevel != SBLevelDefaultRTL ? 0 : 1), + SBFalse); + } + + return baseLevel; +} + +static void DetermineLevels(ParagraphContextRef context, SBLevel baseLevel) +{ + BidiChainRef chain = &context->bidiChain; + StatusStackRef stack = &context->statusStack; + BidiLink roller = chain->roller; + BidiLink link; + + BidiLink priorLink; + BidiLink firstLink; + BidiLink lastLink; + + SBLevel priorLevel; + SBBidiType sor; + SBBidiType eor; + + SBUInteger overIsolate; + SBUInteger overEmbedding; + SBUInteger validIsolate; + + priorLink = chain->roller; + firstLink = BidiLinkNone; + lastLink = BidiLinkNone; + + priorLevel = baseLevel; + sor = SBBidiTypeNil; + + /* Rule X1 */ + overIsolate = 0; + overEmbedding = 0; + validIsolate = 0; + + StatusStackPush(stack, baseLevel, SBBidiTypeON, SBFalse); + + BidiChainForEach(chain, roller, link) { + SBBoolean forceFinish = SBFalse; + SBBoolean bnEquivalent = SBFalse; + SBBidiType type; + + type = BidiChainGetType(chain, link); + +#define LeastGreaterOddLevel() \ +( \ + (StatusStackGetEmbeddingLevel(stack) + 1) | 1 \ +) + +#define LeastGreaterEvenLevel() \ +( \ + (StatusStackGetEmbeddingLevel(stack) + 2) & ~1 \ +) + +#define MergeLinkIfNeeded() \ +{ \ + if (BidiChainMergeIfEqual(chain, priorLink, link)) { \ + continue; \ + } \ +} + +#define PushEmbedding(l, o) \ +{ \ + SBLevel newLevel = l; \ + \ + bnEquivalent = SBTrue; \ + \ + if (newLevel <= SBLevelMax && !overIsolate && !overEmbedding) { \ + StatusStackPush(stack, newLevel, o, SBFalse); \ + } else { \ + if (!overIsolate) { \ + overEmbedding += 1; \ + } \ + } \ +} + +#define PushIsolate(l, o) \ +{ \ + SBBidiType priorStatus = StatusStackGetOverrideStatus(stack); \ + SBLevel newLevel = l; \ + \ + BidiChainSetLevel(chain, link, \ + StatusStackGetEmbeddingLevel(stack)); \ + \ + if (newLevel <= SBLevelMax && !overIsolate && !overEmbedding) { \ + validIsolate += 1; \ + StatusStackPush(stack, newLevel, o, SBTrue); \ + } else { \ + overIsolate += 1; \ + } \ + \ + if (priorStatus != SBBidiTypeON) { \ + BidiChainSetType(chain, link, priorStatus); \ + MergeLinkIfNeeded(); \ + } \ +} + + switch (type) { + /* Rule X2 */ + case SBBidiTypeRLE: + PushEmbedding(LeastGreaterOddLevel(), SBBidiTypeON); + break; + + /* Rule X3 */ + case SBBidiTypeLRE: + PushEmbedding(LeastGreaterEvenLevel(), SBBidiTypeON); + break; + + /* Rule X4 */ + case SBBidiTypeRLO: + PushEmbedding(LeastGreaterOddLevel(), SBBidiTypeR); + break; + + /* Rule X5 */ + case SBBidiTypeLRO: + PushEmbedding(LeastGreaterEvenLevel(), SBBidiTypeL); + break; + + /* Rule X5a */ + case SBBidiTypeRLI: + PushIsolate(LeastGreaterOddLevel(), SBBidiTypeON); + break; + + /* Rule X5b */ + case SBBidiTypeLRI: + PushIsolate(LeastGreaterEvenLevel(), SBBidiTypeON); + break; + + /* Rule X5c */ + case SBBidiTypeFSI: + { + SBBoolean isRTL = (DetermineBaseLevel(chain, link, roller, 0, SBTrue) == 1); + PushIsolate(isRTL ? LeastGreaterOddLevel() : LeastGreaterEvenLevel(), SBBidiTypeON); + break; + } + + /* Rule X6 */ + default: + BidiChainSetLevel(chain, link, StatusStackGetEmbeddingLevel(stack)); + + if (StatusStackGetOverrideStatus(stack) != SBBidiTypeON) { + BidiChainSetType(chain, link, StatusStackGetOverrideStatus(stack)); + MergeLinkIfNeeded(); + } + break; + + /* Rule X6a */ + case SBBidiTypePDI: + { + SBBidiType overrideStatus; + + if (overIsolate != 0) { + overIsolate -= 1; + } else if (validIsolate == 0) { + /* Do nothing */ + } else { + overEmbedding = 0; + + while (!StatusStackGetIsolateStatus(stack)) { + StatusStackPop(stack); + } + StatusStackPop(stack); + + validIsolate -= 1; + } + + BidiChainSetLevel(chain, link, StatusStackGetEmbeddingLevel(stack)); + overrideStatus = StatusStackGetOverrideStatus(stack); + + if (overrideStatus != SBBidiTypeON) { + BidiChainSetType(chain, link, overrideStatus); + MergeLinkIfNeeded(); + } + break; + } + + /* Rule X7 */ + case SBBidiTypePDF: + bnEquivalent = SBTrue; + + if (overIsolate != 0) { + /* Do nothing */ + } else if (overEmbedding != 0) { + overEmbedding -= 1; + } else if (!StatusStackGetIsolateStatus(stack) && stack->count >= 2) { + StatusStackPop(stack); + } + break; + + /* Rule X8 */ + case SBBidiTypeB: + /* + * These values are reset for clarity, in this implementation B can only occur as the + * last code in the array. + */ + StatusStackSetEmpty(stack); + StatusStackPush(stack, baseLevel, SBBidiTypeON, SBFalse); + + overIsolate = 0; + overEmbedding = 0; + validIsolate = 0; + + BidiChainSetLevel(chain, link, baseLevel); + break; + + case SBBidiTypeBN: + bnEquivalent = SBTrue; + break; + + case SBBidiTypeNil: + forceFinish = SBTrue; + BidiChainSetLevel(chain, link, baseLevel); + break; + } + + /* Rule X9 */ + if (bnEquivalent) { + /* The type of this link is BN equivalent, so abandon it and continue the loop. */ + BidiChainSetType(chain, link, SBBidiTypeBN); + BidiChainAbandonNext(chain, priorLink); + continue; + } + + if (sor == SBBidiTypeNil) { + sor = SBLevelAsNormalBidiType(SBNumberGetMax(baseLevel, BidiChainGetLevel(chain, link))); + firstLink = link; + priorLevel = BidiChainGetLevel(chain, link); + } else if (priorLevel != BidiChainGetLevel(chain, link) || forceFinish) { + LevelRun levelRun; + SBLevel currentLevel; + + /* Since the level has changed at this link, therefore the run must end at prior link. */ + lastLink = priorLink; + + /* Save the current level i.e. level of the next run. */ + currentLevel = BidiChainGetLevel(chain, link); + /* + * Now we have both the prior level and the current level i.e. unchanged levels of both + * the current run and the next run. So, identify eor of the current run. + * NOTE: + * sor of the run has been already determined at this stage. + */ + eor = SBLevelAsNormalBidiType(SBNumberGetMax(priorLevel, currentLevel)); + + LevelRunInitialize(&levelRun, chain, firstLink, lastLink, sor, eor); + ProcessRun(context, &levelRun, forceFinish); + + /* The sor of next run (if any) should be technically equal to eor of this run. */ + sor = eor; + /* The next run (if any) will start from this index. */ + firstLink = link; + + priorLevel = currentLevel; + } + + priorLink = link; + } +} + +static void ProcessRun(ParagraphContextRef context, const LevelRunRef levelRun, SBBoolean forceFinish) +{ + RunQueueRef queue = &context->runQueue; + RunQueueEnqueue(queue, levelRun); + + if (queue->shouldDequeue || forceFinish) { + IsolatingRunRef isolatingRun = &context->isolatingRun; + LevelRunRef peek; + + /* Rule X10 */ + for (; queue->count != 0; RunQueueDequeue(queue)) { + peek = queue->peek; + if (RunKindIsAttachedTerminating(peek->kind)) { + continue; + } + + isolatingRun->baseLevelRun = peek; + IsolatingRunResolve(isolatingRun); + } + } +} + +static void SaveLevels(BidiChainRef chain, SBLevel *levels, SBLevel baseLevel) +{ + BidiLink roller = chain->roller; + BidiLink link; + + SBUInteger index = 0; + SBLevel level = baseLevel; + + BidiChainForEach(chain, roller, link) { + SBUInteger offset = BidiChainGetOffset(chain, link); + + for (; index < offset; index++) { + levels[index] = level; + } + + level = BidiChainGetLevel(chain, link); + } +} + +SB_INTERNAL SBParagraphRef SBParagraphCreate(SBAlgorithmRef algorithm, + SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel) +{ + const SBCodepointSequence *codepointSequence = &algorithm->codepointSequence; + SBUInteger stringLength = codepointSequence->stringLength; + SBUInteger actualLength; + + SBParagraphRef paragraph; + ParagraphContextRef context; + SBLevel resolvedLevel; + + /* The given range MUST be valid. */ + SBAssert(SBUIntegerVerifyRange(stringLength, paragraphOffset, suggestedLength) && suggestedLength > 0); + + SB_LOG_BLOCK_OPENER("Paragraph Input"); + SB_LOG_STATEMENT("Paragraph Offset", 1, SB_LOG_NUMBER(paragraphOffset)); + SB_LOG_STATEMENT("Suggested Length", 1, SB_LOG_NUMBER(suggestedLength)); + SB_LOG_STATEMENT("Base Direction", 1, SB_LOG_BASE_LEVEL(baseLevel)); + SB_LOG_BLOCK_CLOSER(); + + actualLength = DetermineBoundary(algorithm, paragraphOffset, suggestedLength); + + SB_LOG_BLOCK_OPENER("Determined Paragraph Boundary"); + SB_LOG_STATEMENT("Actual Length", 1, SB_LOG_NUMBER(actualLength)); + SB_LOG_BLOCK_CLOSER(); + + paragraph = ParagraphAllocate(actualLength); + paragraph->refTypes = algorithm->fixedTypes + paragraphOffset; + + context = CreateParagraphContext(paragraph->refTypes, paragraph->fixedLevels, actualLength); + + resolvedLevel = DetermineParagraphLevel(&context->bidiChain, baseLevel); + + SB_LOG_BLOCK_OPENER("Determined Paragraph Level"); + SB_LOG_STATEMENT("Base Level", 1, SB_LOG_LEVEL(resolvedLevel)); + SB_LOG_BLOCK_CLOSER(); + + context->isolatingRun.codepointSequence = codepointSequence; + context->isolatingRun.bidiTypes = paragraph->refTypes; + context->isolatingRun.bidiChain = &context->bidiChain; + context->isolatingRun.paragraphOffset = paragraphOffset; + context->isolatingRun.paragraphLevel = resolvedLevel; + + DetermineLevels(context, resolvedLevel); + SaveLevels(&context->bidiChain, ++paragraph->fixedLevels, resolvedLevel); + + SB_LOG_BLOCK_OPENER("Determined Embedding Levels"); + SB_LOG_STATEMENT("Levels", 1, SB_LOG_LEVELS_ARRAY(paragraph->fixedLevels, actualLength)); + SB_LOG_BLOCK_CLOSER(); + + paragraph->algorithm = SBAlgorithmRetain(algorithm); + paragraph->offset = paragraphOffset; + paragraph->length = actualLength; + paragraph->baseLevel = resolvedLevel; + paragraph->retainCount = 1; + + DisposeParagraphContext(context); + + SB_LOG_BREAKER(); + + return paragraph; +} + +SBUInteger SBParagraphGetOffset(SBParagraphRef paragraph) +{ + return paragraph->offset; +} + +SBUInteger SBParagraphGetLength(SBParagraphRef paragraph) +{ + return paragraph->length; +} + +SBLevel SBParagraphGetBaseLevel(SBParagraphRef paragraph) +{ + return paragraph->baseLevel; +} + +const SBLevel *SBParagraphGetLevelsPtr(SBParagraphRef paragraph) +{ + return paragraph->fixedLevels; +} + +SBLineRef SBParagraphCreateLine(SBParagraphRef paragraph, SBUInteger lineOffset, SBUInteger lineLength) +{ + SBUInteger paragraphOffset = paragraph->offset; + SBUInteger paragraphLength = paragraph->length; + SBUInteger paragraphLimit = paragraphOffset + paragraphLength; + SBUInteger lineLimit = lineOffset + lineLength; + + if (lineOffset < lineLimit && lineOffset >= paragraphOffset && lineLimit <= paragraphLimit) { + return SBLineCreate(paragraph, lineOffset, lineLength); + } + + return NULL; +} + +SBParagraphRef SBParagraphRetain(SBParagraphRef paragraph) +{ + if (paragraph) { + paragraph->retainCount += 1; + } + + return paragraph; +} + +void SBParagraphRelease(SBParagraphRef paragraph) +{ + if (paragraph && --paragraph->retainCount == 0) { + SBAlgorithmRelease(paragraph->algorithm); + free(paragraph); + } +} diff --git a/lib/sheenbidi/Source/SBParagraph.h b/lib/sheenbidi/Source/SBParagraph.h new file mode 100644 index 000000000..c40b4ee2a --- /dev/null +++ b/lib/sheenbidi/Source/SBParagraph.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_PARAGRAPH_H +#define _SB_INTERNAL_PARAGRAPH_H + +#include <SBAlgorithm.h> +#include <SBBase.h> +#include <SBConfig.h> +#include <SBParagraph.h> + +typedef struct _SBParagraph { + SBAlgorithmRef algorithm; + const SBBidiType *refTypes; + SBLevel *fixedLevels; + SBUInteger offset; + SBUInteger length; + SBLevel baseLevel; + SBUInteger retainCount; +} SBParagraph; + +SB_INTERNAL SBParagraphRef SBParagraphCreate(SBAlgorithmRef algorithm, + SBUInteger paragraphOffset, SBUInteger suggestedLength, SBLevel baseLevel); + +#endif diff --git a/lib/sheenbidi/Source/SBScriptLocator.c b/lib/sheenbidi/Source/SBScriptLocator.c new file mode 100644 index 000000000..438336e2d --- /dev/null +++ b/lib/sheenbidi/Source/SBScriptLocator.c @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2018-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stddef.h> +#include <stdlib.h> + +#include "GeneralCategoryLookup.h" +#include "PairingLookup.h" +#include "SBBase.h" +#include "SBCodepointSequence.h" +#include "ScriptLookup.h" +#include "ScriptStack.h" +#include "SBScriptLocator.h" + +static SBBoolean IsSimilarScript(SBScript lhs, SBScript rhs) +{ + return SBScriptIsCommonOrInherited(lhs) + || SBScriptIsCommonOrInherited(rhs) + || lhs == rhs; +} + +SBScriptLocatorRef SBScriptLocatorCreate(void) +{ + SBScriptLocatorRef locator; + + locator = malloc(sizeof(SBScriptLocator)); + locator->_codepointSequence.stringEncoding = SBStringEncodingUTF8; + locator->_codepointSequence.stringBuffer = NULL; + locator->_codepointSequence.stringLength = 0; + locator->retainCount = 1; + SBScriptLocatorReset(locator); + + return locator; +} + +void SBScriptLocatorLoadCodepoints(SBScriptLocatorRef locator, const SBCodepointSequence *codepointSequence) +{ + locator->_codepointSequence = *codepointSequence; + SBScriptLocatorReset(locator); +} + +const SBScriptAgent *SBScriptLocatorGetAgent(SBScriptLocatorRef locator) +{ + return &locator->agent; +} + +static void ResolveScriptRun(SBScriptLocatorRef locator, SBUInteger offset) +{ + const SBCodepointSequence *sequence = &locator->_codepointSequence; + ScriptStackRef stack = &locator->_scriptStack; + SBScript result = SBScriptZYYY; + SBUInteger current = offset; + SBUInteger next = offset; + SBCodepoint codepoint; + + /* Iterate over the code points of specified string buffer. */ + while ((codepoint = SBCodepointSequenceGetCodepointAt(sequence, &next)) != SBCodepointInvalid) { + SBBoolean isStacked = SBFalse; + SBScript script; + + script = LookupScript(codepoint); + + /* Handle paired punctuations in case of a common script. */ + if (script == SBScriptZYYY) { + SBGeneralCategory generalCategory = LookupGeneralCategory(codepoint); + + /* Check if current code point is an open punctuation. */ + if (generalCategory == SBGeneralCategoryPS) { + SBCodepoint mirror = LookupMirror(codepoint); + if (mirror) { + /* A closing pair exists for this punctuation, so push it onto the stack. */ + ScriptStackPush(stack, result, mirror); + } + } + /* Check if current code point is a close punctuation. */ + else if (generalCategory == SBGeneralCategoryPE) { + SBBoolean isMirrored = (LookupMirror(codepoint) != 0); + if (isMirrored) { + /* Find the matching entry in the stack, while popping the unmatched ones. */ + while (!ScriptStackIsEmpty(stack)) { + SBCodepoint mirror = ScriptStackGetMirror(stack); + if (mirror != codepoint) { + ScriptStackPop(stack); + } else { + break; + } + } + + if (!ScriptStackIsEmpty(stack)) { + isStacked = SBTrue; + /* Paired punctuation match the script of enclosing text. */ + script = ScriptStackGetScript(stack); + } + } + } + } + + if (IsSimilarScript(result, script)) { + if (SBScriptIsCommonOrInherited(result) && !SBScriptIsCommonOrInherited(script)) { + /* Set the concrete script of this code point as the result. */ + result = script; + /* Seal the pending punctuations with the result. */ + ScriptStackSealPairs(stack, result); + } + + if (isStacked) { + /* Pop the paired punctuation from the stack. */ + ScriptStackPop(stack); + } + } else { + /* The current code point has a different script, so finish the run. */ + break; + } + + current = next; + } + + ScriptStackLeavePairs(stack); + + /* Set the run info in agent. */ + locator->agent.offset = offset; + locator->agent.length = current - offset; + locator->agent.script = result; +} + +SBBoolean SBScriptLocatorMoveNext(SBScriptLocatorRef locator) +{ + SBUInteger offset = locator->agent.offset + locator->agent.length; + + if (offset < locator->_codepointSequence.stringLength) { + ResolveScriptRun(locator, offset); + return SBTrue; + } + + SBScriptLocatorReset(locator); + return SBFalse; +} + +void SBScriptLocatorReset(SBScriptLocatorRef locator) +{ + ScriptStackReset(&locator->_scriptStack); + locator->agent.offset = 0; + locator->agent.length = 0; + locator->agent.script = SBScriptNil; +} + +SBScriptLocatorRef SBScriptLocatorRetain(SBScriptLocatorRef locator) +{ + if (locator) { + locator->retainCount += 1; + } + + return locator; +} + +void SBScriptLocatorRelease(SBScriptLocatorRef locator) +{ + if (locator && --locator->retainCount == 0) { + free(locator); + } +} diff --git a/lib/sheenbidi/Source/SBScriptLocator.h b/lib/sheenbidi/Source/SBScriptLocator.h new file mode 100644 index 000000000..c9ea97e7b --- /dev/null +++ b/lib/sheenbidi/Source/SBScriptLocator.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2018-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_SCRIPT_LOCATOR_H +#define _SB_INTERNAL_SCRIPT_LOCATOR_H + +#include <SBBase.h> +#include <SBCodepointSequence.h> +#include <SBScriptLocator.h> + +#include "ScriptStack.h" + +typedef struct _SBScriptLocator { + SBCodepointSequence _codepointSequence; + ScriptStack _scriptStack; + SBScriptAgent agent; + SBUInteger retainCount; +} SBScriptLocator; + +#endif diff --git a/lib/sheenbidi/Source/ScriptLookup.c b/lib/sheenbidi/Source/ScriptLookup.c new file mode 100644 index 000000000..40f09021b --- /dev/null +++ b/lib/sheenbidi/Source/ScriptLookup.c @@ -0,0 +1,2142 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + * + * REQUIRED MEMORY: 10304+(3935*2)+(897*2) = 19968 Bytes + */ + +#include "ScriptLookup.h" + +#define Adlm SBScriptADLM +#define Aghb SBScriptAGHB +#define Ahom SBScriptAHOM +#define Arab SBScriptARAB +#define Armi SBScriptARMI +#define Armn SBScriptARMN +#define Avst SBScriptAVST +#define Bali SBScriptBALI +#define Bamu SBScriptBAMU +#define Bass SBScriptBASS +#define Batk SBScriptBATK +#define Beng SBScriptBENG +#define Bhks SBScriptBHKS +#define Bopo SBScriptBOPO +#define Brah SBScriptBRAH +#define Brai SBScriptBRAI +#define Bugi SBScriptBUGI +#define Buhd SBScriptBUHD +#define Cakm SBScriptCAKM +#define Cans SBScriptCANS +#define Cari SBScriptCARI +#define Cham SBScriptCHAM +#define Cher SBScriptCHER +#define Chrs SBScriptCHRS +#define Copt SBScriptCOPT +#define Cprt SBScriptCPRT +#define Cyrl SBScriptCYRL +#define Deva SBScriptDEVA +#define Diak SBScriptDIAK +#define Dogr SBScriptDOGR +#define Dsrt SBScriptDSRT +#define Dupl SBScriptDUPL +#define Egyp SBScriptEGYP +#define Elba SBScriptELBA +#define Elym SBScriptELYM +#define Ethi SBScriptETHI +#define Geor SBScriptGEOR +#define Glag SBScriptGLAG +#define Gong SBScriptGONG +#define Gonm SBScriptGONM +#define Goth SBScriptGOTH +#define Gran SBScriptGRAN +#define Grek SBScriptGREK +#define Gujr SBScriptGUJR +#define Guru SBScriptGURU +#define Hang SBScriptHANG +#define Hani SBScriptHANI +#define Hano SBScriptHANO +#define Hatr SBScriptHATR +#define Hebr SBScriptHEBR +#define Hira SBScriptHIRA +#define Hluw SBScriptHLUW +#define Hmng SBScriptHMNG +#define Hmnp SBScriptHMNP +#define Hung SBScriptHUNG +#define Ital SBScriptITAL +#define Java SBScriptJAVA +#define Kali SBScriptKALI +#define Kana SBScriptKANA +#define Khar SBScriptKHAR +#define Khmr SBScriptKHMR +#define Khoj SBScriptKHOJ +#define Kits SBScriptKITS +#define Knda SBScriptKNDA +#define Kthi SBScriptKTHI +#define Lana SBScriptLANA +#define Laoo SBScriptLAOO +#define Latn SBScriptLATN +#define Lepc SBScriptLEPC +#define Limb SBScriptLIMB +#define Lina SBScriptLINA +#define Linb SBScriptLINB +#define Lisu SBScriptLISU +#define Lyci SBScriptLYCI +#define Lydi SBScriptLYDI +#define Mahj SBScriptMAHJ +#define Maka SBScriptMAKA +#define Mand SBScriptMAND +#define Mani SBScriptMANI +#define Marc SBScriptMARC +#define Medf SBScriptMEDF +#define Mend SBScriptMEND +#define Merc SBScriptMERC +#define Mero SBScriptMERO +#define Mlym SBScriptMLYM +#define Modi SBScriptMODI +#define Mong SBScriptMONG +#define Mroo SBScriptMROO +#define Mtei SBScriptMTEI +#define Mult SBScriptMULT +#define Mymr SBScriptMYMR +#define Nand SBScriptNAND +#define Narb SBScriptNARB +#define Nbat SBScriptNBAT +#define Newa SBScriptNEWA +#define Nkoo SBScriptNKOO +#define Nshu SBScriptNSHU +#define Ogam SBScriptOGAM +#define Olck SBScriptOLCK +#define Orkh SBScriptORKH +#define Orya SBScriptORYA +#define Osge SBScriptOSGE +#define Osma SBScriptOSMA +#define Palm SBScriptPALM +#define Pauc SBScriptPAUC +#define Perm SBScriptPERM +#define Phag SBScriptPHAG +#define Phli SBScriptPHLI +#define Phlp SBScriptPHLP +#define Phnx SBScriptPHNX +#define Plrd SBScriptPLRD +#define Prti SBScriptPRTI +#define Rjng SBScriptRJNG +#define Rohg SBScriptROHG +#define Runr SBScriptRUNR +#define Samr SBScriptSAMR +#define Sarb SBScriptSARB +#define Saur SBScriptSAUR +#define Sgnw SBScriptSGNW +#define Shaw SBScriptSHAW +#define Shrd SBScriptSHRD +#define Sidd SBScriptSIDD +#define Sind SBScriptSIND +#define Sinh SBScriptSINH +#define Sogd SBScriptSOGD +#define Sogo SBScriptSOGO +#define Sora SBScriptSORA +#define Soyo SBScriptSOYO +#define Sund SBScriptSUND +#define Sylo SBScriptSYLO +#define Syrc SBScriptSYRC +#define Tagb SBScriptTAGB +#define Takr SBScriptTAKR +#define Tale SBScriptTALE +#define Talu SBScriptTALU +#define Taml SBScriptTAML +#define Tang SBScriptTANG +#define Tavt SBScriptTAVT +#define Telu SBScriptTELU +#define Tfng SBScriptTFNG +#define Tglg SBScriptTGLG +#define Thaa SBScriptTHAA +#define Thai SBScriptTHAI +#define Tibt SBScriptTIBT +#define Tirh SBScriptTIRH +#define Ugar SBScriptUGAR +#define Vaii SBScriptVAII +#define Wara SBScriptWARA +#define Wcho SBScriptWCHO +#define Xpeo SBScriptXPEO +#define Xsux SBScriptXSUX +#define Yezi SBScriptYEZI +#define Yiii SBScriptYIII +#define Zanb SBScriptZANB +#define Zinh SBScriptZINH +#define Zyyy SBScriptZYYY +#define Zzzz SBScriptZZZZ + +static const SBUInt8 PrimaryScriptData[10304] = { +/* DATA_BLOCK: -- 0x0000..0x000F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0010..0x001F -- */ + Zyyy, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x0020..0x002F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0030..0x003F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0040..0x004F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x0050..0x005F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x0060..0x006F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0070..0x007F -- */ + Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Bopo, Bopo, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0080..0x008F -- */ + Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, +/* DATA_BLOCK: -- 0x0090..0x009F -- */ + Grek, Grek, Grek, Grek, Zyyy, Grek, Grek, Grek, Zzzz, Zzzz, Grek, Grek, Grek, Grek, Zyyy, Grek, +/* DATA_BLOCK: -- 0x00A0..0x00AF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Grek, Zyyy, Grek, Zyyy, Grek, Grek, Grek, Zzzz, Grek, Zzzz, Grek, Grek, +/* DATA_BLOCK: -- 0x00B0..0x00BF -- */ + Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, +/* DATA_BLOCK: -- 0x00C0..0x00CF -- */ + Grek, Grek, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, +/* DATA_BLOCK: -- 0x00D0..0x00DF -- */ + Grek, Grek, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, +/* DATA_BLOCK: -- 0x00E0..0x00EF -- */ + Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, +/* DATA_BLOCK: -- 0x00F0..0x00FF -- */ + Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Zinh, Zinh, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, +/* DATA_BLOCK: -- 0x0100..0x010F -- */ + Zzzz, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, +/* DATA_BLOCK: -- 0x0110..0x011F -- */ + Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, +/* DATA_BLOCK: -- 0x0120..0x012F -- */ + Armn, Armn, Armn, Armn, Armn, Armn, Armn, Zzzz, Zzzz, Armn, Armn, Armn, Armn, Armn, Armn, Armn, +/* DATA_BLOCK: -- 0x0130..0x013F -- */ + Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Armn, Zzzz, Zzzz, Armn, Armn, Armn, +/* DATA_BLOCK: -- 0x0140..0x014F -- */ + Zzzz, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, +/* DATA_BLOCK: -- 0x0150..0x015F -- */ + Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, +/* DATA_BLOCK: -- 0x0160..0x016F -- */ + Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0170..0x017F -- */ + Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Zzzz, Zzzz, Zzzz, Hebr, +/* DATA_BLOCK: -- 0x0180..0x018F -- */ + Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0190..0x019F -- */ + Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x01A0..0x01AF -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Zzzz, Arab, Zyyy, +/* DATA_BLOCK: -- 0x01B0..0x01BF -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x01C0..0x01CF -- */ + Zyyy, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zinh, Zinh, Zinh, Zinh, Zinh, +/* DATA_BLOCK: -- 0x01D0..0x01DF -- */ + Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x01E0..0x01EF -- */ + Zinh, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x01F0..0x01FF -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Arab, Arab, +/* DATA_BLOCK: -- 0x0200..0x020F -- */ + Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Zzzz, Syrc, +/* DATA_BLOCK: -- 0x0210..0x021F -- */ + Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, +/* DATA_BLOCK: -- 0x0220..0x022F -- */ + Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Zzzz, Zzzz, Syrc, Syrc, Syrc, +/* DATA_BLOCK: -- 0x0230..0x023F -- */ + Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, Thaa, +/* DATA_BLOCK: -- 0x0240..0x024F -- */ + Thaa, Thaa, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0250..0x025F -- */ + Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, +/* DATA_BLOCK: -- 0x0260..0x026F -- */ + Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Nkoo, Zzzz, Zzzz, Nkoo, Nkoo, Nkoo, +/* DATA_BLOCK: -- 0x0270..0x027F -- */ + Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, +/* DATA_BLOCK: -- 0x0280..0x028F -- */ + Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0290..0x029F -- */ + Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Samr, Zzzz, +/* DATA_BLOCK: -- 0x02A0..0x02AF -- */ + Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, +/* DATA_BLOCK: -- 0x02B0..0x02BF -- */ + Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Mand, Zzzz, Zzzz, Mand, Zzzz, +/* DATA_BLOCK: -- 0x02C0..0x02CF -- */ + Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Syrc, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x02D0..0x02DF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x02E0..0x02EF -- */ + Arab, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x02F0..0x02FF -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0300..0x030F -- */ + Zzzz, Zzzz, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x0310..0x031F -- */ + Arab, Arab, Zyyy, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x0320..0x032F -- */ + Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, +/* DATA_BLOCK: -- 0x0330..0x033F -- */ + Deva, Zinh, Zinh, Zinh, Zinh, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, +/* DATA_BLOCK: -- 0x0340..0x034F -- */ + Deva, Deva, Deva, Deva, Zyyy, Zyyy, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, Deva, +/* DATA_BLOCK: -- 0x0350..0x035F -- */ + Beng, Beng, Beng, Beng, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, +/* DATA_BLOCK: -- 0x0360..0x036F -- */ + Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, +/* DATA_BLOCK: -- 0x0370..0x037F -- */ + Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, +/* DATA_BLOCK: -- 0x0380..0x038F -- */ + Beng, Zzzz, Beng, Zzzz, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, +/* DATA_BLOCK: -- 0x0390..0x039F -- */ + Beng, Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Zzzz, +/* DATA_BLOCK: -- 0x03A0..0x03AF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Beng, Zzzz, Zzzz, Zzzz, Zzzz, Beng, Beng, Zzzz, Beng, +/* DATA_BLOCK: -- 0x03B0..0x03BF -- */ + Beng, Beng, Beng, Beng, Zzzz, Zzzz, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, +/* DATA_BLOCK: -- 0x03C0..0x03CF -- */ + Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Beng, Zzzz, +/* DATA_BLOCK: -- 0x03D0..0x03DF -- */ + Zzzz, Guru, Guru, Guru, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Guru, +/* DATA_BLOCK: -- 0x03E0..0x03EF -- */ + Guru, Zzzz, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, +/* DATA_BLOCK: -- 0x03F0..0x03FF -- */ + Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, +/* DATA_BLOCK: -- 0x0400..0x040F -- */ + Guru, Zzzz, Guru, Guru, Zzzz, Guru, Guru, Zzzz, Guru, Guru, Zzzz, Zzzz, Guru, Zzzz, Guru, Guru, +/* DATA_BLOCK: -- 0x0410..0x041F -- */ + Guru, Guru, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Guru, Guru, Zzzz, Zzzz, Guru, Guru, Guru, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0420..0x042F -- */ + Zzzz, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Guru, Guru, Guru, Guru, Zzzz, Guru, Zzzz, +/* DATA_BLOCK: -- 0x0430..0x043F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, Guru, +/* DATA_BLOCK: -- 0x0440..0x044F -- */ + Guru, Guru, Guru, Guru, Guru, Guru, Guru, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0450..0x045F -- */ + Zzzz, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Gujr, +/* DATA_BLOCK: -- 0x0460..0x046F -- */ + Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, +/* DATA_BLOCK: -- 0x0470..0x047F -- */ + Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, +/* DATA_BLOCK: -- 0x0480..0x048F -- */ + Gujr, Zzzz, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Zzzz, Gujr, Gujr, Gujr, Gujr, +/* DATA_BLOCK: -- 0x0490..0x049F -- */ + Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Zzzz, Gujr, Gujr, Gujr, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x04A0..0x04AF -- */ + Gujr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x04B0..0x04BF -- */ + Gujr, Gujr, Gujr, Gujr, Zzzz, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, +/* DATA_BLOCK: -- 0x04C0..0x04CF -- */ + Gujr, Gujr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, Gujr, +/* DATA_BLOCK: -- 0x04D0..0x04DF -- */ + Zzzz, Orya, Orya, Orya, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, +/* DATA_BLOCK: -- 0x04E0..0x04EF -- */ + Orya, Zzzz, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, +/* DATA_BLOCK: -- 0x04F0..0x04FF -- */ + Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, +/* DATA_BLOCK: -- 0x0500..0x050F -- */ + Orya, Zzzz, Orya, Orya, Zzzz, Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Orya, Orya, +/* DATA_BLOCK: -- 0x0510..0x051F -- */ + Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Orya, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0520..0x052F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Orya, Orya, Orya, Zzzz, Zzzz, Zzzz, Zzzz, Orya, Orya, Zzzz, Orya, +/* DATA_BLOCK: -- 0x0530..0x053F -- */ + Orya, Orya, Orya, Orya, Zzzz, Zzzz, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, +/* DATA_BLOCK: -- 0x0540..0x054F -- */ + Orya, Orya, Orya, Orya, Orya, Orya, Orya, Orya, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0550..0x055F -- */ + Zzzz, Zzzz, Taml, Taml, Zzzz, Taml, Taml, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, +/* DATA_BLOCK: -- 0x0560..0x056F -- */ + Taml, Zzzz, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, Zzzz, Taml, Zzzz, Taml, Taml, +/* DATA_BLOCK: -- 0x0570..0x057F -- */ + Zzzz, Zzzz, Zzzz, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, +/* DATA_BLOCK: -- 0x0580..0x058F -- */ + Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Taml, Taml, +/* DATA_BLOCK: -- 0x0590..0x059F -- */ + Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Taml, Taml, Taml, Zzzz, Taml, Taml, Taml, Taml, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x05A0..0x05AF -- */ + Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x05B0..0x05BF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, +/* DATA_BLOCK: -- 0x05C0..0x05CF -- */ + Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x05D0..0x05DF -- */ + Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Zzzz, Telu, Telu, +/* DATA_BLOCK: -- 0x05E0..0x05EF -- */ + Telu, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, +/* DATA_BLOCK: -- 0x05F0..0x05FF -- */ + Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, +/* DATA_BLOCK: -- 0x0600..0x060F -- */ + Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Zzzz, Zzzz, Zzzz, Telu, Telu, Telu, +/* DATA_BLOCK: -- 0x0610..0x061F -- */ + Telu, Telu, Telu, Telu, Telu, Zzzz, Telu, Telu, Telu, Zzzz, Telu, Telu, Telu, Telu, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0620..0x062F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Telu, Telu, Zzzz, Telu, Telu, Telu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0630..0x063F -- */ + Telu, Telu, Telu, Telu, Zzzz, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, +/* DATA_BLOCK: -- 0x0640..0x064F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, Telu, +/* DATA_BLOCK: -- 0x0650..0x065F -- */ + Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, +/* DATA_BLOCK: -- 0x0660..0x066F -- */ + Knda, Zzzz, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, +/* DATA_BLOCK: -- 0x0670..0x067F -- */ + Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Knda, Knda, Knda, +/* DATA_BLOCK: -- 0x0680..0x068F -- */ + Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Knda, Knda, Zzzz, Zzzz, Knda, Knda, Knda, Knda, +/* DATA_BLOCK: -- 0x0690..0x069F -- */ + Knda, Knda, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Zzzz, Knda, Knda, Knda, Knda, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x06A0..0x06AF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Knda, Knda, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Knda, Zzzz, +/* DATA_BLOCK: -- 0x06B0..0x06BF -- */ + Knda, Knda, Knda, Knda, Zzzz, Zzzz, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, Knda, +/* DATA_BLOCK: -- 0x06C0..0x06CF -- */ + Zzzz, Knda, Knda, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x06D0..0x06DF -- */ + Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Zzzz, Mlym, Mlym, +/* DATA_BLOCK: -- 0x06E0..0x06EF -- */ + Mlym, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, +/* DATA_BLOCK: -- 0x06F0..0x06FF -- */ + Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, +/* DATA_BLOCK: -- 0x0700..0x070F -- */ + Mlym, Mlym, Mlym, Mlym, Mlym, Zzzz, Mlym, Mlym, Mlym, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, +/* DATA_BLOCK: -- 0x0710..0x071F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, +/* DATA_BLOCK: -- 0x0720..0x072F -- */ + Mlym, Mlym, Mlym, Mlym, Zzzz, Zzzz, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, Mlym, +/* DATA_BLOCK: -- 0x0730..0x073F -- */ + Zzzz, Sinh, Sinh, Sinh, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, +/* DATA_BLOCK: -- 0x0740..0x074F -- */ + Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, +/* DATA_BLOCK: -- 0x0750..0x075F -- */ + Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, +/* DATA_BLOCK: -- 0x0760..0x076F -- */ + Sinh, Sinh, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Sinh, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0770..0x077F -- */ + Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Sinh, Zzzz, Zzzz, Zzzz, Zzzz, Sinh, +/* DATA_BLOCK: -- 0x0780..0x078F -- */ + Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Sinh, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, +/* DATA_BLOCK: -- 0x0790..0x079F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, +/* DATA_BLOCK: -- 0x07A0..0x07AF -- */ + Zzzz, Zzzz, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x07B0..0x07BF -- */ + Zzzz, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, +/* DATA_BLOCK: -- 0x07C0..0x07CF -- */ + Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, +/* DATA_BLOCK: -- 0x07D0..0x07DF -- */ + Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, +/* DATA_BLOCK: -- 0x07E0..0x07EF -- */ + Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Thai, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x07F0..0x07FF -- */ + Zzzz, Laoo, Laoo, Zzzz, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, +/* DATA_BLOCK: -- 0x0800..0x080F -- */ + Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, +/* DATA_BLOCK: -- 0x0810..0x081F -- */ + Laoo, Laoo, Laoo, Laoo, Zzzz, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, +/* DATA_BLOCK: -- 0x0820..0x082F -- */ + Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0830..0x083F -- */ + Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Laoo, Zzzz, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0840..0x084F -- */ + Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Laoo, Zzzz, Zzzz, Laoo, Laoo, Laoo, Laoo, +/* DATA_BLOCK: -- 0x0850..0x085F -- */ + Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, +/* DATA_BLOCK: -- 0x0860..0x086F -- */ + Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Zzzz, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, +/* DATA_BLOCK: -- 0x0870..0x087F -- */ + Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0880..0x088F -- */ + Zzzz, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, +/* DATA_BLOCK: -- 0x0890..0x089F -- */ + Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Tibt, Zzzz, Tibt, Tibt, +/* DATA_BLOCK: -- 0x08A0..0x08AF -- */ + Tibt, Tibt, Tibt, Tibt, Tibt, Zyyy, Zyyy, Zyyy, Zyyy, Tibt, Tibt, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x08B0..0x08BF -- */ + Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, +/* DATA_BLOCK: -- 0x08C0..0x08CF -- */ + Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, +/* DATA_BLOCK: -- 0x08D0..0x08DF -- */ + Geor, Geor, Geor, Geor, Geor, Geor, Zzzz, Geor, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Geor, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x08E0..0x08EF -- */ + Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Zyyy, Geor, Geor, Geor, Geor, +/* DATA_BLOCK: -- 0x08F0..0x08FF -- */ + Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, +/* DATA_BLOCK: -- 0x0900..0x090F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, +/* DATA_BLOCK: -- 0x0910..0x091F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0920..0x092F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0930..0x093F -- */ + Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, +/* DATA_BLOCK: -- 0x0940..0x094F -- */ + Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, +/* DATA_BLOCK: -- 0x0950..0x095F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, +/* DATA_BLOCK: -- 0x0960..0x096F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, +/* DATA_BLOCK: -- 0x0970..0x097F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0980..0x098F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0990..0x099F -- */ + Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, Cher, +/* DATA_BLOCK: -- 0x09A0..0x09AF -- */ + Cher, Cher, Cher, Cher, Cher, Cher, Zzzz, Zzzz, Cher, Cher, Cher, Cher, Cher, Cher, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x09B0..0x09BF -- */ + Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, Cans, +/* DATA_BLOCK: -- 0x09C0..0x09CF -- */ + Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, +/* DATA_BLOCK: -- 0x09D0..0x09DF -- */ + Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Ogam, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x09E0..0x09EF -- */ + Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, +/* DATA_BLOCK: -- 0x09F0..0x09FF -- */ + Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Zyyy, Zyyy, Zyyy, Runr, Runr, +/* DATA_BLOCK: -- 0x0A00..0x0A0F -- */ + Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Runr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0A10..0x0A1F -- */ + Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Tglg, Zzzz, Tglg, Tglg, +/* DATA_BLOCK: -- 0x0A20..0x0A2F -- */ + Tglg, Tglg, Tglg, Tglg, Tglg, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0A30..0x0A3F -- */ + Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, Hano, +/* DATA_BLOCK: -- 0x0A40..0x0A4F -- */ + Hano, Hano, Hano, Hano, Hano, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0A50..0x0A5F -- */ + Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, Buhd, +/* DATA_BLOCK: -- 0x0A60..0x0A6F -- */ + Buhd, Buhd, Buhd, Buhd, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0A70..0x0A7F -- */ + Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Tagb, Zzzz, Tagb, Tagb, +/* DATA_BLOCK: -- 0x0A80..0x0A8F -- */ + Tagb, Zzzz, Tagb, Tagb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0A90..0x0A9F -- */ + Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, +/* DATA_BLOCK: -- 0x0AA0..0x0AAF -- */ + Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0AB0..0x0ABF -- */ + Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Khmr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0AC0..0x0ACF -- */ + Mong, Mong, Zyyy, Zyyy, Mong, Zyyy, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, +/* DATA_BLOCK: -- 0x0AD0..0x0ADF -- */ + Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0AE0..0x0AEF -- */ + Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, +/* DATA_BLOCK: -- 0x0AF0..0x0AFF -- */ + Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0B00..0x0B0F -- */ + Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0B10..0x0B1F -- */ + Cans, Cans, Cans, Cans, Cans, Cans, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0B20..0x0B2F -- */ + Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, +/* DATA_BLOCK: -- 0x0B30..0x0B3F -- */ + Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Zzzz, +/* DATA_BLOCK: -- 0x0B40..0x0B4F -- */ + Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0B50..0x0B5F -- */ + Limb, Zzzz, Zzzz, Zzzz, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, Limb, +/* DATA_BLOCK: -- 0x0B60..0x0B6F -- */ + Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, +/* DATA_BLOCK: -- 0x0B70..0x0B7F -- */ + Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Tale, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0B80..0x0B8F -- */ + Tale, Tale, Tale, Tale, Tale, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0B90..0x0B9F -- */ + Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, +/* DATA_BLOCK: -- 0x0BA0..0x0BAF -- */ + Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0BB0..0x0BBF -- */ + Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0BC0..0x0BCF -- */ + Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Talu, Zzzz, Zzzz, Zzzz, Talu, Talu, +/* DATA_BLOCK: -- 0x0BD0..0x0BDF -- */ + Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, +/* DATA_BLOCK: -- 0x0BE0..0x0BEF -- */ + Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Bugi, Zzzz, Zzzz, Bugi, Bugi, +/* DATA_BLOCK: -- 0x0BF0..0x0BFF -- */ + Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, +/* DATA_BLOCK: -- 0x0C00..0x0C0F -- */ + Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, +/* DATA_BLOCK: -- 0x0C10..0x0C1F -- */ + Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, Zzzz, Lana, +/* DATA_BLOCK: -- 0x0C20..0x0C2F -- */ + Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0C30..0x0C3F -- */ + Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Lana, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0C40..0x0C4F -- */ + Zinh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0C50..0x0C5F -- */ + Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, +/* DATA_BLOCK: -- 0x0C60..0x0C6F -- */ + Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0C70..0x0C7F -- */ + Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Bali, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0C80..0x0C8F -- */ + Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, +/* DATA_BLOCK: -- 0x0C90..0x0C9F -- */ + Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, Batk, +/* DATA_BLOCK: -- 0x0CA0..0x0CAF -- */ + Batk, Batk, Batk, Batk, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Batk, Batk, Batk, Batk, +/* DATA_BLOCK: -- 0x0CB0..0x0CBF -- */ + Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, +/* DATA_BLOCK: -- 0x0CC0..0x0CCF -- */ + Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Zzzz, Zzzz, Zzzz, Lepc, Lepc, Lepc, Lepc, Lepc, +/* DATA_BLOCK: -- 0x0CD0..0x0CDF -- */ + Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Lepc, Zzzz, Zzzz, Zzzz, Lepc, Lepc, Lepc, +/* DATA_BLOCK: -- 0x0CE0..0x0CEF -- */ + Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, Olck, +/* DATA_BLOCK: -- 0x0CF0..0x0CFF -- */ + Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Cyrl, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0D00..0x0D0F -- */ + Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Geor, Zzzz, Zzzz, Geor, Geor, Geor, +/* DATA_BLOCK: -- 0x0D10..0x0D1F -- */ + Sund, Sund, Sund, Sund, Sund, Sund, Sund, Sund, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0D20..0x0D2F -- */ + Zinh, Zinh, Zinh, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, +/* DATA_BLOCK: -- 0x0D30..0x0D3F -- */ + Zinh, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0D40..0x0D4F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0D50..0x0D5F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Grek, Grek, Grek, Grek, Grek, Cyrl, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x0D60..0x0D6F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Grek, Grek, Grek, +/* DATA_BLOCK: -- 0x0D70..0x0D7F -- */ + Grek, Grek, Latn, Latn, Latn, Latn, Grek, Grek, Grek, Grek, Grek, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x0D80..0x0D8F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Cyrl, Latn, Latn, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x0D90..0x0D9F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Grek, +/* DATA_BLOCK: -- 0x0DA0..0x0DAF -- */ + Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zzzz, Zinh, Zinh, Zinh, Zinh, Zinh, +/* DATA_BLOCK: -- 0x0DB0..0x0DBF -- */ + Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0DC0..0x0DCF -- */ + Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Grek, Zzzz, Grek, Zzzz, Grek, Zzzz, Grek, +/* DATA_BLOCK: -- 0x0DD0..0x0DDF -- */ + Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0DE0..0x0DEF -- */ + Grek, Grek, Grek, Grek, Grek, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, +/* DATA_BLOCK: -- 0x0DF0..0x0DFF -- */ + Grek, Grek, Grek, Grek, Zzzz, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Grek, Grek, Grek, +/* DATA_BLOCK: -- 0x0E00..0x0E0F -- */ + Zzzz, Zzzz, Grek, Grek, Grek, Zzzz, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, +/* DATA_BLOCK: -- 0x0E10..0x0E1F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0E20..0x0E2F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0E30..0x0E3F -- */ + Zyyy, Latn, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Latn, +/* DATA_BLOCK: -- 0x0E40..0x0E4F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, +/* DATA_BLOCK: -- 0x0E50..0x0E5F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0E60..0x0E6F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Grek, Zyyy, Zyyy, Zyyy, Latn, Latn, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0E70..0x0E7F -- */ + Zyyy, Zyyy, Latn, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0E80..0x0E8F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Latn, Zyyy, +/* DATA_BLOCK: -- 0x0E90..0x0E9F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0EA0..0x0EAF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0EB0..0x0EBF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0EC0..0x0ECF -- */ + Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, Brai, +/* DATA_BLOCK: -- 0x0ED0..0x0EDF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0EE0..0x0EEF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0EF0..0x0EFF -- */ + Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, +/* DATA_BLOCK: -- 0x0F00..0x0F0F -- */ + Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Zzzz, +/* DATA_BLOCK: -- 0x0F10..0x0F1F -- */ + Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, Copt, +/* DATA_BLOCK: -- 0x0F20..0x0F2F -- */ + Copt, Copt, Copt, Copt, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Copt, Copt, Copt, Copt, Copt, Copt, Copt, +/* DATA_BLOCK: -- 0x0F30..0x0F3F -- */ + Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, +/* DATA_BLOCK: -- 0x0F40..0x0F4F -- */ + Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Tfng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Tfng, +/* DATA_BLOCK: -- 0x0F50..0x0F5F -- */ + Tfng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Tfng, +/* DATA_BLOCK: -- 0x0F60..0x0F6F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0F70..0x0F7F -- */ + Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, +/* DATA_BLOCK: -- 0x0F80..0x0F8F -- */ + Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0F90..0x0F9F -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, +/* DATA_BLOCK: -- 0x0FA0..0x0FAF -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Hani, Hani, Hani, Hani, Hani, +/* DATA_BLOCK: -- 0x0FB0..0x0FBF -- */ + Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0FC0..0x0FCF -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0FD0..0x0FDF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x0FE0..0x0FEF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Hani, Zyyy, Hani, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x0FF0..0x0FFF -- */ + Zyyy, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zinh, Zinh, Zinh, Zinh, Hang, Hang, +/* DATA_BLOCK: -- 0x1000..0x100F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Hani, Hani, Hani, Hani, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x1010..0x101F -- */ + Zzzz, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, +/* DATA_BLOCK: -- 0x1020..0x102F -- */ + Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, +/* DATA_BLOCK: -- 0x1030..0x103F -- */ + Hira, Hira, Hira, Hira, Hira, Hira, Hira, Zzzz, Zzzz, Zinh, Zinh, Zyyy, Zyyy, Hira, Hira, Hira, +/* DATA_BLOCK: -- 0x1040..0x104F -- */ + Zyyy, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, +/* DATA_BLOCK: -- 0x1050..0x105F -- */ + Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, +/* DATA_BLOCK: -- 0x1060..0x106F -- */ + Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, Zyyy, Kana, Kana, Kana, +/* DATA_BLOCK: -- 0x1070..0x107F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, +/* DATA_BLOCK: -- 0x1080..0x108F -- */ + Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, Bopo, +/* DATA_BLOCK: -- 0x1090..0x109F -- */ + Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, +/* DATA_BLOCK: -- 0x10A0..0x10AF -- */ + Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, +/* DATA_BLOCK: -- 0x10B0..0x10BF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x10C0..0x10CF -- */ + Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zyyy, +/* DATA_BLOCK: -- 0x10D0..0x10DF -- */ + Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, +/* DATA_BLOCK: -- 0x10E0..0x10EF -- */ + Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x10F0..0x10FF -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1100..0x110F -- */ + Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, +/* DATA_BLOCK: -- 0x1110..0x111F -- */ + Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1120..0x112F -- */ + Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Yiii, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1130..0x113F -- */ + Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, Lisu, +/* DATA_BLOCK: -- 0x1140..0x114F -- */ + Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, +/* DATA_BLOCK: -- 0x1150..0x115F -- */ + Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Vaii, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1160..0x116F -- */ + Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, +/* DATA_BLOCK: -- 0x1170..0x117F -- */ + Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1180..0x118F -- */ + Zyyy, Zyyy, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x1190..0x119F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zyyy, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x11A0..0x11AF -- */ + Zzzz, Zzzz, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x11B0..0x11BF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x11C0..0x11CF -- */ + Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, +/* DATA_BLOCK: -- 0x11D0..0x11DF -- */ + Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Sylo, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x11E0..0x11EF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x11F0..0x11FF -- */ + Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, +/* DATA_BLOCK: -- 0x1200..0x120F -- */ + Phag, Phag, Phag, Phag, Phag, Phag, Phag, Phag, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1210..0x121F -- */ + Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, +/* DATA_BLOCK: -- 0x1220..0x122F -- */ + Saur, Saur, Saur, Saur, Saur, Saur, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Saur, Saur, +/* DATA_BLOCK: -- 0x1230..0x123F -- */ + Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Saur, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1240..0x124F -- */ + Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, +/* DATA_BLOCK: -- 0x1250..0x125F -- */ + Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Kali, Zyyy, Kali, +/* DATA_BLOCK: -- 0x1260..0x126F -- */ + Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, Rjng, +/* DATA_BLOCK: -- 0x1270..0x127F -- */ + Rjng, Rjng, Rjng, Rjng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Rjng, +/* DATA_BLOCK: -- 0x1280..0x128F -- */ + Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1290..0x129F -- */ + Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, +/* DATA_BLOCK: -- 0x12A0..0x12AF -- */ + Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Zzzz, Zyyy, +/* DATA_BLOCK: -- 0x12B0..0x12BF -- */ + Java, Java, Java, Java, Java, Java, Java, Java, Java, Java, Zzzz, Zzzz, Zzzz, Zzzz, Java, Java, +/* DATA_BLOCK: -- 0x12C0..0x12CF -- */ + Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Mymr, Zzzz, +/* DATA_BLOCK: -- 0x12D0..0x12DF -- */ + Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, +/* DATA_BLOCK: -- 0x12E0..0x12EF -- */ + Cham, Cham, Cham, Cham, Cham, Cham, Cham, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x12F0..0x12FF -- */ + Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1300..0x130F -- */ + Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Cham, Zzzz, Zzzz, Cham, Cham, Cham, Cham, +/* DATA_BLOCK: -- 0x1310..0x131F -- */ + Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, Tavt, +/* DATA_BLOCK: -- 0x1320..0x132F -- */ + Tavt, Tavt, Tavt, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1330..0x133F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Tavt, Tavt, Tavt, Tavt, Tavt, +/* DATA_BLOCK: -- 0x1340..0x134F -- */ + Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, +/* DATA_BLOCK: -- 0x1350..0x135F -- */ + Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1360..0x136F -- */ + Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, +/* DATA_BLOCK: -- 0x1370..0x137F -- */ + Zzzz, Ethi, Ethi, Ethi, Ethi, Ethi, Ethi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1380..0x138F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zyyy, Latn, Latn, Latn, Latn, +/* DATA_BLOCK: -- 0x1390..0x139F -- */ + Latn, Latn, Latn, Latn, Latn, Grek, Latn, Latn, Latn, Latn, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x13A0..0x13AF -- */ + Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x13B0..0x13BF -- */ + Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Mtei, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x13C0..0x13CF -- */ + Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x13D0..0x13DF -- */ + Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, +/* DATA_BLOCK: -- 0x13E0..0x13EF -- */ + Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x13F0..0x13FF -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1400..0x140F -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1410..0x141F -- */ + Latn, Latn, Latn, Latn, Latn, Latn, Latn, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1420..0x142F -- */ + Zzzz, Zzzz, Zzzz, Armn, Armn, Armn, Armn, Armn, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hebr, Hebr, Hebr, +/* DATA_BLOCK: -- 0x1430..0x143F -- */ + Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Hebr, Hebr, Hebr, Hebr, Hebr, Zzzz, Hebr, Zzzz, +/* DATA_BLOCK: -- 0x1440..0x144F -- */ + Hebr, Hebr, Zzzz, Hebr, Hebr, Zzzz, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, Hebr, +/* DATA_BLOCK: -- 0x1450..0x145F -- */ + Arab, Arab, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1460..0x146F -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x1470..0x147F -- */ + Zzzz, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x1480..0x148F -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1490..0x149F -- */ + Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Cyrl, Cyrl, +/* DATA_BLOCK: -- 0x14A0..0x14AF -- */ + Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x14B0..0x14BF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x14C0..0x14CF -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, Zyyy, +/* DATA_BLOCK: -- 0x14D0..0x14DF -- */ + Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x14E0..0x14EF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, +/* DATA_BLOCK: -- 0x14F0..0x14FF -- */ + Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Kana, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x1500..0x150F -- */ + Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, +/* DATA_BLOCK: -- 0x1510..0x151F -- */ + Zzzz, Zzzz, Hang, Hang, Hang, Hang, Hang, Hang, Zzzz, Zzzz, Hang, Hang, Hang, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1520..0x152F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, +/* DATA_BLOCK: -- 0x1530..0x153F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1540..0x154F -- */ + Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Linb, Linb, Linb, +/* DATA_BLOCK: -- 0x1550..0x155F -- */ + Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, +/* DATA_BLOCK: -- 0x1560..0x156F -- */ + Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, +/* DATA_BLOCK: -- 0x1570..0x157F -- */ + Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Linb, Linb, Zzzz, Linb, +/* DATA_BLOCK: -- 0x1580..0x158F -- */ + Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1590..0x159F -- */ + Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Linb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x15A0..0x15AF -- */ + Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x15B0..0x15BF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x15C0..0x15CF -- */ + Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, +/* DATA_BLOCK: -- 0x15D0..0x15DF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x15E0..0x15EF -- */ + Grek, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x15F0..0x15FF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1600..0x160F -- */ + Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, +/* DATA_BLOCK: -- 0x1610..0x161F -- */ + Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Lyci, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1620..0x162F -- */ + Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, Cari, +/* DATA_BLOCK: -- 0x1630..0x163F -- */ + Cari, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1640..0x164F -- */ + Zinh, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x1650..0x165F -- */ + Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, Ital, +/* DATA_BLOCK: -- 0x1660..0x166F -- */ + Ital, Ital, Ital, Ital, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Ital, Ital, Ital, +/* DATA_BLOCK: -- 0x1670..0x167F -- */ + Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, +/* DATA_BLOCK: -- 0x1680..0x168F -- */ + Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Goth, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1690..0x169F -- */ + Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, +/* DATA_BLOCK: -- 0x16A0..0x16AF -- */ + Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Perm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x16B0..0x16BF -- */ + Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, +/* DATA_BLOCK: -- 0x16C0..0x16CF -- */ + Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Ugar, Zzzz, Ugar, +/* DATA_BLOCK: -- 0x16D0..0x16DF -- */ + Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, +/* DATA_BLOCK: -- 0x16E0..0x16EF -- */ + Xpeo, Xpeo, Xpeo, Xpeo, Zzzz, Zzzz, Zzzz, Zzzz, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, +/* DATA_BLOCK: -- 0x16F0..0x16FF -- */ + Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Xpeo, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1700..0x170F -- */ + Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, Dsrt, +/* DATA_BLOCK: -- 0x1710..0x171F -- */ + Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, Shaw, +/* DATA_BLOCK: -- 0x1720..0x172F -- */ + Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, +/* DATA_BLOCK: -- 0x1730..0x173F -- */ + Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1740..0x174F -- */ + Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Osma, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1750..0x175F -- */ + Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, +/* DATA_BLOCK: -- 0x1760..0x176F -- */ + Osge, Osge, Osge, Osge, Zzzz, Zzzz, Zzzz, Zzzz, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, +/* DATA_BLOCK: -- 0x1770..0x177F -- */ + Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Osge, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1780..0x178F -- */ + Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, +/* DATA_BLOCK: -- 0x1790..0x179F -- */ + Elba, Elba, Elba, Elba, Elba, Elba, Elba, Elba, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x17A0..0x17AF -- */ + Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, Aghb, +/* DATA_BLOCK: -- 0x17B0..0x17BF -- */ + Aghb, Aghb, Aghb, Aghb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Aghb, +/* DATA_BLOCK: -- 0x17C0..0x17CF -- */ + Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, +/* DATA_BLOCK: -- 0x17D0..0x17DF -- */ + Lina, Lina, Lina, Lina, Lina, Lina, Lina, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x17E0..0x17EF -- */ + Lina, Lina, Lina, Lina, Lina, Lina, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x17F0..0x17FF -- */ + Lina, Lina, Lina, Lina, Lina, Lina, Lina, Lina, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1800..0x180F -- */ + Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Zzzz, Zzzz, Cprt, Zzzz, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, +/* DATA_BLOCK: -- 0x1810..0x181F -- */ + Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, +/* DATA_BLOCK: -- 0x1820..0x182F -- */ + Cprt, Cprt, Cprt, Cprt, Cprt, Cprt, Zzzz, Cprt, Cprt, Zzzz, Zzzz, Zzzz, Cprt, Zzzz, Zzzz, Cprt, +/* DATA_BLOCK: -- 0x1830..0x183F -- */ + Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, +/* DATA_BLOCK: -- 0x1840..0x184F -- */ + Armi, Armi, Armi, Armi, Armi, Armi, Zzzz, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, Armi, +/* DATA_BLOCK: -- 0x1850..0x185F -- */ + Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, Palm, +/* DATA_BLOCK: -- 0x1860..0x186F -- */ + Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, +/* DATA_BLOCK: -- 0x1870..0x187F -- */ + Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Zzzz, +/* DATA_BLOCK: -- 0x1880..0x188F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, Nbat, +/* DATA_BLOCK: -- 0x1890..0x189F -- */ + Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, Hatr, +/* DATA_BLOCK: -- 0x18A0..0x18AF -- */ + Hatr, Hatr, Hatr, Zzzz, Hatr, Hatr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hatr, Hatr, Hatr, Hatr, Hatr, +/* DATA_BLOCK: -- 0x18B0..0x18BF -- */ + Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, +/* DATA_BLOCK: -- 0x18C0..0x18CF -- */ + Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Phnx, Zzzz, Zzzz, Zzzz, Phnx, +/* DATA_BLOCK: -- 0x18D0..0x18DF -- */ + Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, +/* DATA_BLOCK: -- 0x18E0..0x18EF -- */ + Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Lydi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Lydi, +/* DATA_BLOCK: -- 0x18F0..0x18FF -- */ + Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, Mero, +/* DATA_BLOCK: -- 0x1900..0x190F -- */ + Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, +/* DATA_BLOCK: -- 0x1910..0x191F -- */ + Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Zzzz, Zzzz, Zzzz, Zzzz, Merc, Merc, Merc, Merc, +/* DATA_BLOCK: -- 0x1920..0x192F -- */ + Zzzz, Zzzz, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, Merc, +/* DATA_BLOCK: -- 0x1930..0x193F -- */ + Khar, Khar, Khar, Khar, Zzzz, Khar, Khar, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Khar, Khar, Khar, Khar, +/* DATA_BLOCK: -- 0x1940..0x194F -- */ + Khar, Khar, Khar, Khar, Zzzz, Khar, Khar, Khar, Zzzz, Khar, Khar, Khar, Khar, Khar, Khar, Khar, +/* DATA_BLOCK: -- 0x1950..0x195F -- */ + Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, +/* DATA_BLOCK: -- 0x1960..0x196F -- */ + Khar, Khar, Khar, Khar, Khar, Khar, Zzzz, Zzzz, Khar, Khar, Khar, Zzzz, Zzzz, Zzzz, Zzzz, Khar, +/* DATA_BLOCK: -- 0x1970..0x197F -- */ + Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Khar, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1980..0x198F -- */ + Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, Sarb, +/* DATA_BLOCK: -- 0x1990..0x199F -- */ + Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, Narb, +/* DATA_BLOCK: -- 0x19A0..0x19AF -- */ + Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, Mani, +/* DATA_BLOCK: -- 0x19B0..0x19BF -- */ + Mani, Mani, Mani, Mani, Mani, Mani, Mani, Zzzz, Zzzz, Zzzz, Zzzz, Mani, Mani, Mani, Mani, Mani, +/* DATA_BLOCK: -- 0x19C0..0x19CF -- */ + Mani, Mani, Mani, Mani, Mani, Mani, Mani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x19D0..0x19DF -- */ + Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, Avst, +/* DATA_BLOCK: -- 0x19E0..0x19EF -- */ + Avst, Avst, Avst, Avst, Avst, Avst, Zzzz, Zzzz, Zzzz, Avst, Avst, Avst, Avst, Avst, Avst, Avst, +/* DATA_BLOCK: -- 0x19F0..0x19FF -- */ + Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, +/* DATA_BLOCK: -- 0x1A00..0x1A0F -- */ + Prti, Prti, Prti, Prti, Prti, Prti, Zzzz, Zzzz, Prti, Prti, Prti, Prti, Prti, Prti, Prti, Prti, +/* DATA_BLOCK: -- 0x1A10..0x1A1F -- */ + Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, +/* DATA_BLOCK: -- 0x1A20..0x1A2F -- */ + Phli, Phli, Phli, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Phli, Phli, Phli, Phli, Phli, Phli, Phli, Phli, +/* DATA_BLOCK: -- 0x1A30..0x1A3F -- */ + Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, +/* DATA_BLOCK: -- 0x1A40..0x1A4F -- */ + Phlp, Phlp, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Phlp, Phlp, Phlp, Phlp, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1A50..0x1A5F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, Phlp, +/* DATA_BLOCK: -- 0x1A60..0x1A6F -- */ + Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, +/* DATA_BLOCK: -- 0x1A70..0x1A7F -- */ + Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Orkh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1A80..0x1A8F -- */ + Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, Hung, +/* DATA_BLOCK: -- 0x1A90..0x1A9F -- */ + Hung, Hung, Hung, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1AA0..0x1AAF -- */ + Hung, Hung, Hung, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hung, Hung, Hung, Hung, Hung, Hung, +/* DATA_BLOCK: -- 0x1AB0..0x1ABF -- */ + Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, +/* DATA_BLOCK: -- 0x1AC0..0x1ACF -- */ + Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1AD0..0x1ADF -- */ + Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Rohg, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1AE0..0x1AEF -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, +/* DATA_BLOCK: -- 0x1AF0..0x1AFF -- */ + Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, +/* DATA_BLOCK: -- 0x1B00..0x1B0F -- */ + Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Yezi, Zzzz, Yezi, Yezi, Yezi, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1B10..0x1B1F -- */ + Yezi, Yezi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1B20..0x1B2F -- */ + Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, +/* DATA_BLOCK: -- 0x1B30..0x1B3F -- */ + Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Sogo, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1B40..0x1B4F -- */ + Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, +/* DATA_BLOCK: -- 0x1B50..0x1B5F -- */ + Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Sogd, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1B60..0x1B6F -- */ + Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, +/* DATA_BLOCK: -- 0x1B70..0x1B7F -- */ + Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Chrs, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1B80..0x1B8F -- */ + Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, Elym, +/* DATA_BLOCK: -- 0x1B90..0x1B9F -- */ + Elym, Elym, Elym, Elym, Elym, Elym, Elym, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1BA0..0x1BAF -- */ + Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, +/* DATA_BLOCK: -- 0x1BB0..0x1BBF -- */ + Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1BC0..0x1BCF -- */ + Zzzz, Zzzz, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, Brah, +/* DATA_BLOCK: -- 0x1BD0..0x1BDF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Brah, +/* DATA_BLOCK: -- 0x1BE0..0x1BEF -- */ + Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, Kthi, +/* DATA_BLOCK: -- 0x1BF0..0x1BFF -- */ + Kthi, Kthi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Kthi, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1C00..0x1C0F -- */ + Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, +/* DATA_BLOCK: -- 0x1C10..0x1C1F -- */ + Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1C20..0x1C2F -- */ + Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Sora, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1C30..0x1C3F -- */ + Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, +/* DATA_BLOCK: -- 0x1C40..0x1C4F -- */ + Cakm, Cakm, Cakm, Cakm, Cakm, Zzzz, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, +/* DATA_BLOCK: -- 0x1C50..0x1C5F -- */ + Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Cakm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1C60..0x1C6F -- */ + Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, +/* DATA_BLOCK: -- 0x1C70..0x1C7F -- */ + Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Mahj, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1C80..0x1C8F -- */ + Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, Shrd, +/* DATA_BLOCK: -- 0x1C90..0x1C9F -- */ + Zzzz, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, Sinh, +/* DATA_BLOCK: -- 0x1CA0..0x1CAF -- */ + Sinh, Sinh, Sinh, Sinh, Sinh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1CB0..0x1CBF -- */ + Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, +/* DATA_BLOCK: -- 0x1CC0..0x1CCF -- */ + Khoj, Khoj, Zzzz, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, +/* DATA_BLOCK: -- 0x1CD0..0x1CDF -- */ + Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Khoj, Zzzz, +/* DATA_BLOCK: -- 0x1CE0..0x1CEF -- */ + Mult, Mult, Mult, Mult, Mult, Mult, Mult, Zzzz, Mult, Zzzz, Mult, Mult, Mult, Mult, Zzzz, Mult, +/* DATA_BLOCK: -- 0x1CF0..0x1CFF -- */ + Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Zzzz, Mult, +/* DATA_BLOCK: -- 0x1D00..0x1D0F -- */ + Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Mult, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1D10..0x1D1F -- */ + Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, +/* DATA_BLOCK: -- 0x1D20..0x1D2F -- */ + Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1D30..0x1D3F -- */ + Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Sind, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1D40..0x1D4F -- */ + Gran, Gran, Gran, Gran, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Gran, +/* DATA_BLOCK: -- 0x1D50..0x1D5F -- */ + Gran, Zzzz, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, +/* DATA_BLOCK: -- 0x1D60..0x1D6F -- */ + Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, +/* DATA_BLOCK: -- 0x1D70..0x1D7F -- */ + Gran, Zzzz, Gran, Gran, Zzzz, Gran, Gran, Gran, Gran, Gran, Zzzz, Zinh, Gran, Gran, Gran, Gran, +/* DATA_BLOCK: -- 0x1D80..0x1D8F -- */ + Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Gran, Gran, Zzzz, Zzzz, Gran, Gran, Gran, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1D90..0x1D9F -- */ + Gran, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Gran, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Gran, Gran, Gran, +/* DATA_BLOCK: -- 0x1DA0..0x1DAF -- */ + Gran, Gran, Gran, Gran, Zzzz, Zzzz, Gran, Gran, Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1DB0..0x1DBF -- */ + Gran, Gran, Gran, Gran, Gran, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1DC0..0x1DCF -- */ + Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, +/* DATA_BLOCK: -- 0x1DD0..0x1DDF -- */ + Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Newa, Zzzz, Newa, Newa, Newa, +/* DATA_BLOCK: -- 0x1DE0..0x1DEF -- */ + Newa, Newa, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1DF0..0x1DFF -- */ + Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, +/* DATA_BLOCK: -- 0x1E00..0x1E0F -- */ + Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1E10..0x1E1F -- */ + Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Tirh, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1E20..0x1E2F -- */ + Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, +/* DATA_BLOCK: -- 0x1E30..0x1E3F -- */ + Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Zzzz, Zzzz, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, +/* DATA_BLOCK: -- 0x1E40..0x1E4F -- */ + Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Sidd, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1E50..0x1E5F -- */ + Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, +/* DATA_BLOCK: -- 0x1E60..0x1E6F -- */ + Modi, Modi, Modi, Modi, Modi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1E70..0x1E7F -- */ + Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Modi, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1E80..0x1E8F -- */ + Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Mong, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1E90..0x1E9F -- */ + Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, +/* DATA_BLOCK: -- 0x1EA0..0x1EAF -- */ + Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1EB0..0x1EBF -- */ + Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Takr, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1EC0..0x1ECF -- */ + Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, +/* DATA_BLOCK: -- 0x1ED0..0x1EDF -- */ + Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Zzzz, Zzzz, Ahom, Ahom, Ahom, +/* DATA_BLOCK: -- 0x1EE0..0x1EEF -- */ + Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Ahom, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1EF0..0x1EFF -- */ + Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, +/* DATA_BLOCK: -- 0x1F00..0x1F0F -- */ + Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Dogr, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1F10..0x1F1F -- */ + Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, Wara, +/* DATA_BLOCK: -- 0x1F20..0x1F2F -- */ + Wara, Wara, Wara, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Wara, +/* DATA_BLOCK: -- 0x1F30..0x1F3F -- */ + Diak, Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Zzzz, Diak, Zzzz, Zzzz, Diak, Diak, Diak, Diak, +/* DATA_BLOCK: -- 0x1F40..0x1F4F -- */ + Diak, Diak, Diak, Diak, Zzzz, Diak, Diak, Zzzz, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, +/* DATA_BLOCK: -- 0x1F50..0x1F5F -- */ + Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, +/* DATA_BLOCK: -- 0x1F60..0x1F6F -- */ + Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Diak, Diak, Zzzz, Zzzz, Diak, Diak, Diak, Diak, Diak, +/* DATA_BLOCK: -- 0x1F70..0x1F7F -- */ + Diak, Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1F80..0x1F8F -- */ + Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Diak, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1F90..0x1F9F -- */ + Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Zzzz, Zzzz, Nand, Nand, Nand, Nand, Nand, Nand, +/* DATA_BLOCK: -- 0x1FA0..0x1FAF -- */ + Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, Nand, +/* DATA_BLOCK: -- 0x1FB0..0x1FBF -- */ + Nand, Nand, Nand, Nand, Nand, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1FC0..0x1FCF -- */ + Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, +/* DATA_BLOCK: -- 0x1FD0..0x1FDF -- */ + Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zanb, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x1FE0..0x1FEF -- */ + Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, Soyo, +/* DATA_BLOCK: -- 0x1FF0..0x1FFF -- */ + Soyo, Soyo, Soyo, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2000..0x200F -- */ + Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, +/* DATA_BLOCK: -- 0x2010..0x201F -- */ + Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Pauc, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2020..0x202F -- */ + Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, +/* DATA_BLOCK: -- 0x2030..0x203F -- */ + Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, +/* DATA_BLOCK: -- 0x2040..0x204F -- */ + Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, +/* DATA_BLOCK: -- 0x2050..0x205F -- */ + Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2060..0x206F -- */ + Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Bhks, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2070..0x207F -- */ + Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, +/* DATA_BLOCK: -- 0x2080..0x208F -- */ + Zzzz, Zzzz, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, +/* DATA_BLOCK: -- 0x2090..0x209F -- */ + Marc, Marc, Marc, Marc, Marc, Marc, Marc, Marc, Zzzz, Marc, Marc, Marc, Marc, Marc, Marc, Marc, +/* DATA_BLOCK: -- 0x20A0..0x20AF -- */ + Marc, Marc, Marc, Marc, Marc, Marc, Marc, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x20B0..0x20BF -- */ + Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Gonm, Gonm, Zzzz, Gonm, Gonm, Gonm, Gonm, Gonm, +/* DATA_BLOCK: -- 0x20C0..0x20CF -- */ + Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, +/* DATA_BLOCK: -- 0x20D0..0x20DF -- */ + Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Zzzz, Zzzz, Gonm, Zzzz, Gonm, Gonm, Zzzz, Gonm, +/* DATA_BLOCK: -- 0x20E0..0x20EF -- */ + Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x20F0..0x20FF -- */ + Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Gonm, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2100..0x210F -- */ + Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, Gong, Gong, Zzzz, Gong, Gong, Gong, Gong, Gong, Gong, +/* DATA_BLOCK: -- 0x2110..0x211F -- */ + Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, +/* DATA_BLOCK: -- 0x2120..0x212F -- */ + Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, +/* DATA_BLOCK: -- 0x2130..0x213F -- */ + Gong, Gong, Zzzz, Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2140..0x214F -- */ + Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Gong, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2150..0x215F -- */ + Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, +/* DATA_BLOCK: -- 0x2160..0x216F -- */ + Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Maka, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2170..0x217F -- */ + Lisu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2180..0x218F -- */ + Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, Taml, +/* DATA_BLOCK: -- 0x2190..0x219F -- */ + Taml, Taml, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Taml, +/* DATA_BLOCK: -- 0x21A0..0x21AF -- */ + Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, +/* DATA_BLOCK: -- 0x21B0..0x21BF -- */ + Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x21C0..0x21CF -- */ + Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Xsux, Zzzz, +/* DATA_BLOCK: -- 0x21D0..0x21DF -- */ + Xsux, Xsux, Xsux, Xsux, Xsux, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x21E0..0x21EF -- */ + Xsux, Xsux, Xsux, Xsux, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x21F0..0x21FF -- */ + Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, +/* DATA_BLOCK: -- 0x2200..0x220F -- */ + Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Zzzz, +/* DATA_BLOCK: -- 0x2210..0x221F -- */ + Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Egyp, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2220..0x222F -- */ + Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, +/* DATA_BLOCK: -- 0x2230..0x223F -- */ + Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Hluw, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2240..0x224F -- */ + Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Bamu, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2250..0x225F -- */ + Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, +/* DATA_BLOCK: -- 0x2260..0x226F -- */ + Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Zzzz, +/* DATA_BLOCK: -- 0x2270..0x227F -- */ + Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Mroo, Zzzz, Zzzz, Zzzz, Zzzz, Mroo, Mroo, +/* DATA_BLOCK: -- 0x2280..0x228F -- */ + Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, +/* DATA_BLOCK: -- 0x2290..0x229F -- */ + Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Bass, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x22A0..0x22AF -- */ + Bass, Bass, Bass, Bass, Bass, Bass, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x22B0..0x22BF -- */ + Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, +/* DATA_BLOCK: -- 0x22C0..0x22CF -- */ + Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x22D0..0x22DF -- */ + Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Zzzz, Hmng, Hmng, Hmng, Hmng, Hmng, +/* DATA_BLOCK: -- 0x22E0..0x22EF -- */ + Hmng, Hmng, Zzzz, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, +/* DATA_BLOCK: -- 0x22F0..0x22FF -- */ + Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Hmng, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Hmng, Hmng, Hmng, +/* DATA_BLOCK: -- 0x2300..0x230F -- */ + Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, +/* DATA_BLOCK: -- 0x2310..0x231F -- */ + Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Medf, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2320..0x232F -- */ + Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, +/* DATA_BLOCK: -- 0x2330..0x233F -- */ + Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Zzzz, Zzzz, Zzzz, Zzzz, Plrd, +/* DATA_BLOCK: -- 0x2340..0x234F -- */ + Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Plrd, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Plrd, +/* DATA_BLOCK: -- 0x2350..0x235F -- */ + Tang, Nshu, Zyyy, Zyyy, Kits, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2360..0x236F -- */ + Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2370..0x237F -- */ + Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, +/* DATA_BLOCK: -- 0x2380..0x238F -- */ + Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2390..0x239F -- */ + Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, Kits, +/* DATA_BLOCK: -- 0x23A0..0x23AF -- */ + Kits, Kits, Kits, Kits, Kits, Kits, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x23B0..0x23BF -- */ + Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Tang, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x23C0..0x23CF -- */ + Kana, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, +/* DATA_BLOCK: -- 0x23D0..0x23DF -- */ + Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Hira, Zzzz, +/* DATA_BLOCK: -- 0x23E0..0x23EF -- */ + Hira, Hira, Hira, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x23F0..0x23FF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Kana, Kana, Kana, Kana, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2400..0x240F -- */ + Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, +/* DATA_BLOCK: -- 0x2410..0x241F -- */ + Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Nshu, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2420..0x242F -- */ + Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, +/* DATA_BLOCK: -- 0x2430..0x243F -- */ + Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2440..0x244F -- */ + Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2450..0x245F -- */ + Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2460..0x246F -- */ + Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Dupl, Zzzz, Zzzz, Dupl, Dupl, Dupl, Dupl, +/* DATA_BLOCK: -- 0x2470..0x247F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2480..0x248F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2490..0x249F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x24A0..0x24AF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, +/* DATA_BLOCK: -- 0x24B0..0x24BF -- */ + Zinh, Zinh, Zinh, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zinh, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x24C0..0x24CF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zinh, Zinh, Zinh, Zinh, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x24D0..0x24DF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x24E0..0x24EF -- */ + Grek, Grek, Grek, Grek, Grek, Grek, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x24F0..0x24FF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2500..0x250F -- */ + Zzzz, Zzzz, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2510..0x251F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2520..0x252F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2530..0x253F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2540..0x254F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2550..0x255F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, +/* DATA_BLOCK: -- 0x2560..0x256F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2570..0x257F -- */ + Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2580..0x258F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x2590..0x259F -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x25A0..0x25AF -- */ + Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, +/* DATA_BLOCK: -- 0x25B0..0x25BF -- */ + Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x25C0..0x25CF -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, +/* DATA_BLOCK: -- 0x25D0..0x25DF -- */ + Zzzz, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, Sgnw, +/* DATA_BLOCK: -- 0x25E0..0x25EF -- */ + Glag, Glag, Glag, Glag, Glag, Glag, Glag, Zzzz, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, +/* DATA_BLOCK: -- 0x25F0..0x25FF -- */ + Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Glag, Zzzz, Zzzz, Glag, Glag, Glag, Glag, Glag, +/* DATA_BLOCK: -- 0x2600..0x260F -- */ + Glag, Glag, Zzzz, Glag, Glag, Zzzz, Glag, Glag, Glag, Glag, Glag, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2610..0x261F -- */ + Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, +/* DATA_BLOCK: -- 0x2620..0x262F -- */ + Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2630..0x263F -- */ + Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2640..0x264F -- */ + Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Hmnp, Zzzz, Zzzz, Zzzz, Zzzz, Hmnp, Hmnp, +/* DATA_BLOCK: -- 0x2650..0x265F -- */ + Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, +/* DATA_BLOCK: -- 0x2660..0x266F -- */ + Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Wcho, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Wcho, +/* DATA_BLOCK: -- 0x2670..0x267F -- */ + Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, +/* DATA_BLOCK: -- 0x2680..0x268F -- */ + Mend, Mend, Mend, Mend, Mend, Zzzz, Zzzz, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, Mend, +/* DATA_BLOCK: -- 0x2690..0x269F -- */ + Mend, Mend, Mend, Mend, Mend, Mend, Mend, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x26A0..0x26AF -- */ + Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, +/* DATA_BLOCK: -- 0x26B0..0x26BF -- */ + Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x26C0..0x26CF -- */ + Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Adlm, Zzzz, Zzzz, Zzzz, Zzzz, Adlm, Adlm, +/* DATA_BLOCK: -- 0x26D0..0x26DF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x26E0..0x26EF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x26F0..0x26FF -- */ + Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x2700..0x270F -- */ + Zzzz, Arab, Arab, Zzzz, Arab, Zzzz, Zzzz, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x2710..0x271F -- */ + Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2720..0x272F -- */ + Zzzz, Zzzz, Arab, Zzzz, Zzzz, Zzzz, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x2730..0x273F -- */ + Zzzz, Arab, Arab, Zzzz, Arab, Zzzz, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, Zzzz, Arab, +/* DATA_BLOCK: -- 0x2740..0x274F -- */ + Zzzz, Arab, Arab, Zzzz, Arab, Zzzz, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x2750..0x275F -- */ + Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Zzzz, Arab, Zzzz, +/* DATA_BLOCK: -- 0x2760..0x276F -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x2770..0x277F -- */ + Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Arab, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2780..0x278F -- */ + Zzzz, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, Zzzz, Arab, Arab, Arab, Arab, Arab, +/* DATA_BLOCK: -- 0x2790..0x279F -- */ + Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x27A0..0x27AF -- */ + Hira, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x27B0..0x27BF -- */ + Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x27C0..0x27CF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x27D0..0x27DF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x27E0..0x27EF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zyyy, Zyyy, Zyyy, +/* DATA_BLOCK: -- 0x27F0..0x27FF -- */ + Zyyy, Zyyy, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zyyy, Zyyy, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2800..0x280F -- */ + Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2810..0x281F -- */ + Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2820..0x282F -- */ + Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Hani, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, +/* DATA_BLOCK: -- 0x2830..0x283F -- */ + Zzzz, Zyyy, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz, Zzzz +}; + +static const SBUInt16 MainScriptIndexes[3935] = { +/* INDEX_BLOCK: -- 0x0000..0x003F -- */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0020, 0x0010, 0x0020, 0x0000, 0x0000, 0x0030, 0x0030, + 0x0040, 0x0050, 0x0040, 0x0050, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0060, 0x0000, 0x0000, 0x0070, 0x0000, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0090, 0x00A0, 0x00B0, 0x00C0, 0x00B0, + 0x00B0, 0x00B0, 0x00D0, 0x00B0, +/* INDEX_BLOCK: -- 0x0040..0x007F -- */ + 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00F0, 0x00E0, 0x00E0, 0x00E0, + 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x0100, 0x0110, 0x0120, 0x0110, 0x0110, + 0x0130, 0x0140, 0x0150, 0x0150, 0x0160, 0x0150, 0x0170, 0x0180, 0x0190, 0x01A0, 0x01B0, 0x01B0, + 0x01C0, 0x01D0, 0x01B0, 0x01E0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01F0, 0x01B0, 0x01B0, + 0x0200, 0x0210, 0x0210, 0x0210, 0x0220, 0x01B0, 0x01B0, 0x01B0, 0x0230, 0x0230, 0x0230, 0x0240, + 0x0250, 0x0250, 0x0250, 0x0260, +/* INDEX_BLOCK: -- 0x0080..0x00BF -- */ + 0x0270, 0x0270, 0x0280, 0x0290, 0x02A0, 0x02B0, 0x02C0, 0x02D0, 0x02D0, 0x02D0, 0x01B0, 0x02E0, + 0x02F0, 0x0300, 0x0310, 0x01B0, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0330, 0x0340, 0x0320, + 0x0350, 0x0360, 0x0370, 0x0380, 0x0390, 0x03A0, 0x03B0, 0x03C0, 0x03D0, 0x03E0, 0x03F0, 0x0400, + 0x0410, 0x0420, 0x0430, 0x0440, 0x0450, 0x0460, 0x0470, 0x0480, 0x0490, 0x04A0, 0x04B0, 0x04C0, + 0x04D0, 0x04E0, 0x04F0, 0x0500, 0x0510, 0x0520, 0x0530, 0x0540, 0x0550, 0x0560, 0x0570, 0x0580, + 0x0590, 0x05A0, 0x05B0, 0x05C0, +/* INDEX_BLOCK: -- 0x00C0..0x00FF -- */ + 0x05D0, 0x05E0, 0x05F0, 0x0600, 0x0610, 0x0620, 0x0630, 0x0640, 0x0650, 0x0660, 0x0670, 0x0680, + 0x0690, 0x06A0, 0x06B0, 0x06C0, 0x06D0, 0x06E0, 0x06F0, 0x06F0, 0x0700, 0x0710, 0x0720, 0x06F0, + 0x0730, 0x0740, 0x0750, 0x0760, 0x0770, 0x0780, 0x0790, 0x07A0, 0x07B0, 0x07C0, 0x07C0, 0x07D0, + 0x07C0, 0x07E0, 0x02D0, 0x02D0, 0x07F0, 0x0800, 0x0810, 0x0820, 0x0830, 0x0840, 0x02D0, 0x02D0, + 0x0850, 0x0850, 0x0850, 0x0850, 0x0860, 0x0850, 0x0870, 0x0880, 0x0850, 0x0860, 0x0850, 0x0890, + 0x0890, 0x08A0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0100..0x013F -- */ + 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08B0, 0x08C0, 0x08C0, + 0x08D0, 0x08C0, 0x08C0, 0x08E0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x0900, 0x0900, 0x0900, 0x0900, + 0x0910, 0x0920, 0x0900, 0x0900, 0x0910, 0x0900, 0x0900, 0x0930, 0x0940, 0x0950, 0x0900, 0x0900, + 0x0900, 0x0940, 0x0900, 0x0900, 0x0900, 0x0960, 0x0900, 0x0970, 0x0900, 0x0980, 0x0990, 0x0990, + 0x0990, 0x0990, 0x0990, 0x09A0, +/* INDEX_BLOCK: -- 0x0140..0x017F -- */ + 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, + 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, + 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09B0, + 0x09B0, 0x09B0, 0x09B0, 0x09B0, 0x09C0, 0x09D0, 0x09E0, 0x09E0, 0x09E0, 0x09E0, 0x09F0, 0x0A00, + 0x0A10, 0x0A20, 0x0A30, 0x0A40, 0x0A50, 0x0A60, 0x0A70, 0x0A80, 0x0A90, 0x0A90, 0x0A90, 0x0A90, + 0x0A90, 0x0AA0, 0x0AB0, 0x0AB0, +/* INDEX_BLOCK: -- 0x0180..0x01BF -- */ + 0x0AC0, 0x0AD0, 0x0AE0, 0x0AE0, 0x0AE0, 0x0AE0, 0x0AE0, 0x0AF0, 0x0AE0, 0x0AE0, 0x0B00, 0x09B0, + 0x09B0, 0x09B0, 0x09B0, 0x0B10, 0x0B20, 0x0B30, 0x0B40, 0x0B40, 0x0B50, 0x0B60, 0x0B70, 0x0B80, + 0x0B90, 0x0B90, 0x0BA0, 0x0B90, 0x0BB0, 0x0BC0, 0x0A90, 0x0A90, 0x0BD0, 0x0BE0, 0x0BF0, 0x0BF0, + 0x0BF0, 0x0C00, 0x0BF0, 0x0C10, 0x0C20, 0x0C20, 0x0C30, 0x0080, 0x0C40, 0x02D0, 0x02D0, 0x02D0, + 0x0C50, 0x0C50, 0x0C50, 0x0C50, 0x0C60, 0x0C50, 0x0C50, 0x0C70, 0x0C80, 0x0C80, 0x0C80, 0x0C80, + 0x0C90, 0x0C90, 0x0C90, 0x0CA0, +/* INDEX_BLOCK: -- 0x01C0..0x01FF -- */ + 0x0CB0, 0x0CB0, 0x0CB0, 0x0CC0, 0x0CD0, 0x0CE0, 0x0CE0, 0x0CE0, 0x0CF0, 0x08C0, 0x08C0, 0x0D00, + 0x0D10, 0x0D20, 0x0D30, 0x0D40, 0x0040, 0x0040, 0x0D50, 0x0040, 0x0040, 0x0D60, 0x0D70, 0x0D80, + 0x0040, 0x0040, 0x0040, 0x0D90, 0x0080, 0x0080, 0x0080, 0x0DA0, 0x0040, 0x0040, 0x0040, 0x0040, + 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, + 0x00B0, 0x0DB0, 0x00B0, 0x00B0, 0x0DB0, 0x0DC0, 0x00B0, 0x0DD0, 0x00B0, 0x00B0, 0x00B0, 0x0DE0, + 0x0DE0, 0x0DF0, 0x00B0, 0x0E00, +/* INDEX_BLOCK: -- 0x0200..0x023F -- */ + 0x0E10, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E20, 0x0E30, 0x0E40, 0x0E50, 0x0000, 0x0000, + 0x02D0, 0x0080, 0x0080, 0x0C40, 0x0000, 0x0000, 0x0E60, 0x0E70, 0x0E80, 0x0000, 0x0040, 0x0040, + 0x0E90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, +/* INDEX_BLOCK: -- 0x0240..0x027F -- */ + 0x0000, 0x0000, 0x0EA0, 0x02D0, 0x0EB0, 0x02D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, +/* INDEX_BLOCK: -- 0x0280..0x02BF -- */ + 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, + 0x0EC0, 0x0EC0, 0x0EC0, 0x0EC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0ED0, 0x0000, 0x0EE0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, +/* INDEX_BLOCK: -- 0x02C0..0x02FF -- */ + 0x0EF0, 0x0EF0, 0x0F00, 0x0EF0, 0x0EF0, 0x0F00, 0x0040, 0x0040, 0x0F10, 0x0F10, 0x0F10, 0x0F10, + 0x0F10, 0x0F10, 0x0F10, 0x0F20, 0x08C0, 0x08C0, 0x08D0, 0x0F30, 0x0F30, 0x0F30, 0x0F40, 0x0F50, + 0x0900, 0x0F60, 0x0F70, 0x0F70, 0x0F70, 0x0F70, 0x00E0, 0x00E0, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0F80, 0x02D0, 0x02D0, 0x0F90, 0x0FA0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0FB0, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0FC0, 0x02D0, 0x0FD0, +/* INDEX_BLOCK: -- 0x0300..0x033F -- */ + 0x0FE0, 0x0000, 0x0FF0, 0x1000, 0x1010, 0x1020, 0x1020, 0x1020, 0x1020, 0x1030, 0x1040, 0x1050, + 0x1050, 0x1050, 0x1050, 0x1060, 0x1070, 0x1080, 0x1080, 0x1090, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x10A0, 0x0000, 0x1080, 0x1080, 0x0000, 0x0000, 0x10B0, 0x1050, 0x08F0, 0x10A0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x08F0, 0x10C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1050, 0x1050, 0x10D0, + 0x1050, 0x1050, 0x1050, 0x1050, 0x1050, 0x10E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, +/* INDEX_BLOCK: -- 0x0340..0x037F -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, +/* INDEX_BLOCK: -- 0x0380..0x03BF -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0000, 0x0000, 0x0000, 0x0000, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, +/* INDEX_BLOCK: -- 0x03C0..0x03FF -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x10F0, +/* INDEX_BLOCK: -- 0x0400..0x043F -- */ + 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, + 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, + 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, + 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, + 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, + 0x1100, 0x1100, 0x1100, 0x1100, +/* INDEX_BLOCK: -- 0x0440..0x047F -- */ + 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1100, 0x1110, 0x1100, 0x1100, 0x1100, + 0x1120, 0x1130, 0x1130, 0x1130, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, + 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1140, 0x1150, 0x02D0, + 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x00E0, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1170, + 0x0000, 0x0000, 0x1180, 0x0040, 0x0040, 0x0040, 0x0040, 0x0040, 0x1190, 0x0040, 0x0040, 0x0040, + 0x11A0, 0x02D0, 0x02D0, 0x11B0, +/* INDEX_BLOCK: -- 0x0480..0x04BF -- */ + 0x11C0, 0x11C0, 0x11D0, 0x11E0, 0x11F0, 0x11F0, 0x11F0, 0x1200, 0x1210, 0x1210, 0x1210, 0x1210, + 0x1220, 0x1230, 0x0320, 0x0320, 0x1240, 0x1240, 0x1250, 0x1260, 0x1260, 0x1270, 0x08F0, 0x1280, + 0x1290, 0x1290, 0x1290, 0x1290, 0x12A0, 0x12B0, 0x08B0, 0x12C0, 0x12D0, 0x12D0, 0x12D0, 0x12E0, + 0x12F0, 0x1300, 0x08B0, 0x08B0, 0x1310, 0x1310, 0x1310, 0x1310, 0x1320, 0x1330, 0x1340, 0x1350, + 0x1360, 0x1370, 0x0F70, 0x0040, 0x0040, 0x1380, 0x1390, 0x0990, 0x0990, 0x0990, 0x0990, 0x0990, + 0x1340, 0x1340, 0x13A0, 0x13B0, +/* INDEX_BLOCK: -- 0x04C0..0x04FF -- */ + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, +/* INDEX_BLOCK: -- 0x0500..0x053F -- */ + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, + 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x08F0, 0x13C0, 0x08F0, + 0x13D0, 0x08F0, 0x08F0, 0x13E0, +/* INDEX_BLOCK: -- 0x0540..0x057F -- */ + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0580..0x05BF -- */ + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x13F0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x1400, 0x02D0, 0x02D0, + 0x1410, 0x1420, 0x0150, 0x1430, 0x1440, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, + 0x1450, 0x0300, 0x01B0, 0x01B0, +/* INDEX_BLOCK: -- 0x05C0..0x05FF -- */ + 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, + 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x1460, 0x02D0, 0x01B0, 0x01B0, 0x01B0, + 0x01B0, 0x1470, 0x01B0, 0x01B0, 0x02F0, 0x02D0, 0x02D0, 0x1480, 0x0080, 0x11E0, 0x1490, 0x0000, + 0x0000, 0x14A0, 0x14B0, 0x02E0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x01B0, 0x14C0, + 0x14D0, 0x0000, 0x0010, 0x0020, 0x0010, 0x0020, 0x14E0, 0x1040, 0x1050, 0x14F0, 0x08F0, 0x10A0, + 0x1500, 0x1510, 0x1520, 0x1530, +/* INDEX_BLOCK: -- 0x0600..0x063F -- */ + 0x1540, 0x1550, 0x1560, 0x1570, 0x1580, 0x1580, 0x02D0, 0x02D0, 0x1550, 0x1550, 0x1550, 0x1550, + 0x1550, 0x1550, 0x1550, 0x1590, 0x15A0, 0x0000, 0x0000, 0x15B0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x15C0, 0x15D0, 0x15E0, 0x02D0, 0x02D0, 0x0000, 0x0000, 0x15F0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1600, 0x1610, 0x1620, 0x1620, 0x1620, 0x1630, 0x1640, 0x0FD0, + 0x1650, 0x1650, 0x1660, 0x1670, 0x1680, 0x1690, 0x1690, 0x16A0, 0x16B0, 0x16C0, 0x16D0, 0x16D0, + 0x16E0, 0x16F0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0640..0x067F -- */ + 0x1700, 0x1700, 0x1700, 0x1700, 0x1700, 0x1710, 0x1710, 0x1710, 0x1720, 0x1730, 0x1740, 0x1750, + 0x1750, 0x1760, 0x1750, 0x1770, 0x1780, 0x1780, 0x1790, 0x17A0, 0x17A0, 0x17A0, 0x17B0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, + 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, 0x17C0, + 0x17C0, 0x17C0, 0x17C0, 0x17D0, 0x17C0, 0x17E0, 0x17F0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0680..0x06BF -- */ + 0x1800, 0x1810, 0x1810, 0x1820, 0x1830, 0x1840, 0x1850, 0x1850, 0x1860, 0x1870, 0x1880, 0x02D0, + 0x02D0, 0x02D0, 0x1890, 0x18A0, 0x18B0, 0x18C0, 0x18D0, 0x18E0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x18F0, 0x18F0, 0x1900, 0x1910, 0x1900, 0x1920, 0x1900, 0x1900, 0x1930, 0x1940, 0x1950, 0x1960, + 0x1970, 0x1970, 0x1980, 0x1980, 0x1990, 0x1990, 0x02D0, 0x02D0, 0x19A0, 0x19A0, 0x19B0, 0x19C0, + 0x19D0, 0x19D0, 0x19D0, 0x19E0, 0x19F0, 0x1A00, 0x1A10, 0x1A20, 0x1A30, 0x1A40, 0x1A50, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x06C0..0x06FF -- */ + 0x1A60, 0x1A60, 0x1A60, 0x1A60, 0x1A70, 0x02D0, 0x02D0, 0x02D0, 0x1A80, 0x1A80, 0x1A80, 0x1A90, + 0x1A80, 0x1A80, 0x1A80, 0x1AA0, 0x1AB0, 0x1AB0, 0x1AC0, 0x1AD0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x01B0, 0x1AE0, 0x1AF0, 0x1AF0, 0x1B00, 0x1B10, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x1B20, 0x1B20, 0x1B30, 0x1B40, 0x1B40, 0x1B50, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1B60, + 0x1B70, 0x02D0, 0x1B80, 0x1B90, +/* INDEX_BLOCK: -- 0x0700..0x073F -- */ + 0x1BA0, 0x1BA0, 0x1BA0, 0x1BA0, 0x1BB0, 0x1BC0, 0x1BA0, 0x1BD0, 0x1BE0, 0x1BE0, 0x1BE0, 0x1BE0, + 0x1BF0, 0x1C00, 0x1C10, 0x1C20, 0x1C30, 0x1C30, 0x1C30, 0x1C40, 0x1C50, 0x1C60, 0x1C60, 0x1C70, + 0x1C80, 0x1C80, 0x1C80, 0x1C80, 0x1C80, 0x1C80, 0x1C90, 0x1CA0, 0x1CB0, 0x1CC0, 0x1CB0, 0x1CD0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1CE0, 0x1CF0, 0x1D00, 0x1D10, 0x1D10, 0x1D10, 0x1D20, 0x1D30, + 0x1D40, 0x1D50, 0x1D60, 0x1D70, 0x1D80, 0x1D90, 0x1DA0, 0x1DB0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0740..0x077F -- */ + 0x1DC0, 0x1DC0, 0x1DC0, 0x1DC0, 0x1DC0, 0x1DD0, 0x1DE0, 0x02D0, 0x1DF0, 0x1DF0, 0x1DF0, 0x1DF0, + 0x1E00, 0x1E10, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x1E20, 0x1E20, 0x1E20, 0x1E30, 0x1E20, 0x1E40, 0x02D0, 0x02D0, 0x1E50, 0x1E50, 0x1E50, 0x1E50, + 0x1E60, 0x1E70, 0x1E80, 0x02D0, 0x1E90, 0x1E90, 0x1E90, 0x1EA0, 0x1EB0, 0x02D0, 0x02D0, 0x02D0, + 0x1EC0, 0x1ED0, 0x1EE0, 0x1EC0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0780..0x07BF -- */ + 0x1EF0, 0x1EF0, 0x1EF0, 0x1F00, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x1F10, 0x1F10, + 0x1F10, 0x1F10, 0x1F10, 0x1F20, 0x1F30, 0x1F40, 0x1F50, 0x1F60, 0x1F70, 0x1F80, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x1F90, 0x1FA0, 0x1FA0, 0x1F90, 0x1FB0, 0x02D0, 0x1FC0, 0x1FC0, 0x1FC0, 0x1FC0, + 0x1FD0, 0x1FE0, 0x1FE0, 0x1FE0, 0x1FE0, 0x1FE0, 0x1FF0, 0x02D0, 0x2000, 0x2000, 0x2000, 0x2010, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x07C0..0x07FF -- */ + 0x2020, 0x2030, 0x2030, 0x2040, 0x2050, 0x2030, 0x2060, 0x2070, 0x2070, 0x2080, 0x2090, 0x20A0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x20B0, 0x20C0, 0x20C0, 0x20D0, 0x20E0, 0x20F0, 0x2100, 0x2110, + 0x2120, 0x2130, 0x2140, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2150, 0x2160, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2170, + 0x2180, 0x2180, 0x2180, 0x2190, +/* INDEX_BLOCK: -- 0x0800..0x083F -- */ + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21B0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0840..0x087F -- */ + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21C0, 0x21D0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, + 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21A0, 0x21E0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0880..0x08BF -- */ + 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, + 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, + 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, + 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, + 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, 0x21F0, + 0x21F0, 0x21F0, 0x21F0, 0x21F0, +/* INDEX_BLOCK: -- 0x08C0..0x08FF -- */ + 0x21F0, 0x21F0, 0x2200, 0x2210, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0900..0x093F -- */ + 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, + 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, + 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, 0x2220, + 0x2230, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0940..0x097F -- */ + 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, + 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, + 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x1160, 0x2240, + 0x2250, 0x2260, 0x2270, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2280, 0x2290, 0x22A0, + 0x22B0, 0x22B0, 0x22B0, 0x22B0, 0x22C0, 0x22D0, 0x22E0, 0x22F0, 0x22B0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0980..0x09BF -- */ + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x2300, 0x2300, 0x2300, 0x2300, 0x2300, 0x2310, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x2320, 0x2320, 0x2320, 0x2320, 0x2330, 0x2320, 0x2320, 0x2320, 0x2340, 0x2320, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x2350, 0x2360, +/* INDEX_BLOCK: -- 0x09C0..0x09FF -- */ + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, +/* INDEX_BLOCK: -- 0x0A00..0x0A3F -- */ + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2380, +/* INDEX_BLOCK: -- 0x0A40..0x0A7F -- */ + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, 0x2370, + 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, + 0x2390, 0x2390, 0x2390, 0x2390, +/* INDEX_BLOCK: -- 0x0A80..0x0ABF -- */ + 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, 0x2390, + 0x2390, 0x23A0, 0x02D0, 0x02D0, 0x23B0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0AC0..0x0AFF -- */ + 0x23C0, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, + 0x1020, 0x1020, 0x1020, 0x1020, 0x1020, 0x23D0, 0x02D0, 0x02D0, 0x02D0, 0x23E0, 0x23F0, 0x2400, + 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, + 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2400, 0x2410, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0B00..0x0B3F -- */ + 0x2420, 0x2420, 0x2420, 0x2420, 0x2420, 0x2420, 0x2430, 0x2440, 0x2450, 0x2460, 0x10B0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0B40..0x0B7F -- */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x2470, 0x0000, 0x0000, 0x2480, 0x0000, 0x0000, 0x0000, 0x2490, 0x24A0, + 0x24B0, 0x0000, 0x24C0, 0x0000, 0x0000, 0x0000, 0x24D0, 0x02D0, 0x00B0, 0x00B0, 0x00B0, 0x00B0, + 0x24E0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0000, 0x10B0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0EA0, 0x0000, 0x24D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0B80..0x0BBF -- */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E20, 0x0000, 0x0000, 0x0000, 0x24F0, 0x2500, 0x2510, + 0x2520, 0x0000, 0x0000, 0x0000, 0x2530, 0x2540, 0x0000, 0x2550, 0x2560, 0x2570, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2580, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x2590, 0x0000, 0x0000, 0x0000, +/* INDEX_BLOCK: -- 0x0BC0..0x0BFF -- */ + 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, + 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, + 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25A0, + 0x25A0, 0x25A0, 0x25A0, 0x25A0, 0x25B0, 0x25C0, 0x25D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0C00..0x0C3F -- */ + 0x25E0, 0x25F0, 0x2600, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2610, 0x2610, 0x2620, 0x2630, 0x2640, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x2650, 0x2650, 0x2650, 0x2660, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0C40..0x0C7F -- */ + 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, 0x2670, + 0x2680, 0x2690, 0x02D0, 0x02D0, 0x26A0, 0x26A0, 0x26A0, 0x26A0, 0x26B0, 0x26C0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0C80..0x0CBF -- */ + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x14D0, 0x0000, 0x0000, 0x0000, 0x26D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x14D0, 0x0000, 0x0000, 0x26E0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x26F0, 0x01B0, 0x2700, 0x2710, + 0x2720, 0x2730, 0x2740, 0x2750, 0x2760, 0x2770, 0x2780, 0x2770, 0x02D0, 0x02D0, 0x02D0, 0x1450, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0CC0..0x0CFF -- */ + 0x0000, 0x0000, 0x0FD0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10B0, 0x0E40, 0x14D0, + 0x14D0, 0x14D0, 0x0000, 0x2470, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x26E0, 0x02D0, 0x02D0, 0x02D0, 0x2790, 0x0000, 0x27A0, 0x0000, 0x0000, 0x0FD0, + 0x24D0, 0x27B0, 0x2470, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, +/* INDEX_BLOCK: -- 0x0D00..0x0D3F -- */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x27C0, 0x15D0, 0x15D0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x10B0, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x24D0, 0x0FD0, 0x02D0, +/* INDEX_BLOCK: -- 0x0D40..0x0D7F -- */ + 0x0FD0, 0x0000, 0x0000, 0x0000, 0x27C0, 0x11E0, 0x0000, 0x0000, 0x27C0, 0x0000, 0x26E0, 0x27B0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x27D0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x27E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x10B0, 0x26E0, 0x27F0, 0x0EA0, 0x0000, 0x24D0, 0x0EA0, 0x0F80, 0x0EA0, 0x02D0, 0x02D0, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x14A0, 0x0000, 0x0000, + 0x0EB0, 0x02D0, 0x02D0, 0x11E0, +/* INDEX_BLOCK: -- 0x0D80..0x0DBF -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x13F0, 0x02D0, 0x02D0, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, +/* INDEX_BLOCK: -- 0x0DC0..0x0DFF -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x2800, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, +/* INDEX_BLOCK: -- 0x0E00..0x0E3F -- */ + 0x0F90, 0x13F0, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, +/* INDEX_BLOCK: -- 0x0E40..0x0E7F -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x2360, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, +/* INDEX_BLOCK: -- 0x0E80..0x0EBF -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x2810, 0x02D0, +/* INDEX_BLOCK: -- 0x0EC0..0x0EFF -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x13F0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0F00..0x0F3F -- */ + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x0F90, + 0x0F90, 0x0F90, 0x0F90, 0x0F90, 0x2820, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, +/* INDEX_BLOCK: -- 0x0F40..0x0F5E -- */ + 0x2830, 0x02D0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02D0, 0x02D0, 0x02D0, 0x02D0, + 0x02D0, 0x02D0, 0x02D0, 0x02D0, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, + 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080, 0x0080 +}; + +static const SBUInt16 BranchScriptIndexes[897] = { + 0x0000, 0x0040, 0x0080, 0x00C0, 0x0100, 0x0140, 0x0180, 0x01C0, 0x0200, 0x0240, 0x0280, 0x02C0, + 0x0300, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0380, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x03C0, 0x0400, 0x0440, 0x0480, 0x04C0, 0x04C0, 0x04C0, 0x04C0, 0x04C0, + 0x04C0, 0x04C0, 0x04C0, 0x04C0, 0x04C0, 0x0500, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0580, 0x05C0, 0x0600, 0x0640, 0x0680, 0x06C0, 0x0700, 0x0740, 0x0780, 0x07C0, + 0x0800, 0x0840, 0x0540, 0x0540, 0x0880, 0x08C0, 0x0540, 0x0540, 0x0540, 0x0900, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0940, 0x0980, 0x09C0, 0x09C0, 0x09C0, 0x09C0, + 0x09C0, 0x0A00, 0x0A40, 0x0A80, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0AC0, 0x0540, 0x0540, 0x0B00, 0x0540, 0x0540, 0x0540, 0x0540, 0x0B40, 0x0B80, 0x0BC0, 0x0540, + 0x0C00, 0x0540, 0x0C40, 0x0C80, 0x0CC0, 0x0D00, 0x0D40, 0x0540, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, + 0x0340, 0x0D80, 0x0340, 0x0340, 0x0340, 0x0DC0, 0x0E00, 0x0340, 0x0340, 0x0340, 0x0340, 0x0E40, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0340, 0x0E80, 0x0540, 0x0540, 0x0540, 0x0EC0, 0x0540, + 0x0340, 0x0340, 0x0340, 0x0340, 0x0F00, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, + 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0540, 0x0F40 +}; + +SB_INTERNAL SBScript LookupScript(SBCodepoint codepoint) +{ + if (codepoint <= 0x0E01EF) { + return PrimaryScriptData[ + MainScriptIndexes[ + BranchScriptIndexes[ + codepoint / 0x0400 + ] + (codepoint % 0x0400) / 0x0010 + ] + codepoint % 0x0010 + ]; + } + + return Zzzz; +} + +#undef Adlm +#undef Aghb +#undef Ahom +#undef Arab +#undef Armi +#undef Armn +#undef Avst +#undef Bali +#undef Bamu +#undef Bass +#undef Batk +#undef Beng +#undef Bhks +#undef Bopo +#undef Brah +#undef Brai +#undef Bugi +#undef Buhd +#undef Cakm +#undef Cans +#undef Cari +#undef Cham +#undef Cher +#undef Chrs +#undef Copt +#undef Cprt +#undef Cyrl +#undef Deva +#undef Diak +#undef Dogr +#undef Dsrt +#undef Dupl +#undef Egyp +#undef Elba +#undef Elym +#undef Ethi +#undef Geor +#undef Glag +#undef Gong +#undef Gonm +#undef Goth +#undef Gran +#undef Grek +#undef Gujr +#undef Guru +#undef Hang +#undef Hani +#undef Hano +#undef Hatr +#undef Hebr +#undef Hira +#undef Hluw +#undef Hmng +#undef Hmnp +#undef Hung +#undef Ital +#undef Java +#undef Kali +#undef Kana +#undef Khar +#undef Khmr +#undef Khoj +#undef Kits +#undef Knda +#undef Kthi +#undef Lana +#undef Laoo +#undef Latn +#undef Lepc +#undef Limb +#undef Lina +#undef Linb +#undef Lisu +#undef Lyci +#undef Lydi +#undef Mahj +#undef Maka +#undef Mand +#undef Mani +#undef Marc +#undef Medf +#undef Mend +#undef Merc +#undef Mero +#undef Mlym +#undef Modi +#undef Mong +#undef Mroo +#undef Mtei +#undef Mult +#undef Mymr +#undef Nand +#undef Narb +#undef Nbat +#undef Newa +#undef Nkoo +#undef Nshu +#undef Ogam +#undef Olck +#undef Orkh +#undef Orya +#undef Osge +#undef Osma +#undef Palm +#undef Pauc +#undef Perm +#undef Phag +#undef Phli +#undef Phlp +#undef Phnx +#undef Plrd +#undef Prti +#undef Rjng +#undef Rohg +#undef Runr +#undef Samr +#undef Sarb +#undef Saur +#undef Sgnw +#undef Shaw +#undef Shrd +#undef Sidd +#undef Sind +#undef Sinh +#undef Sogd +#undef Sogo +#undef Sora +#undef Soyo +#undef Sund +#undef Sylo +#undef Syrc +#undef Tagb +#undef Takr +#undef Tale +#undef Talu +#undef Taml +#undef Tang +#undef Tavt +#undef Telu +#undef Tfng +#undef Tglg +#undef Thaa +#undef Thai +#undef Tibt +#undef Tirh +#undef Ugar +#undef Vaii +#undef Wara +#undef Wcho +#undef Xpeo +#undef Xsux +#undef Yezi +#undef Yiii +#undef Zanb +#undef Zinh +#undef Zyyy +#undef Zzzz diff --git a/lib/sheenbidi/Source/ScriptLookup.h b/lib/sheenbidi/Source/ScriptLookup.h new file mode 100644 index 000000000..da92eb519 --- /dev/null +++ b/lib/sheenbidi/Source/ScriptLookup.h @@ -0,0 +1,16 @@ +/* + * Automatically generated by SheenBidiGenerator tool. + * DO NOT EDIT!! + */ + +#ifndef _SB_INTERNAL_SCRIPT_LOOKUP_H +#define _SB_INTERNAL_SCRIPT_LOOKUP_H + +#include <SBConfig.h> +#include <SBScript.h> + +#include "SBBase.h" + +SB_INTERNAL SBScript LookupScript(SBCodepoint codepoint); + +#endif diff --git a/lib/sheenbidi/Source/ScriptStack.c b/lib/sheenbidi/Source/ScriptStack.c new file mode 100644 index 000000000..a525a3de7 --- /dev/null +++ b/lib/sheenbidi/Source/ScriptStack.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2018-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> + +#include "SBAssert.h" +#include "SBBase.h" +#include "ScriptStack.h" + +SB_INTERNAL void ScriptStackReset(ScriptStackRef stack) +{ + stack->top = -1; + stack->count = 0; + stack->open = 0; +} + +SB_INTERNAL void ScriptStackPush(ScriptStackRef stack, SBScript script, SBCodepoint mirror) +{ + stack->count = SBNumberLimitIncrement(stack->count, _SBScriptStackCapacity); + stack->open = SBNumberLimitIncrement(stack->open, _SBScriptStackCapacity); + + stack->top = SBNumberRingIncrement(stack->top, _SBScriptStackCapacity); + stack->_elements[stack->top].script = script; + stack->_elements[stack->top].mirror = mirror; +} + +SB_INTERNAL void ScriptStackPop(ScriptStackRef stack) +{ + /* There must be at least one entry in the stack. */ + SBAssert(stack->count > 0); + + stack->count -= 1; + stack->open = SBNumberLimitDecrement(stack->open, 0); + stack->top = SBNumberRingDecrement(stack->top, _SBScriptStackCapacity); + + if (ScriptStackIsEmpty(stack)) { + stack->top = -1; + } +} + +SB_INTERNAL void ScriptStackLeavePairs(ScriptStackRef stack) +{ + stack->open = 0; +} + +SB_INTERNAL void ScriptStackSealPairs(ScriptStackRef stack, SBScript script) +{ + SBInteger index = SBNumberRingSubtract(stack->top, (SBInteger)stack->open, _SBScriptStackCapacity); + + while (stack->open) { + index = SBNumberRingIncrement(index, _SBScriptStackCapacity); + stack->_elements[index].script = script; + stack->open -= 1; + } +} + +SB_INTERNAL SBBoolean ScriptStackIsEmpty(ScriptStackRef stack) +{ + return (stack->count == 0); +} + +SB_INTERNAL SBScript ScriptStackGetScript(ScriptStackRef stack) +{ + return stack->_elements[stack->top].script; +} + +SB_INTERNAL SBCodepoint ScriptStackGetMirror(ScriptStackRef stack) +{ + return stack->_elements[stack->top].mirror; +} diff --git a/lib/sheenbidi/Source/ScriptStack.h b/lib/sheenbidi/Source/ScriptStack.h new file mode 100644 index 000000000..fee54c95d --- /dev/null +++ b/lib/sheenbidi/Source/ScriptStack.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2018-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_SCRIPT_STACK_H +#define _SB_INTERNAL_SCRIPT_STACK_H + +#include <SBBase.h> +#include <SBConfig.h> + +#define _SBScriptStackCapacity 63 + +typedef struct _SBScriptStackElement { + SBScript script; + SBCodepoint mirror; +} _SBScriptStackElement; + +typedef struct _SBScriptStack { + _SBScriptStackElement _elements[_SBScriptStackCapacity]; + SBInteger top; + SBUInteger count; + SBUInteger open; +} ScriptStack, *ScriptStackRef; + +SB_INTERNAL void ScriptStackReset(ScriptStackRef stack); + +SB_INTERNAL void ScriptStackPush(ScriptStackRef stack, SBScript script, SBCodepoint mirror); +SB_INTERNAL void ScriptStackPop(ScriptStackRef stack); + +SB_INTERNAL void ScriptStackLeavePairs(ScriptStackRef stack); +SB_INTERNAL void ScriptStackSealPairs(ScriptStackRef stack, SBScript script); + +SB_INTERNAL SBBoolean ScriptStackIsEmpty(ScriptStackRef stack); +SB_INTERNAL SBScript ScriptStackGetScript(ScriptStackRef stack); +SB_INTERNAL SBCodepoint ScriptStackGetMirror(ScriptStackRef stack); + +#endif diff --git a/lib/sheenbidi/Source/SheenBidi.c b/lib/sheenbidi/Source/SheenBidi.c new file mode 100644 index 000000000..4a4917607 --- /dev/null +++ b/lib/sheenbidi/Source/SheenBidi.c @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <SheenBidi.h> + +#ifdef SB_CONFIG_UNITY + +#include "BidiChain.c" +#include "BidiTypeLookup.c" +#include "BracketQueue.c" +#include "GeneralCategoryLookup.c" +#include "IsolatingRun.c" +#include "LevelRun.c" +#include "PairingLookup.c" +#include "RunQueue.c" +#include "SBAlgorithm.c" +#include "SBBase.c" +#include "SBCodepointSequence.c" +#include "SBLine.c" +#include "SBLog.c" +#include "SBMirrorLocator.c" +#include "SBParagraph.c" +#include "SBScriptLocator.c" +#include "ScriptLookup.c" +#include "ScriptStack.c" +#include "StatusStack.c" + +#endif diff --git a/lib/sheenbidi/Source/StatusStack.c b/lib/sheenbidi/Source/StatusStack.c new file mode 100644 index 000000000..afa99caa5 --- /dev/null +++ b/lib/sheenbidi/Source/StatusStack.c @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <SBConfig.h> +#include <stddef.h> +#include <stdlib.h> + +#include "SBAssert.h" +#include "SBBase.h" +#include "StatusStack.h" + +SB_INTERNAL void StatusStackInitialize(StatusStackRef stack) +{ + stack->_firstList.previous = NULL; + stack->_firstList.next = NULL; + + StatusStackSetEmpty(stack); +} + +SB_INTERNAL void StatusStackPush(StatusStackRef stack, SBLevel embeddingLevel, SBBidiType overrideStatus, SBBoolean isolateStatus) +{ + _SBStatusStackElementRef element; + + /* The stack can hold upto 127 elements. */ + SBAssert(stack->count <= 127); + + if (stack->_peekTop != _SBStatusStackList_MaxIndex) { + element = &stack->_peekList->elements[++stack->_peekTop]; + } else { + _SBStatusStackListRef previousList = stack->_peekList; + _SBStatusStackListRef peekList = previousList->next; + + if (!peekList) { + peekList = malloc(sizeof(_SBStatusStackList)); + peekList->previous = previousList; + peekList->next = NULL; + + previousList->next = peekList; + } + + stack->_peekList = peekList; + stack->_peekTop = 0; + + element = &peekList->elements[0]; + } + stack->count += 1; + + element->embeddingLevel = embeddingLevel; + element->overrideStatus = overrideStatus; + element->isolateStatus = isolateStatus; +} + +SB_INTERNAL void StatusStackPop(StatusStackRef stack) +{ + /* The stack should not be empty. */ + SBAssert(stack->count != 0); + + if (stack->_peekTop != 0) { + stack->_peekTop -= 1; + } else { + stack->_peekList = stack->_peekList->previous; + stack->_peekTop = _SBStatusStackList_MaxIndex; + } + stack->count -= 1; +} + +SB_INTERNAL void StatusStackSetEmpty(StatusStackRef stack) +{ + stack->_peekList = &stack->_firstList; + stack->_peekTop = 0; + stack->count = 0; +} + +SB_INTERNAL SBLevel StatusStackGetEmbeddingLevel(StatusStackRef stack) +{ + return stack->_peekList->elements[stack->_peekTop].embeddingLevel; +} + +SB_INTERNAL SBBidiType StatusStackGetOverrideStatus(StatusStackRef stack) +{ + return stack->_peekList->elements[stack->_peekTop].overrideStatus; +} + +SB_INTERNAL SBBoolean StatusStackGetIsolateStatus(StatusStackRef stack) +{ + return stack->_peekList->elements[stack->_peekTop].isolateStatus; +} + +SB_INTERNAL void StatusStackFinalize(StatusStackRef stack) +{ + _SBStatusStackListRef list = stack->_firstList.next; + + while (list) { + _SBStatusStackListRef next = list->next; + free(list); + list = next; + }; +} diff --git a/lib/sheenbidi/Source/StatusStack.h b/lib/sheenbidi/Source/StatusStack.h new file mode 100644 index 000000000..24e05325c --- /dev/null +++ b/lib/sheenbidi/Source/StatusStack.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2014-2019 Muhammad Tayyab Akram + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _SB_INTERNAL_STATUS_STACK_H +#define _SB_INTERNAL_STATUS_STACK_H + +#include <SBConfig.h> +#include "SBBase.h" + +#define _SBStatusStackList_Length 16 +#define _SBStatusStackList_MaxIndex (_SBStatusStackList_Length - 1) + +typedef struct _SBStatusStackElement { + SBBoolean isolateStatus; + SBBidiType overrideStatus; + SBLevel embeddingLevel; +} _SBStatusStackElement, *_SBStatusStackElementRef; + +typedef struct _SBStatusStackList { + _SBStatusStackElement elements[_SBStatusStackList_Length]; + + struct _SBStatusStackList *previous; + struct _SBStatusStackList *next; +} _SBStatusStackList, *_SBStatusStackListRef; + +typedef struct _SBStatusStack { + _SBStatusStackList _firstList; + _SBStatusStackListRef _peekList; + SBUInteger _peekTop; + SBUInteger count; +} StatusStack, *StatusStackRef; + +SB_INTERNAL void StatusStackInitialize(StatusStackRef stack); +SB_INTERNAL void StatusStackFinalize(StatusStackRef stack); + +SB_INTERNAL void StatusStackPush(StatusStackRef stack, + SBLevel embeddingLevel, SBBidiType overrideStatus, SBBoolean isolateStatus); +SB_INTERNAL void StatusStackPop(StatusStackRef stack); +SB_INTERNAL void StatusStackSetEmpty(StatusStackRef stack); + +SB_INTERNAL SBLevel StatusStackGetEmbeddingLevel(StatusStackRef stack); +SB_INTERNAL SBBidiType StatusStackGetOverrideStatus(StatusStackRef stack); +SB_INTERNAL SBBoolean StatusStackGetIsolateStatus(StatusStackRef stack); + +#endif