From 553a7d5d9efd0f499be69210e15fe00745b8615c Mon Sep 17 00:00:00 2001 From: MeowOS Date: Tue, 1 Sep 2026 23:26:42 +0800 Subject: [PATCH] =?UTF-8?q?reader=20R1:=20os.meow.reader=20=E4=B9=A6?= =?UTF-8?q?=E6=9E=B6+TXT=20=E5=9E=82=E7=9B=B4=E9=93=BE=E8=B7=AF=E9=AA=A8?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - core: 编码检测(BOM→UTF-8严格→GB18030/Big5统计, Big5与GB重叠按GB18030兜底, §3.5风险注明) + GB18030双字节码表(uint16[126][190]=47880B, tools/gen_gb18030_table.py 生成, 生成物入仓) + 流式排版器(贪心断行+Kinsoku避头尾+分页+重排锚定, rd_meas_fn 测量回调替 FreeType, 宿主可测) + TXT 流式加载器(按段读, 不整文件入内存, \n 恒独立换行可安全分段) - engine: FreeType 封装(FT_New_Face 按需读文件, NO_HINTING/LIGHT 灰阶, LRU 512 key=码点+字号, blend565, rdft_advance 只测宽不栅格化) - app: 书架(扫 Books/ 识别 5 后缀, 最近读置顶, 空态提示) + 阅读页(W_CUSTOM 画布 3 栏翻页 +中央菜单占位(字号±/行距±/返回) +顶栏进度%/章节名) + 书桥(段表+flat 页索引, 渲染, 重排回锚) + 进度持久化(MeowData/os.meow.reader/progress/, path hash→seg/ch/fs/ls/ts) - 取舍: 正文字体 FreeType 直读 TF MeowOS/fonts/ TTF/OTF; 无字体回退 SDK 位图字库(meow_ui_text, 未打包字体(许可/体积), 全 glyph 兜底 R2); 页位图缓存当前+前后各1页(3×691KB), 翻页动画默认无 - 内存实测(宿主 --wrap malloc, 73页书): 书结构 130KB + 当前段刮擦~1.6MB(行/页容量按 n 偏高,R2 收紧) + 字形缓存~650KB + 3页位图 2.07MB ≈ 4.45MB 动态, 在 ≤8MB 阅读态预算内 - 测试: 宿主 core 58/58(enc/gb18030金标准/kinsoku/page/reflow/txt); qemu-mipsel ft_smoke PASS + book_smoke(12页/渲染有墨/翻页/重排回锚) PASS; reader 交叉 -Wall -Wextra 0 warning - 产物: reader(mipsel 静态1.2MB)+build_reader.sh(vendor FreeType 可复现); vendor/二进制 gitignore --- patch_v2/reader_app/.gitignore | 9 + patch_v2/reader_app/app.c | 59 + patch_v2/reader_app/app.json | 1 + patch_v2/reader_app/app/book.c | 346 ++ patch_v2/reader_app/app/book.h | 64 + patch_v2/reader_app/app/progress.c | 102 + patch_v2/reader_app/app/progress.h | 42 + patch_v2/reader_app/app/reader.c | 334 ++ patch_v2/reader_app/app/shelf.c | 184 + patch_v2/reader_app/build_reader.sh | 93 + patch_v2/reader_app/core/gb18030_table.h | 3169 +++++++++++++++++ patch_v2/reader_app/core/rdenc.c | 274 ++ patch_v2/reader_app/core/rdenc.h | 68 + patch_v2/reader_app/core/rdlayout.c | 257 ++ patch_v2/reader_app/core/rdlayout.h | 75 + patch_v2/reader_app/core/rdtxt.c | 116 + patch_v2/reader_app/core/rdtxt.h | 56 + patch_v2/reader_app/engine/rdft.c | 215 ++ patch_v2/reader_app/engine/rdft.h | 68 + patch_v2/reader_app/icon.png | Bin 0 -> 452 bytes patch_v2/reader_app/reader_internal.h | 35 + patch_v2/reader_app/test/book_smoke.c | 86 + patch_v2/reader_app/test/mem_account.c | 93 + patch_v2/reader_app/test/rdft_smoke.c | 71 + patch_v2/reader_app/test/test_reader_core.c | 275 ++ .../reader_app/tools/gen_gb18030_table.py | 63 + 26 files changed, 6155 insertions(+) create mode 100644 patch_v2/reader_app/.gitignore create mode 100644 patch_v2/reader_app/app.c create mode 100644 patch_v2/reader_app/app.json create mode 100644 patch_v2/reader_app/app/book.c create mode 100644 patch_v2/reader_app/app/book.h create mode 100644 patch_v2/reader_app/app/progress.c create mode 100644 patch_v2/reader_app/app/progress.h create mode 100644 patch_v2/reader_app/app/reader.c create mode 100644 patch_v2/reader_app/app/shelf.c create mode 100755 patch_v2/reader_app/build_reader.sh create mode 100644 patch_v2/reader_app/core/gb18030_table.h create mode 100644 patch_v2/reader_app/core/rdenc.c create mode 100644 patch_v2/reader_app/core/rdenc.h create mode 100644 patch_v2/reader_app/core/rdlayout.c create mode 100644 patch_v2/reader_app/core/rdlayout.h create mode 100644 patch_v2/reader_app/core/rdtxt.c create mode 100644 patch_v2/reader_app/core/rdtxt.h create mode 100644 patch_v2/reader_app/engine/rdft.c create mode 100644 patch_v2/reader_app/engine/rdft.h create mode 100644 patch_v2/reader_app/icon.png create mode 100644 patch_v2/reader_app/reader_internal.h create mode 100644 patch_v2/reader_app/test/book_smoke.c create mode 100644 patch_v2/reader_app/test/mem_account.c create mode 100644 patch_v2/reader_app/test/rdft_smoke.c create mode 100644 patch_v2/reader_app/test/test_reader_core.c create mode 100644 patch_v2/reader_app/tools/gen_gb18030_table.py diff --git a/patch_v2/reader_app/.gitignore b/patch_v2/reader_app/.gitignore new file mode 100644 index 0000000..f75a91f --- /dev/null +++ b/patch_v2/reader_app/.gitignore @@ -0,0 +1,9 @@ +# os.meow.reader 构建产物(不入仓) +/vendor/ +/reader +/test/test_reader_core_host +/test/rdft_smoke_mipsel +/test/book_smoke_mipsel +/test/mem_account_host +*.o +*.a diff --git a/patch_v2/reader_app/app.c b/patch_v2/reader_app/app.c new file mode 100644 index 0000000..2fe3a78 --- /dev/null +++ b/patch_v2/reader_app/app.c @@ -0,0 +1,59 @@ +/* app.c — os.meow.reader 应用装配层:main + 初始化 + 事件分发。 + * + * 职责(SDK_VIEW_FRAMEWORK_DESIGN.md §B.2):main 只做 init/建页/跑事件循环/清理;把 + * meow_ui_run 的平铺输入回调(key/tap/swipe/tick/touch)路由到当前活动页(shelf/reader)。 + * 页面切换走 meow_view_page_push/pop(on_enter/on_leave 唯一入口)。 + */ +#include "reader_internal.h" +#include "meow_ui_internal.h" /* 阅读页 blit 需要 back_buf 访问器(决策见报告) */ +#include + +static meow_view *g_shelf_view; +static meow_view *g_reader_view; + +static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); } + +static void app_on_key(int keycode, int is_down) { (void)keycode; (void)is_down; } + +static void app_on_tap(int x, int y) +{ + if (reader_is_active()) { reader_on_tap(x, y); return; } + shelf_on_tap(x, y); +} + +static void app_on_swipe(int dir, int dx, int dy) +{ + (void)dy; (void)dx; + if (reader_is_active()) { reader_on_swipe(dir, dx, dy); return; } + if (dir == MEOW_SWIPE_LEFT) { meow_ui_request_exit(); } +} + +static void app_on_tick(void) +{ + uint64_t now = meow_ui_time_ms(); + if (reader_is_active()) { reader_on_tick(now); return; } +} + +int main(void) +{ + meow_log(MEOW_LOG_INFO, "start"); + meow_ui_opts o = { 480, 720 }; + if (meow_ui_init(&o) != 0) { meow_log(MEOW_LOG_ERROR, "init failed"); return 1; } + meow_theme_add_listener(NULL); + signal(SIGTERM, on_sigterm); + + g_shelf_view = shelf_view_create(); + g_reader_view = reader_view_create(); + + meow_view_page_push(ACT_SHELF); + + meow_ui_events ev = { app_on_key, app_on_tap, app_on_swipe, app_on_tick, + NULL, NULL, NULL }; + meow_ui_run(&ev); + + meow_view_free(g_reader_view); + meow_view_free(g_shelf_view); + meow_ui_shutdown(); + meow_log(MEOW_LOG_INFO, "exit"); + return 0; +} diff --git a/patch_v2/reader_app/app.json b/patch_v2/reader_app/app.json new file mode 100644 index 0000000..038b3eb --- /dev/null +++ b/patch_v2/reader_app/app.json @@ -0,0 +1 @@ +{"name":"Reader","exec":"/usr/data/mnt/sd_0/MeowAPPs/os.meow.reader/reader","package":"os.meow.reader","version":"0.1","version_code":1,"framework":1,"fonts":"full","author":"MeowOS","icon":"icon.png"} diff --git a/patch_v2/reader_app/app/book.c b/patch_v2/reader_app/app/book.c new file mode 100644 index 0000000..4af59f8 --- /dev/null +++ b/patch_v2/reader_app/app/book.c @@ -0,0 +1,346 @@ +/* app/book.c — 书桥实现(见 app/book.h)。 */ +#include "book.h" +#include "rdtxt.h" +#include "rdlayout.h" +#include "../engine/rdft.h" +#include +#include +#include + +typedef struct seg { + size_t file_off, file_len; + int page_start; /* 全局页表起点 */ + int page_count; /* 本段页数 */ +} seg_t; + +struct rd_book { + char path[400]; + char font[400]; + char base[256]; /* 文件名 */ + const char *encname; + rdft *ft; + rd_enc_t enc; + + int fs, ls, pw, ph, mx, my, top; + int content_w, content_h; + + seg_t *segs; int nsegs; + rd_book_page *pages; int npages; /* flat 页表 */ + int cur; /* 当前页 */ + + /* 当前渲染段的复用缓冲 */ + uint8_t *seg_utf8; size_t seg_utf8_cap; + uint32_t *seg_cps; size_t seg_cps_n, seg_cps_cap; + /* 当前段布局 */ + rd_line *seg_lines; rd_page *seg_pages; int seg_nlines, seg_npages; + int seg_cache_idx; /* 当前缓冲对应段;-1=无 */ +}; + +static const char *encname_of(rd_enc_t e) +{ + switch (e) { + case RD_ENC_UTF8: return "UTF-8"; + case RD_ENC_UTF16LE: return "UTF-16LE"; + case RD_ENC_UTF16BE: return "UTF-16BE"; + case RD_ENC_GB18030: return "GB18030"; + case RD_ENC_BIG5: return "Big5(按GB18030)"; + case RD_ENC_ASCII: return "ASCII"; + } + return "?"; +} + +/* 测量回调:排版器逐字测 advance → rdft_advance(不栅格化)。 */ +static int book_meas(uint32_t cp, int fs, int *adv, void *ctx) +{ + (void)fs; + rd_book *b = (rd_book *)ctx; + /* advance 受字号影响:rdft 已 set_px(fs),故用当前 rdft 度量即可 */ + return rdft_advance(b->ft, cp, adv); +} + +static int build_index(rd_book *b) +{ + int rc = 0; + rdtxt_reader *r = NULL; + if (rdtxt_reader_open(b->path, &(rdtxt_info){ .enc = b->enc, .file_size = 0, .path = "" }, + &r) != 0) return -1; + /* rdtxt_reader_open 以 info 的 enc 为准(path 域不读) */ + size_t cap_segs = 64, cap_pages = 1024; + b->segs = (seg_t *)malloc(cap_segs * sizeof(seg_t)); + b->pages = (rd_book_page *)malloc(cap_pages * sizeof(rd_book_page)); + if (!b->segs || !b->pages) { rd_book_close(b); return -6; } + b->nsegs = b->npages = 0; + + uint8_t *utf8 = (uint8_t *)malloc(RDTXT_SEG_UTF8_MAX + 8); + if (!utf8) { rd_book_close(b); return -6; } + + size_t off = 0, flen = 0, ulen = 0; + int seg_idx = 0; + while (rdtxt_reader_next(r, utf8, RDTXT_SEG_UTF8_MAX + 8, &ulen, &off, &flen) == 0) { + if (seg_idx >= (int)cap_segs) { cap_segs *= 2; b->segs = (seg_t *)realloc(b->segs, cap_segs * sizeof(seg_t)); } + uint32_t *cps = NULL; size_t n = 0; + rd_utf8_to_cp(utf8, ulen, &cps, &n); /* rd_utf8_to_cp 内部 malloc */ + rd_layout_in in; + rd_layout_out out; + rd_line *lines = (rd_line *)malloc((n ? n : 1) * sizeof(rd_line)); + rd_page *pages = (rd_page *)malloc((n ? n : 1) * sizeof(rd_page)); + if (!lines || !pages) { free(lines); free(pages); free(cps); free(utf8); rd_book_close(b); return -6; } + in.chars = cps; in.n = (int32_t)n; in.fs = b->fs; in.line_scale = b->ls; + in.page_w = b->content_w; in.page_h = b->content_h; in.indent = b->fs; + in.meas = book_meas; in.mctx = b; + out.lines = lines; out.pages = pages; out.max_lines = (int)(n ? n : 1); out.max_pages = (int)(n ? n : 1); + /* 布局容量不足时翻倍重试(罕见)。 */ + int lrc = rd_layout(&in, &out); + free(cps); + if (lrc != RD_LAYOUT_OK) { free(lines); free(pages); break; } /* 段为空/异常:跳过 */ + /* 登记段 + 页 */ + b->segs[seg_idx].file_off = off; + b->segs[seg_idx].file_len = flen; + b->segs[seg_idx].page_start = b->npages; + b->segs[seg_idx].page_count = out.npages; + for (int p = 0; p < out.npages; p++) { + if (b->npages >= (int)cap_pages) { cap_pages *= 2; b->pages = (rd_book_page *)realloc(b->pages, cap_pages * sizeof(rd_book_page)); } + b->pages[b->npages].seg = seg_idx; + b->pages[b->npages].seg_char = out.pages[p].first_char; + b->npages++; + } + free(lines); free(pages); + seg_idx++; + } + free(utf8); + rdtxt_reader_free(r); + b->nsegs = seg_idx; + rc = 0; + return rc; +} + +int rd_book_open(rd_book **b, const char *path, const char *font_path, + int fs, int ls, int pw, int ph, int mx, int my, int top) +{ + if (!b || !path) return -1; + rd_book *x = (rd_book *)calloc(1, sizeof *x); + if (!x) return -6; + if (strlen(path) >= sizeof x->path) { free(x); return -2; } + strcpy(x->path, path); + if (font_path) { if (strlen(font_path) >= sizeof x->font) { free(x); return -2; } strcpy(x->font, font_path); } + /* 文件名 */ + const char *sl = strrchr(path, '/'); + strncpy(x->base, sl ? sl + 1 : path, sizeof x->base - 1); x->base[sizeof x->base - 1] = 0; + + if (fs <= 0) fs = 20; + if (ls <= 0) ls = 130; + x->fs = fs; x->ls = ls; x->pw = pw; x->ph = ph; x->mx = mx; x->my = my; x->top = top; + x->content_w = pw - 2 * mx; + x->content_h = ph - top - my; + if (x->content_w < 10 || x->content_h < 10) { close: free(x); return -3; } + + rdtxt_info info; + if (rdtxt_probe(path, &info) != 0) goto close; + x->enc = info.enc; + x->encname = encname_of(info.enc); + + if (rdft_init(&x->ft) != 0) goto close; + if (font_path && rdft_load_font(x->ft, x->font) != 0) { rdft_free(x->ft); goto close; } + if (x->ft) rdft_set_px(x->ft, fs); + + x->seg_cache_idx = -1; + if (build_index(x) != 0) { rd_book_close(x); return -5; } + x->cur = 0; + *b = x; + return 0; +} + +void rd_book_close(rd_book *b) +{ + if (!b) return; + free(b->segs); + free(b->pages); + free(b->seg_utf8); + free(b->seg_cps); + free(b->seg_lines); + free(b->seg_pages); + if (b->ft) rdft_free(b->ft); + free(b); +} + +int rd_book_pages(rd_book *b) { return b ? b->npages : 0; } +int rd_book_current(rd_book *b) { return b ? b->cur : 0; } +int rd_book_font(rd_book *b) { return b ? b->fs : 0; } +int rd_book_ls(rd_book *b) { return b ? b->ls : 0; } +void rd_book_geom(rd_book *b, int *fs, int *ls, int *pw, int *ph, int *mx, int *my, int *top) +{ + if (!b) return; + if (fs) *fs = b->fs; + if (ls) *ls = b->ls; + if (pw) *pw = b->pw; + if (ph) *ph = b->ph; + if (mx) *mx = b->mx; + if (my) *my = b->my; + if (top) *top = b->top; +} +const char *rd_book_basename(const rd_book *b) { return b ? b->base : ""; } +const char *rd_book_encname(const rd_book *b) { return b ? b->encname : ""; } +const char *rd_book_path(const rd_book *b) { return b ? b->path : ""; } + +void rd_book_anchor(rd_book *b, int *seg, int32_t *ch) +{ + if (!b || b->npages <= 0) { if (seg) *seg = 0; if (ch) *ch = 0; return; } + int p = b->cur < 0 ? 0 : (b->cur >= b->npages ? b->npages - 1 : b->cur); + if (seg) *seg = b->pages[p].seg; + if (ch) *ch = b->pages[p].seg_char; +} + +int rd_book_turn(rd_book *b, int delta) +{ + if (!b || b->npages <= 0) return 0; + int np = b->cur + delta; + if (np < 0) np = 0; + if (np >= b->npages) np = b->npages - 1; + b->cur = np; + return np; +} + +/* --- 读回一段并布局到复用缓冲(渲染用)--- */ +static int load_seg(rd_book *b, int seg_idx) +{ + if (seg_idx == b->seg_cache_idx) return 0; + seg_t *s = &b->segs[seg_idx]; + size_t cap = RDTXT_SEG_UTF8_MAX + 8; + if (!b->seg_utf8) b->seg_utf8 = (uint8_t *)malloc(cap); + if (!b->seg_utf8) return -6; + size_t ulen = 0; + if (rdtxt_convert_span(b->path, b->enc, s->file_off, s->file_len, b->seg_utf8, cap, &ulen) != RD_ENC_OK) + return -4; + size_t n = 0; + free(b->seg_cps); /* rd_utf8_to_cp 内部 malloc 新数组 */ + b->seg_cps = NULL; + if (rd_utf8_to_cp(b->seg_utf8, ulen, &b->seg_cps, &n) != RD_ENC_OK) return -5; + b->seg_cps_n = n; + /* 布局(容量:段码点数为上界) */ + if (b->seg_lines) free(b->seg_lines); + if (b->seg_pages) free(b->seg_pages); + b->seg_lines = (rd_line *)malloc((n ? n : 1) * sizeof(rd_line)); + b->seg_pages = (rd_page *)malloc((n ? n : 1) * sizeof(rd_page)); + if (!b->seg_lines || !b->seg_pages) return -6; + rd_layout_in in; + rd_layout_out out; + in.chars = b->seg_cps; in.n = (int32_t)n; in.fs = b->fs; in.line_scale = b->ls; + in.page_w = b->content_w; in.page_h = b->content_h; in.indent = b->fs; + in.meas = book_meas; in.mctx = b; + out.lines = b->seg_lines; out.pages = b->seg_pages; out.max_lines = (int)(n ? n : 1); out.max_pages = (int)(n ? n : 1); + int lrc = rd_layout(&in, &out); + if (lrc != RD_LAYOUT_OK) { b->seg_nlines = b->seg_npages = 0; b->seg_cache_idx = -1; return -4; } + b->seg_nlines = out.nlines; b->seg_npages = out.npages; + b->seg_cache_idx = seg_idx; + return 0; +} + +int rd_book_render(rd_book *b, int page_no, uint16_t *out, int pitch, uint16_t bg565, uint16_t fg565) +{ + if (!b || !out || b->npages <= 0 || page_no < 0 || page_no >= b->npages) return -1; + int npix = b->pw * b->ph; + for (int i = 0; i < npix; i++) out[i] = bg565; + + rd_book_page *pg = &b->pages[page_no]; + int seg_idx = (int)pg->seg; + if (seg_idx < 0 || seg_idx >= b->nsegs) return -1; + if (load_seg(b, seg_idx) != 0) return -2; + int local_page = page_no - b->segs[seg_idx].page_start; + if (local_page < 0 || local_page >= b->seg_npages) return 1; /* 空页 */ + rd_page *pp = &b->seg_pages[local_page]; + + int asc = rdft_ascender(b->ft); + int screen_x0 = b->mx; + int screen_y0 = b->top; + for (int li = 0; li < pp->nlines; li++) { + rd_line *ln = &b->seg_lines[pp->first_line + li]; + int pen = screen_x0 + ln->x; + int baseline = screen_y0 + ln->y + asc; + for (int32_t ci = ln->s; ci < ln->e; ci++) { + uint32_t cp = b->seg_cps[ci]; + int adv = 0, bw = 0, bh = 0, left = 0, top = 0; + const uint8_t *bmp = NULL; + rdft_glyph(b->ft, cp, &adv, &bmp, &bw, &bh, &left, &top); + if (bmp && bw > 0) + rdft_blend565(out, pitch, b->pw, b->ph, pen, baseline, bmp, bw, bh, left, top, fg565, bg565); + pen += adv; + if (cp == '\t') pen += adv; /* 制表符已由布局按空格 advance 计量,此处保持游标 */ + } + } + return 0; +} + +/* 重排 + 回锚:以 (seg,ch) 为锚重排全书;返回重排后的页(0=成功,负值=错误)。 */ +int rd_book_set_size(rd_book *b, int fs, int ls) +{ + if (!b) return -1; + if (fs <= 0) fs = b->fs; + if (ls <= 0) ls = b->ls; + int anchor_seg, anchor_ch; + rd_book_anchor(b, &anchor_seg, &anchor_ch); + return rd_book_jump_to_anchor(b, anchor_seg, anchor_ch, fs, ls); +} + +int rd_book_jump_to_anchor(rd_book *b, int seg, int32_t ch, int fs, int ls) +{ + if (!b) return -1; + if (fs != b->fs || ls != b->ls) { + b->fs = fs; b->ls = ls; + b->content_w = b->pw - 2 * b->mx; + b->content_h = b->ph - b->top - b->my; + if (b->ft) rdft_set_px(b->ft, fs); + /* 重建索引 */ + seg_t *nos = b->segs; int n_old_segs = b->nsegs; + rd_book_page *nop = b->pages; int n_old_pages = b->npages; + b->segs = NULL; b->pages = NULL; b->nsegs = b->npages = 0; + if (build_index(b) != 0) { + b->segs = nos; b->pages = nop; b->nsegs = n_old_segs; b->npages = n_old_pages; + return -5; + } + free(nos); free(nop); + } + /* 回锚:找第一个 (seg==anchorSeg && seg_char>=anchorCh) 的页,或段内第一个 seg_char>=ch;跨段按 seg 序 */ + int target = 0; + for (int p = 0; p < b->npages; p++) { + int ps = b->pages[p].seg; + if (ps < seg) { target = p + 1; continue; } + if (ps > seg) { break; } + if (b->pages[p].seg_char >= ch) { target = p; break; } + target = p; + } + if (target >= b->npages) target = b->npages - 1; + if (target < 0) target = 0; + b->cur = target; + return target; +} + +/* SDK 字库兜底:逐行回调正文文本(无 TTF/OTF 时用 meow_ui_text 渲染)。 */ +int rd_book_render_text(rd_book *b, int page_no, rd_book_line_fn fn, void *ctx) +{ + if (!b || !fn || b->npages <= 0 || page_no < 0 || page_no >= b->npages) return -1; + rd_book_page *pg = &b->pages[page_no]; + int seg_idx = (int)pg->seg; + if (seg_idx < 0 || seg_idx >= b->nsegs) return -1; + if (load_seg(b, seg_idx) != 0) return -2; + int local_page = page_no - b->segs[seg_idx].page_start; + if (local_page < 0 || local_page >= b->seg_npages) return 1; + rd_page *pp = &b->seg_pages[local_page]; + /* 单线程渲染:每行最多 content_w 个单宽字符 → ≤4B/字 UTF-8 */ + uint8_t *line_utf8 = (uint8_t *)malloc((size_t)(b->content_w * 4 + 32)); + if (!line_utf8) return -6; + for (int li = 0; li < pp->nlines; li++) { + rd_line *ln = &b->seg_lines[pp->first_line + li]; + int x = b->mx + ln->x, y = b->top + ln->y; + /* 组 utf8 */ + size_t o = 0; + for (int32_t ci = ln->s; ci < ln->e; ci++) { + uint8_t tmp[4]; + int n = rd_cp_to_utf8(b->seg_cps[ci], tmp); + memcpy(line_utf8 + o, tmp, (size_t)n); o += (size_t)n; + } + line_utf8[o] = 0; + fn(x, y, (const char *)line_utf8, (int)o, ctx); + } + free(line_utf8); + return 0; +} diff --git a/patch_v2/reader_app/app/book.h b/patch_v2/reader_app/app/book.h new file mode 100644 index 0000000..1465bf6 --- /dev/null +++ b/patch_v2/reader_app/app/book.h @@ -0,0 +1,64 @@ +/* app/book.h — 书桥:把 core(TXT/排版) + engine(FreeType) 串成「一本 TXT 书」。 + * + * 打开一本书:探测编码 → 逐段 rdtxt 流式读 → 每段 utf8→码点 → rd_layout(测量=rdft_advance) + * → 页索引(flat:每页=段+段内字符偏移)+ 段表(file_off/file_len/page_start/page_count)。 + * 渲染页:定位段 → 重读该段 → 重排 → 取该页行 → 逐字 rdft_glyph → blend565 到全屏缓冲。 + * 锚定/进度:(段,字符偏移),与字号无关;改字号/行距触发后台重排并回锚(§6.3)。 + * + * 内存纪律:单段(文本+cps+布局)≈ 320KB 冲击,随段释放;页索引 flat ~每页 12B;3 页位图由 + * 阅读 view 持有(本模块只填一个渲染目标缓冲,不缓存整页)。 + */ +#ifndef RDBOOK_H +#define RDBOOK_H + +#include "rdenc.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rd_book rd_book; + +typedef struct rd_book_page { + int32_t seg; /* 段下标 */ + int32_t seg_char; /* 段内字符偏移(页首) */ +} rd_book_page; + +/* 打开书:path=TXT;font_path=FreeType 字体;geom=版面(fs 字号 / ls 行距% / pw,ph 全屏 / + * mx,my 左右/上下边距 / top 顶部 inset(状态栏+顶条))。0=成功。 */ +int rd_book_open(rd_book **b, const char *path, const char *font_path, + int fs, int ls, int pw, int ph, int mx, int my, int top); +void rd_book_close(rd_book *b); + +int rd_book_pages(rd_book *b); +int rd_book_current(rd_book *b); /* 当前页 */ +int rd_book_turn(rd_book *b, int delta); /* +1/-1;clamp 到 [0,npages-1] */ +void rd_book_anchor(rd_book *b, int *seg, int32_t *ch);/* 当前页锚(段,字符偏移) */ +int rd_book_jump_to_anchor(rd_book *b, int seg, int32_t ch, int fs, int ls); /* 重排 + 回锚 */ +int rd_book_set_size(rd_book *b, int fs, int ls); /* 重排 + 回锚(anchor=当前页) */ + +/* 渲染页到全屏缓冲:out 为 pw*ph RGB565(每行 pitch 字节);先填 bg565 再画正文。 + * 0=成功;1=该页为空(无正文,如末页空白)。 */ +int rd_book_render(rd_book *b, int page_no, uint16_t *out, int pitch, uint16_t bg565, uint16_t fg565); + +/* SDK 字库兜底:逐行回调(每行一个 utf8 文本串,屏幕坐标 x,y 已含 inset/边距)。 + * 用于「无 TTF/OTF → 用 meow_ui_text 位图字库渲染正文」的降级路径(见 reader 视图取舍)。 */ +typedef void (*rd_book_line_fn)(int x, int y, const char *utf8, int len, void *ctx); +int rd_book_render_text(rd_book *b, int page_no, rd_book_line_fn fn, void *ctx); + +/* 书名/信息(章节名:TXT 无章节=文件名;enc 可读名)。调用方 strcpy 到自己的缓冲。 */ +const char *rd_book_basename(const rd_book *b); /* 文件名(路径尾分量) */ +const char *rd_book_encname(const rd_book *b); +const char *rd_book_path(const rd_book *b); /* 原始路径 */ + +/* 字体/几何 */ +int rd_book_font(rd_book *b); /* 当前字号 */ +int rd_book_ls(rd_book *b); /* 行距% */ +void rd_book_geom(rd_book *b, int *fs, int *ls, int *pw, int *ph, int *mx, int *my, int *top); + +#ifdef __cplusplus +} +#endif +#endif /* RDBOOK_H */ diff --git a/patch_v2/reader_app/app/progress.c b/patch_v2/reader_app/app/progress.c new file mode 100644 index 0000000..4d0800c --- /dev/null +++ b/patch_v2/reader_app/app/progress.c @@ -0,0 +1,102 @@ +/* app/progress.c — 进度持久化(实现见 app/progress.h)。 */ +#include "progress.h" +#include "meow_ui.h" /* meow_config_dir() */ +#include +#include +#include +#include +#include + +/* 从 MEOW_DATA_DIR(/MeowData//data)剥掉尾 "/data",得到 /MeowData/。 */ +static void strip_data_suffix(const char *d, char *out, int outsz) +{ + if (!d || !d[0]) { strncpy(out, "/tmp", (size_t)outsz - 1); out[outsz - 1] = 0; return; } + size_t n = strlen(d); + const char *suffix = "/data"; + size_t sl = strlen(suffix); + size_t keep; + if (n >= sl && strcmp(d + n - sl, suffix) == 0) keep = n - sl; + else keep = n; + if (keep >= (size_t)outsz) keep = (size_t)outsz - 1; + memcpy(out, d, keep); + out[keep] = 0; +} + +int rdprog_dir(char *out, int outsz) +{ + if (!out || outsz <= 0) return -1; + const char *data = meow_config_dir(); + char base[360]; + strip_data_suffix(data ? data : "", base, sizeof base); + if (snprintf(out, (size_t)outsz, "%s/progress", base) >= outsz) return -2; + /* mkdir -p */ + char tmp[400]; + strncpy(tmp, out, sizeof tmp - 1); tmp[sizeof tmp - 1] = 0; + for (char *p = tmp + 1; *p; p++) { + if (*p == '/') { *p = 0; mkdir(tmp, 0755); *p = '/'; } + } + mkdir(tmp, 0755); + return 0; +} + +void rdprog_hash(const char *book_path, char *out, int outsz) +{ + uint32_t h = 2166136261u; + for (const unsigned char *p = (const unsigned char *)book_path; *p; p++) { + h ^= *p; h *= 16777619u; + } + snprintf(out, (size_t)outsz, "%08x.prog", h); +} + +static int rdprog_path(const char *book_path, char *out, int outsz, + int *created_dir) +{ + char dir[400]; + if (rdprog_dir(dir, sizeof dir) != 0) return -1; + char name[24]; + rdprog_hash(book_path, name, sizeof name); + if (snprintf(out, (size_t)outsz, "%s/%s", dir, name) >= outsz) return -2; + if (created_dir) *created_dir = 1; + return 0; +} + +int rdprog_load(const char *book_path, rdprog *p) +{ + if (!book_path || !p) return -1; + char path[440]; + if (rdprog_path(book_path, path, sizeof path, NULL) != 0) return -1; + FILE *f = fopen(path, "rb"); + if (!f) return 0; + char line[256]; + int seg = 0, fs = 0, ls = 0; int32_t ch = 0; uint64_t ts = 0; int v = 0, found = 0; + while (fgets(line, sizeof line, f)) { + if (sscanf(line, "v=%d", &v) == 1) { if (v == 1) found = 1; } + else if (sscanf(line, "seg=%d", &seg) == 1) { /* no-op */ } + else if (sscanf(line, "ch=%d", &ch) == 1) { /* no-op */ } + else if (sscanf(line, "fs=%d", &fs) == 1) { /* no-op */ } + else if (sscanf(line, "ls=%d", &ls) == 1) { /* no-op */ } + else if (sscanf(line, "ts=%llu", (unsigned long long *)&ts) == 1) { /* no-op */ } + } + fclose(f); + if (!found) return 0; + p->valid = 1; p->seg = seg; p->ch = ch; p->fs = fs; p->ls = ls; p->ts = ts; + return 1; +} + +int rdprog_save(const char *book_path, const rdprog *p) +{ + if (!book_path || !p) return -1; + char path[440]; + if (rdprog_path(book_path, path, sizeof path, NULL) != 0) return -1; + FILE *f = fopen(path, "wb"); + if (!f) return -1; + /* 先写临时再改原子(exFAT 无 rename+replace 语义保证,直接写亦可接受) */ + fprintf(f, "v=1\n"); + fprintf(f, "seg=%d\n", p->seg); + fprintf(f, "ch=%d\n", (int)p->ch); + fprintf(f, "fs=%d\n", p->fs); + fprintf(f, "ls=%d\n", p->ls); + fprintf(f, "ts=%llu\n", (unsigned long long)p->ts); + fclose(f); + return 0; +} diff --git a/patch_v2/reader_app/app/progress.h b/patch_v2/reader_app/app/progress.h new file mode 100644 index 0000000..cb88baf --- /dev/null +++ b/patch_v2/reader_app/app/progress.h @@ -0,0 +1,42 @@ +/* app/progress.h — 进度持久化:`MeowData/os.meow.reader/progress/`(每书 = path hash 文件)。 + * + * 内容(文本,可读可调):v=1 / seg=<段> / ch=<字符偏移> / fs=<字号> / ls=<行距%> / ts=。 + * 锚定是(段,字符偏移),与字号无关 → 换字号书签不失效(READER_ENGINE_NOTES §6.3)。 + * 无 SDK 之外依赖;目录推导:MEOW_DATA_DIR(launcher 注入 /MeowData//data)去皮 /data → + * /MeowData/,接 "progress";无 env(宿主/无卡)回退 /tmp/meowcfg_/progress。 + */ +#ifndef RDPROG_H +#define RDPROG_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rdprog { + int valid; /* 1=有档 */ + int seg; + int32_t ch; + int fs; + int ls; + uint64_t ts; /* 最近阅读 unix 秒 */ +} rdprog; + +/* 组装 progress 目录路径并 mkdir -p。成功 0(out 填目录绝对路径);负值错误。 */ +int rdprog_dir(char *out, int outsz); + +/* 由书路径算 hash 文件名(FNV-1a 32bit hex)写 out(≥20 字节)。 */ +void rdprog_hash(const char *book_path, char *out, int outsz); + +/* 读进度:1=有档(填 p);0=无/不存在;负值=IO 错。 */ +int rdprog_load(const char *book_path, rdprog *p); + +/* 写进度。0=成功;负值=IO/无法建目录(不崩)。 */ +int rdprog_save(const char *book_path, const rdprog *p); + +#ifdef __cplusplus +} +#endif +#endif /* RDPROG_H */ diff --git a/patch_v2/reader_app/app/reader.c b/patch_v2/reader_app/app/reader.c new file mode 100644 index 0000000..f27da20 --- /dev/null +++ b/patch_v2/reader_app/app/reader.c @@ -0,0 +1,334 @@ +/* app/reader.c — 阅读页:W_CUSTOM 画布 + 三栏交互 + 中央菜单占位 + 顶栏进度/章节名 + 进度持久化。 + * + * 渲染:W_CUSTOM 画布覆盖全屏;render_cb 画帧 = 填底色 → 翻页 blit(FreeType 页位图缓存 / + * 无字体则 SDK 位图字库兜底直绘)→ 顶栏 → 菜单覆盖层。翻页 = 局部脏区(flush_region)。 + * 交互:点击左/右 1/3 翻页;中央唤菜单(字号±/行距±/返回);左滑=下一页、右滑=上一页。 + * 进度:打开自动续读;换字号重排回锚(段,字符偏移);离开/翻页时保存。 + */ +#include "../reader_internal.h" +#include "meow_ui_internal.h" /* back_buf/pitch/bpp 访问器(决策见报告) */ +#include "book.h" +#include "progress.h" +#include +#include +#include +#include +#include +#include + +#define RD_MENU_H 64 +#define RD_MENU_BTN 5 + +static rd_book *g_book; +static int g_reader_active; +static meow_widget *g_canvas; +static int g_pw, g_ph, g_top, g_mx, g_my; +static int g_fs, g_ls; +#define RD_PAGE_CACHE 3 +#define RD_PAGE_SLOT_CUR 1 +static uint16_t *g_page_buf[RD_PAGE_CACHE]; /* [0]=prev [1]=cur [2]=next(FreeType 页位图) */ +static int g_has_font; /* 1=FreeType 路径;0=SDK 字库兜底 */ +static int g_menu_open; +static char g_font_path[400]; +static int g_notice_ms; + +static uint32_t g_page_bg, g_page_fg; /* 正文页底/字色(24bit) */ +static char g_chapter[128]; /* 顶栏章节名(TXT 无章节=文件名) */ + +#define RD_READER_DEFAULT_FS 20 +#define RD_READER_DEFAULT_LS 130 + +/* 前向声明(reader_reflow* 依赖 reader_refill/redraw,定义在后) */ +static void reader_redraw(void); +static int reader_refill_page(void); +static void reader_reflow_persist(void); + +/* ---------- 工具 ---------- */ +static uint16_t rgb565(uint32_t c) +{ + int r = (c >> 16) & 0xFF, g = (c >> 8) & 0xFF, b = c & 0xFF; + return (uint16_t)(((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)); +} + +/* 递归(深度≤3)扫 MeowOS/fonts/ 找第一个 .otf/.ttf。0=找到。 */ +static int find_font_rec(const char *dir, int depth) +{ + if (depth > 3) return 0; + DIR *dp = opendir(dir); + if (!dp) return 0; + struct dirent *de; + int found = 0; + while ((de = readdir(dp)) && !found) { + if (de->d_name[0] == '.') continue; + char full[480]; + if (snprintf(full, sizeof full, "%s/%s", dir, de->d_name) >= (int)sizeof full) continue; + struct stat st; + if (stat(full, &st) != 0) continue; + if (S_ISDIR(st.st_mode)) { found = find_font_rec(full, depth + 1); } + else { + const char *d = strrchr(de->d_name, '.'); + if (d && (strcasecmp(d, ".otf") == 0 || strcasecmp(d, ".ttf") == 0)) { + if (strlen(full) < sizeof g_font_path) { + strcpy(g_font_path, full); + found = 1; + } + } + } + } + closedir(dp); + return found; +} +static const char *resolve_font(void) +{ + g_font_path[0] = 0; + if (find_font_rec(READER_SD_ROOT "/MeowOS/fonts", 0)) return g_font_path; + return NULL; +} + +static void chapter_name(void) +{ + /* TXT 无章节 → 文件名;R1 固定。 */ + snprintf(g_chapter, sizeof g_chapter, "%s", rd_book_basename(g_book)); +} + +static void reader_reflow(void) +{ + if (!g_book) return; + int seg = 0; int32_t ch = 0; + rd_book_anchor(g_book, &seg, &ch); /* 记录当前锚,重排后回锚 */ + rd_book_jump_to_anchor(g_book, seg, ch, g_fs, g_ls); + reader_refill_page(); + reader_redraw(); + reader_reflow_persist(); +} + +static void reader_reflow_persist(void) +{ + if (!g_book) return; + int seg = 0; int32_t ch = 0; + rd_book_anchor(g_book, &seg, &ch); + rdprog p; + p.valid = 1; p.seg = seg; p.ch = ch; p.fs = g_fs; p.ls = g_ls; p.ts = (uint64_t)time(NULL); + rdprog_save(rd_book_path(g_book), &p); +} + +/* ---------- 渲染(W_CUSTOM render_cb) ---------- */ +static void reader_draw_line_atlas(int x, int y, const char *utf8, int len, void *ctx) +{ + (void)ctx; (void)len; + meow_ui_text(x, y, utf8, (g_fs <= 20) ? 20 : 28, g_page_fg); +} + +static void reader_canvas_render(meow_widget *w, const meow_theme *th, void *ctx) +{ + (void)w; (void)ctx; + meow_ui_clear(g_page_bg); + if (g_book) { + int page = rd_book_current(g_book); + if (g_has_font && g_page_buf[RD_PAGE_SLOT_CUR]) { + /* 翻页 blit:行拷贝当前页位图 → back_buf(局部脏区由 flush_region 上屏) */ + unsigned char *bb = meow_ui_back_buf(); + int pitch = meow_ui_back_buf_pitch(); + int bpp = meow_ui_back_buf_bpp(); + uint16_t *src = g_page_buf[RD_PAGE_SLOT_CUR]; + if (bb && pitch > 0 && bpp == 16) { + for (int y = 0; y < g_ph; y++) + memcpy(bb + (size_t)y * pitch, src + (size_t)y * g_pw, (size_t)g_pw * 2); + } + } else { + rd_book_render_text(g_book, page, reader_draw_line_atlas, NULL); + } + } + /* 顶栏:进度% + 章节名(避开系统状态栏) */ + int sbh = meow_ui_statusbar_height(); + int pages = rd_book_pages(g_book); + int page = rd_book_current(g_book); + char pct[16]; + int p = pages > 0 ? (page * 100 / pages) : 0; + snprintf(pct, sizeof pct, "%d%%", p); + meow_ui_fill_rect(0, sbh, g_pw, (g_top - 4 - sbh), g_page_bg); + meow_ui_text(16, sbh + 4, g_chapter[0] ? g_chapter : "阅读", 20, th->fg); + meow_ui_text_right(g_pw - 16, sbh + 4, pct, 20, th->fg); + meow_ui_draw_rect(0, g_top - 5, g_pw, 1, th->outline); + + if (g_menu_open) { + int y = g_ph - RD_MENU_H; + meow_ui_fill_rect_alpha(0, y, g_pw, RD_MENU_H, 0x000000, 160); + /* 5 按钮:返回 | 字号− | 字号+ | 行距− | 行距+ */ + int bw = g_pw / RD_MENU_BTN; + const char *labels[RD_MENU_BTN] = { "返回", "字-", "字+", "距-", "距+" }; + for (int i = 0; i < RD_MENU_BTN; i++) { + int bx = i * bw; + meow_ui_fill_rect(bx + 4, y + 12, bw - 8, RD_MENU_H - 24, th->surfaceContainer); + meow_ui_text_center(bx + bw / 2, y + (RD_MENU_H - 20) / 2 - 6, labels[i], 20, th->fg); + } + } +} + +static void reader_redraw(void) +{ + if (!g_canvas) return; + meow_widget_draw(g_canvas); /* → render_cb 画帧 */ + meow_ui_flush_region(0, 0, g_pw, g_ph); +} + +static void reader_free_page_bufs(void) +{ + for (int i = 0; i < RD_PAGE_CACHE; i++) { free(g_page_buf[i]); g_page_buf[i] = NULL; } +} + +/* 渲染当前页 + 前后各一页到 3 槽缓存(对齐设计「当前±前±后」;动画档为 无/滑动/淡入 R1 默认无)。 */ +static int reader_refill_page(void) +{ + if (!g_book) return -1; + if (g_has_font && g_page_buf[RD_PAGE_SLOT_CUR]) { + uint16_t bg = rgb565(g_page_bg), fg = rgb565(g_page_fg); + int cur = rd_book_current(g_book); + int np = rd_book_pages(g_book); + int slots[RD_PAGE_CACHE] = { cur - 1, cur, cur + 1 }; + for (int i = 0; i < RD_PAGE_CACHE; i++) { + int p = slots[i]; + if (p >= 0 && p < np) rd_book_render(g_book, p, g_page_buf[i], g_pw * 2, bg, fg); + else for (int y = 0; y < g_ph; y++) /* 空白槽填背景 */ + for (int x = 0; x < g_pw; x++) g_page_buf[i][(size_t)y * g_pw + x] = bg; + } + return 0; + } + return 0; /* 兜底路径:render_text 直绘 */ +} + +/* ---------- 打开 ---------- */ +void reader_open(const char *path) +{ + if (!path || !path[0]) return; + if (g_book) { rd_book_close(g_book); g_book = NULL; } + reader_free_page_bufs(); + + const char *fp = resolve_font(); + g_has_font = (fp != NULL); + g_fs = RD_READER_DEFAULT_FS; g_ls = RD_READER_DEFAULT_LS; + + /* 进度(含字号/行距偏好) */ + rdprog prog; + int hasprog = (rdprog_load(path, &prog) == 1) && prog.valid; + if (hasprog) { if (prog.fs >= 14 && prog.fs <= 40) g_fs = prog.fs; if (prog.ls >= 100 && prog.ls <= 200) g_ls = prog.ls; } + + int sbh = meow_ui_statusbar_height(); + g_pw = meow_ui_width(); g_ph = meow_ui_height(); + g_top = sbh + 34; g_mx = 16; g_my = 20; + + const meow_theme *th = meow_theme_get(); + g_page_bg = th->surface; g_page_fg = th->onSurface; + + /* 开书(FreeType 路径带齐几何;无字体则 g_has_font=0 → atlas 兜底) */ + int rc = rd_book_open(&g_book, path, fp, g_fs, g_ls, g_pw, g_ph, g_mx, g_my, g_top); + if (rc != 0) { + meow_log(MEOW_LOG_WARN, "book open failed rc=%d path=%s", rc, path); + g_book = NULL; g_has_font = 0; + g_notice_ms = 3000; + return; + } + chapter_name(); + + if (g_has_font) { + reader_free_page_bufs(); + for (int i = 0; i < RD_PAGE_CACHE; i++) + g_page_buf[i] = (uint16_t *)malloc((size_t)g_pw * (size_t)g_ph * 2); + if (!g_page_buf[RD_PAGE_SLOT_CUR]) { reader_free_page_bufs(); g_has_font = 0; } + } + + /* 续读:进度锚(段,字符偏移)→ 跳页 */ + if (hasprog && g_book) { + rd_book_jump_to_anchor(g_book, prog.seg, prog.ch, g_fs, g_ls); + } + + reader_refill_page(); + + g_menu_open = 0; + if (g_reader_active) reader_redraw(); +} + +/* ---------- 视图生命周期 ---------- */ +static void reader_on_create(meow_view *v, void *ctx) { (void)v; (void)ctx; } +static void reader_on_enter(meow_view *v, void *ctx) +{ + (void)v; (void)ctx; + g_reader_active = 1; + if (g_book) { reader_refill_page(); chapter_name(); } + reader_redraw(); +} +static void reader_on_leave(meow_view *v, void *ctx) +{ + (void)v; (void)ctx; + reader_reflow_persist(); /* 离开保存进度 */ + g_reader_active = 0; +} +static void reader_on_destroy(meow_view *v, void *ctx) +{ + (void)v; (void)ctx; + if (g_book) rd_book_close(g_book); + g_book = NULL; + reader_free_page_bufs(); + g_menu_open = 0; g_reader_active = 0; +} + +meow_view *reader_view_create(void) +{ + static meow_view_hooks hooks = { reader_on_create, reader_on_enter, reader_on_leave, + reader_on_destroy, NULL, NULL, NULL }; + meow_view *v = meow_view_create(ACT_READER, MEOW_VIEW_ACTIVITY, &hooks, NULL); + g_canvas = meow_widget_custom_create(0, 0, 480, 720, reader_canvas_render, NULL, NULL); + meow_view_add_widget(v, g_canvas); + return v; +} + +int reader_is_active(void) { return g_reader_active; } + +void reader_on_tap(int x, int y) +{ + if (!g_book) { return; } + if (g_menu_open) { + /* 菜单按钮命中 */ + int y0 = g_ph - RD_MENU_H; + if (y >= y0) { + int bw = g_pw / RD_MENU_BTN; + int idx = x / bw; + switch (idx) { + case 0: /* 返回书架 */ + g_menu_open = 0; + reader_reflow_persist(); + meow_view_page_pop(); + return; + case 1: if (g_fs > 14) { g_fs -= 2; reader_reflow(); } break; + case 2: if (g_fs < 40) { g_fs += 2; reader_reflow(); } break; + case 3: if (g_ls > 100) { g_ls -= 5; reader_reflow(); } break; + case 4: if (g_ls < 200) { g_ls += 5; reader_reflow(); } break; + } + if (y >= y0) return; + } + g_menu_open = 0; /* 点菜单外关闭 */ + reader_redraw(); + return; + } + /* 三栏:左 1/3 上一页、右 1/3 下一页、中央唤菜单 */ + if (x < g_pw / 3) { rd_book_turn(g_book, -1); reader_refill_page(); reader_redraw(); } + else if (x > g_pw * 2 / 3) { rd_book_turn(g_book, 1); reader_refill_page(); reader_redraw(); } + else { g_menu_open = 1; reader_redraw(); } +} + +void reader_on_swipe(int dir, int dx, int dy) +{ + (void)dx; (void)dy; + if (!g_book) return; + if (g_menu_open) { g_menu_open = 0; reader_redraw(); return; } + if (dir == MEOW_SWIPE_LEFT) { rd_book_turn(g_book, 1); } + else if (dir == MEOW_SWIPE_RIGHT) { rd_book_turn(g_book, -1); } + else return; + reader_refill_page(); reader_redraw(); +} + +void reader_on_tick(uint64_t now) +{ + (void)now; + if (g_notice_ms > 0) { g_notice_ms--; if (g_notice_ms == 0) reader_redraw(); } +} diff --git a/patch_v2/reader_app/app/shelf.c b/patch_v2/reader_app/app/shelf.c new file mode 100644 index 0000000..fe4ee35 --- /dev/null +++ b/patch_v2/reader_app/app/shelf.c @@ -0,0 +1,184 @@ +/* app/shelf.c — 书架:扫 TF 卡 `Books/`,识别 TXT/FB2/EPUB/MOBI/CBZ(R1 仅 TXT 可开, + * 其它显示「R2 支持」占位);卡片列表 + 最近阅读置顶(按 progress ts 降序)。 + * 用 W_LISTVIEW(结构化列表)+ App 自绘标题。空态=清屏提示。 + */ +#include "../reader_internal.h" +#include "progress.h" +#include +#include +#include +#include +#include + +#define SHELF_LIST_X 0 +#define SHELF_LIST_Y 64 +#define SHELF_LIST_W 480 +#define SHELF_LIST_H (720 - 64) + +typedef struct shelf_book { + char path[400]; + char title[128]; + char sub[160]; + int fmt; /* 0 txt,1 fb2,2 epub,3 mobi,4 cbz */ + long size; + uint64_t ts; /* 最近阅读 unix;无=0 */ +} shelf_book; + +static shelf_book g_books[256]; +static int g_nbooks; +static int g_active; +static meow_widget *g_list; +static uint32_t g_bg, g_fg, g_dim; +static char g_notice[160]; /* 空态/提示 */ +static int g_notice_ms; /* 剩余显示 ms(0=无) */ + +static const char *fmt_name(int f) +{ + switch (f) { case 0: return "TXT"; case 1: return "FB2"; case 2: return "EPUB"; + case 3: return "MOBI"; case 4: return "CBZ"; default: return "?"; } +} +static int fmt_from_ext(const char *name) +{ + const char *d = strrchr(name, '.'); + if (!d) return -1; + if (strcasecmp(d, ".txt") == 0) return 0; + if (strcasecmp(d, ".fb2") == 0) return 1; + if (strcasecmp(d, ".epub") == 0) return 2; + if (strcasecmp(d, ".mobi") == 0) return 3; + if (strcasecmp(d, ".cbz") == 0) return 4; + return -1; +} +static void fmt_size(char *out, int outsz, long s) +{ + if (s >= 1 << 20) snprintf(out, outsz, "%.1fMB", (double)s / (1 << 20)); + else if (s >= 1 << 10) snprintf(out, outsz, "%.0fKB", (double)s / (1 << 10)); + else snprintf(out, outsz, "%ldB", s); +} + +static int cmp_recent_then_name(const void *a, const void *b) +{ + const shelf_book *x = (const shelf_book *)a, *y = (const shelf_book *)b; + if (x->ts != y->ts) return (x->ts < y->ts) ? 1 : -1; /* 最近在前 */ + return strcasecmp(x->title, y->title); +} + +static void scan_books(void) +{ + const char *dir = READER_SD_ROOT "/Books"; + g_nbooks = 0; + DIR *dp = opendir(dir); + if (!dp) { + snprintf(g_notice, sizeof g_notice, "未找到 %s 目录,请放入书籍(TXT)", dir); + g_notice_ms = 4000; + return; + } + struct dirent *de; + while ((de = readdir(dp)) && g_nbooks < 256) { + if (de->d_name[0] == '.') continue; + int f = fmt_from_ext(de->d_name); + if (f < 0) continue; + shelf_book *b = &g_books[g_nbooks]; + if (snprintf(b->path, sizeof b->path, "%s/%s", dir, de->d_name) >= (int)sizeof b->path) continue; + strncpy(b->title, de->d_name, sizeof b->title - 1); b->title[sizeof b->title - 1] = 0; + char *dot = strrchr(b->title, '.'); + if (dot) *dot = 0; /* 标题去扩展名 */ + b->fmt = f; + struct stat st; + b->size = (stat(b->path, &st) == 0) ? (long)st.st_size : 0; + rdprog p; + b->ts = (rdprog_load(b->path, &p) == 1) ? p.ts : 0; + char sz[24]; fmt_size(sz, sizeof sz, b->size); + snprintf(b->sub, sizeof b->sub, "%s · %s%s", fmt_name(f), sz, + b->ts ? " · 读" : ""); + g_nbooks++; + } + closedir(dp); + qsort(g_books, (size_t)g_nbooks, sizeof(shelf_book), cmp_recent_then_name); +} + +/* listview 行源 */ +static int shelf_list_src(int idx, meow_list_item *out, void *ctx) +{ + (void)ctx; + if (idx < 0 || idx >= g_nbooks) return 0; + const shelf_book *b = &g_books[idx]; + out->icon_kind = MEOW_LIST_ICON_FILE; + out->title = b->title; + out->subtitle = b->sub; + out->right = MEOW_LIST_RIGHT_ARROW; + out->enabled = 1; + out->on = 0; + return 1; +} + +static void shelf_list_tapcb(int idx, int op, void *ctx) +{ + (void)op; (void)ctx; + if (idx < 0 || idx >= g_nbooks) return; + const shelf_book *b = &g_books[idx]; + if (b->fmt == 0) { reader_open(b->path); } + else { snprintf(g_notice, sizeof g_notice, "%s 格式 R2 支持(R1 先看 TXT)", fmt_name(b->fmt)); g_notice_ms = 2500; } +} + +/* view 生命周期 */ +static void shelf_on_create(meow_view *v, void *ctx) { (void)v; (void)ctx; } +static void shelf_on_enter(meow_view *v, void *ctx) +{ + (void)v; (void)ctx; + g_active = 1; + scan_books(); /* 回到书架即重扫(新增/最近读置顶刷新) */ + const meow_theme *th = meow_theme_get(); + g_bg = th->bg; g_fg = th->fg; g_dim = th->dim; + /* 无控件时重建列表(首次/回到书架) */ + if (g_list) { meow_widget_free(g_list); g_list = NULL; } + g_list = meow_listview_create(SHELF_LIST_X, SHELF_LIST_Y, SHELF_LIST_W, SHELF_LIST_H, + g_nbooks, shelf_list_src, NULL, MEOW_LIST_SEL_SINGLE); + meow_listview_set_on_tap(g_list, shelf_list_tapcb, NULL); + shelf_redraw(); +} +static void shelf_on_leave(meow_view *v, void *ctx) { (void)v; (void)ctx; g_active = 0; } +static void shelf_on_destroy(meow_view *v, void *ctx) +{ + (void)v; (void)ctx; + if (g_list) { meow_widget_free(g_list); g_list = NULL; } +} + +meow_view *shelf_view_create(void) +{ + static meow_view_hooks hooks = { shelf_on_create, shelf_on_enter, shelf_on_leave, + shelf_on_destroy, NULL, NULL, NULL }; + return meow_view_create(ACT_SHELF, MEOW_VIEW_ACTIVITY, &hooks, NULL); +} + +int shelf_is_active(void) { return g_active; } + +void shelf_redraw(void) +{ + const meow_theme *th = meow_theme_get(); + g_bg = th->bg; g_fg = th->fg; g_dim = th->dim; + meow_ui_clear(g_bg); + meow_ui_text(20, 22, "书架", 28, g_fg); + /* 副标题:格式化说明 */ + char sub[96]; snprintf(sub, sizeof sub, "Books/ · %d 本", g_nbooks); + meow_ui_text(20, 24 + 34, sub, 20, g_dim); + + if (g_list) meow_widget_draw(g_list); + if (g_nbooks == 0) { + meow_ui_text(30, 320, "书架为空:请往 TF 卡 Books/ 放书籍", 20, g_dim); + meow_ui_text(30, 348, "支持 TXT(可读) / FB2 / EPUB / MOBI / CBZ(R2)", 20, g_dim); + } + if (g_notice_ms > 0) { + meow_ui_fill_rect(0, 620, 480, 44, g_bg); + meow_ui_text(20, 630, g_notice, 20, th->primary); + } + meow_ui_flush(); +} + +int shelf_on_tap(int x, int y) +{ + if (g_list && g_nbooks > 0) { + int idx = meow_listview_tap_at(g_list, x, y); + if (idx >= 0) { shelf_redraw(); return 1; } /* 选中已由 SDK 标脏;重绘 */ + } + return 0; +} diff --git a/patch_v2/reader_app/build_reader.sh b/patch_v2/reader_app/build_reader.sh new file mode 100755 index 0000000..d261039 --- /dev/null +++ b/patch_v2/reader_app/build_reader.sh @@ -0,0 +1,93 @@ +#!/bin/bash +# build_reader.sh — os.meow.reader R1 可复现构建:vendor FreeType(mipsel musl 静态) → 链 reader 二进制 +# + 宿主 core 单测 + qemu-mipsel FreeType 冒烟。 +# +# 产物: +# reader mipsel 静态 ELF(链 meow_ui.a + FreeType + core + engine) +# test/test_reader_core_host 宿主 core 单测(enc/layout/kinsoku/page/reflow/txt) +# test/rdft_smoke_mipsel qemu-mipsel FreeType 封装冒烟 +# +# 约束:只写本目录(patch_v2/reader_app/);不改 sdk/;-Wall -Wextra 0 warning。 +# vendor/(FreeType 源码+构建产物)gitignore,不入仓;build 脚本可复现。 +set -e +cd "$(dirname "$0")" +ROOT="$HOME/Project/R3ProII" +CC="$ROOT/.tools/zig-mipsel-cc" +SYSROOT="$ROOT/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf" +HOST_CC="${HOST_CC:-gcc}" + +FT_VER="2.14.3" +VENDOR="$PWD/vendor" +FT_SRC="$VENDOR/freetype-src" +FT_BUILD="$VENDOR/freetype-build" +FT_INC_SRC="$FT_SRC/include" +FT_INC_BUILD="$FT_BUILD/include" + +# ---------- 1) FreeType vendor 拉取 ---------- +mkdir -p "$VENDOR" +fetch_freetype() { + # 优先级:env FREETYPE_SRC → 本目录 vendor 已存在 → /tmp/freetype → 下载 + if [ -n "$FREETYPE_SRC" ] && [ -f "$FREETYPE_SRC/CMakeLists.txt" ]; then + cp -r "$FREETYPE_SRC" "$FT_SRC" + elif [ ! -d "$FT_SRC" ] && [ -f /tmp/freetype/CMakeLists.txt ]; then + cp -r /tmp/freetype "$FT_SRC" + elif [ ! -d "$FT_SRC" ]; then + echo "==> downloading freetype $FT_VER" + rm -rf "$FT_SRC" + ( cd "$VENDOR" && curl -fsSL -o ft.tar.xz \ + "https://download.savannah.gnu.org/releases/freetype/freetype-$FT_VER.tar.xz" \ + && mkdir -p "$FT_SRC" && tar xf ft.tar.xz -C "$FT_SRC" --strip-components=1 && rm ft.tar.xz ) + fi + [ -f "$FT_SRC/CMakeLists.txt" ] || { echo "FREETYPE_SRC 不可用/下载失败"; exit 1; } +} +fetch_freetype + +# ---------- 2) FreeType mipsel 交叉静态构建(禁用可选项,只要最简) ---------- +if [ ! -f "$FT_BUILD/libfreetype.a" ] || [ -n "$FORCE_FT" ]; then + rm -rf "$FT_BUILD" + cmake -S "$FT_SRC" -B "$FT_BUILD" \ + -DCMAKE_SYSTEM_NAME=Linux \ + -DCMAKE_C_COMPILER="$CC" \ + -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF \ + -DFT_DISABLE_ZLIB=TRUE -DFT_DISABLE_BZIP2=TRUE -DFT_DISABLE_PNG=TRUE \ + -DFT_DISABLE_HARFBUZZ=TRUE -DFT_DISABLE_BROTLI=TRUE \ + >/dev/null + cmake --build "$FT_BUILD" -j"$(nproc)" >/dev/null 2>&1 +fi +[ -f "$FT_BUILD/libfreetype.a" ] || { echo "FreeType build FAILED"; exit 1; } +FT_INCS="-I$FT_BUILD -I$FT_INC_BUILD -I$FT_INC_SRC" +echo "==> freetype.a: $(du -h "$FT_BUILD/libfreetype.a" | cut -f1)" + +# ---------- 3) 宿主 core 单测 ---------- +echo "==> host core test" +$HOST_CC -O2 -Wall -Wextra -Icore -I. test/test_reader_core.c \ + core/rdenc.c core/rdlayout.c core/rdtxt.c -o test/test_reader_core_host -lm +./test/test_reader_core_host + +# ---------- 4) qemu-mipsel FreeType 冒烟 ---------- +echo "==> mipsel ft smoke" +$CC -Os -static -Wall -Wextra -Iengine $FT_INCS test/rdft_smoke.c engine/rdft.c \ + "$FT_BUILD/libfreetype.a" -o test/rdft_smoke_mipsel +timeout 120 qemu-mipsel ./test/rdft_smoke_mipsel "${FONT:-$ROOT/font/src/MiSans-Regular.otf}" + +# ---------- 4b) qemu-mipsel 书桥全链路冒烟 ---------- +echo "==> mipsel book smoke" +$CC -Os -static -Wall -Wextra -Iapp -Icore -Iengine $FT_INCS test/book_smoke.c \ + app/book.c core/rdenc.c core/rdlayout.c core/rdtxt.c engine/rdft.c \ + "$FT_BUILD/libfreetype.a" -o test/book_smoke_mipsel +timeout 120 qemu-mipsel ./test/book_smoke_mipsel "${FONT:-$ROOT/font/src/MiSans-Regular.otf}" + +# ---------- 5) reader 二进制(mipsel 静态) ---------- +echo "==> reader binary" +CORE="core/rdenc.c core/rdlayout.c core/rdtxt.c" +ENGINE="engine/rdft.c" +APP="app.c app/shelf.c app/reader.c app/book.c app/progress.c" +$CC -Os -static -Wall -Wextra -I../sdk -I. -Icore -Iapp -Iengine $FT_INCS \ + $CORE $APP $ENGINE \ + ../sdk/meow_ui.a "$SYSROOT/lib/libz.a" "$FT_BUILD/libfreetype.a" -lpthread -o reader +ls -la reader +file reader +echo " 运行(qemu): qemu-mipsel ./reader" +echo "build_reader OK" diff --git a/patch_v2/reader_app/core/gb18030_table.h b/patch_v2/reader_app/core/gb18030_table.h new file mode 100644 index 0000000..886a96c --- /dev/null +++ b/patch_v2/reader_app/core/gb18030_table.h @@ -0,0 +1,3169 @@ +/* gb18030_table.h — GB18030 双字节 → Unicode BMP 码位表(生成物,勿手改; + * 由 tools/gen_gb18030_table.py 用 python3 `gb18030` codec 生成)。 + * 布局:gb_2byte[lead-0x81][trail_col];列号 idx(b)= b-0x40-(b>=0x80); + * 值 0 = 未映射(解码器输出 U+FFFD)。46 bytes 行格式可读。*/ +#ifndef RD_GB18030_TABLE_H +#define RD_GB18030_TABLE_H + +#include + +#define RD_GB_LEADS 126 +#define RD_GB_TRAILS 190 +#define RD_GB_LEAD0 0x81 +#define RD_GB_TRAIL0 0x40 + +/* gb_2byte[126][190]:rdgb_lookup(lead, trail) 返回 BMP 码位或 0。 */ +static const uint16_t gb_2byte[126][190] = { + {0x4E02,0x4E04,0x4E05,0x4E06,0x4E0F,0x4E12,0x4E17,0x4E1F, + 0x4E20,0x4E21,0x4E23,0x4E26,0x4E29,0x4E2E,0x4E2F,0x4E31, + 0x4E33,0x4E35,0x4E37,0x4E3C,0x4E40,0x4E41,0x4E42,0x4E44, + 0x4E46,0x4E4A,0x4E51,0x4E55,0x4E57,0x4E5A,0x4E5B,0x4E62, + 0x4E63,0x4E64,0x4E65,0x4E67,0x4E68,0x4E6A,0x4E6B,0x4E6C, + 0x4E6D,0x4E6E,0x4E6F,0x4E72,0x4E74,0x4E75,0x4E76,0x4E77, + 0x4E78,0x4E79,0x4E7A,0x4E7B,0x4E7C,0x4E7D,0x4E7F,0x4E80, + 0x4E81,0x4E82,0x4E83,0x4E84,0x4E85,0x4E87,0x4E8A,0x4E90, + 0x4E96,0x4E97,0x4E99,0x4E9C,0x4E9D,0x4E9E,0x4EA3,0x4EAA, + 0x4EAF,0x4EB0,0x4EB1,0x4EB4,0x4EB6,0x4EB7,0x4EB8,0x4EB9, + 0x4EBC,0x4EBD,0x4EBE,0x4EC8,0x4ECC,0x4ECF,0x4ED0,0x4ED2, + 0x4EDA,0x4EDB,0x4EDC,0x4EE0,0x4EE2,0x4EE6,0x4EE7,0x4EE9, + 0x4EED,0x4EEE,0x4EEF,0x4EF1,0x4EF4,0x4EF8,0x4EF9,0x4EFA, + 0x4EFC,0x4EFE,0x4F00,0x4F02,0x4F03,0x4F04,0x4F05,0x4F06, + 0x4F07,0x4F08,0x4F0B,0x4F0C,0x4F12,0x4F13,0x4F14,0x4F15, + 0x4F16,0x4F1C,0x4F1D,0x4F21,0x4F23,0x4F28,0x4F29,0x4F2C, + 0x4F2D,0x4F2E,0x4F31,0x4F33,0x4F35,0x4F37,0x4F39,0x4F3B, + 0x4F3E,0x4F3F,0x4F40,0x4F41,0x4F42,0x4F44,0x4F45,0x4F47, + 0x4F48,0x4F49,0x4F4A,0x4F4B,0x4F4C,0x4F52,0x4F54,0x4F56, + 0x4F61,0x4F62,0x4F66,0x4F68,0x4F6A,0x4F6B,0x4F6D,0x4F6E, + 0x4F71,0x4F72,0x4F75,0x4F77,0x4F78,0x4F79,0x4F7A,0x4F7D, + 0x4F80,0x4F81,0x4F82,0x4F85,0x4F86,0x4F87,0x4F8A,0x4F8C, + 0x4F8E,0x4F90,0x4F92,0x4F93,0x4F95,0x4F96,0x4F98,0x4F99, + 0x4F9A,0x4F9C,0x4F9E,0x4F9F,0x4FA1,0x4FA2, + }, + {0x4FA4,0x4FAB,0x4FAD,0x4FB0,0x4FB1,0x4FB2,0x4FB3,0x4FB4, + 0x4FB6,0x4FB7,0x4FB8,0x4FB9,0x4FBA,0x4FBB,0x4FBC,0x4FBD, + 0x4FBE,0x4FC0,0x4FC1,0x4FC2,0x4FC6,0x4FC7,0x4FC8,0x4FC9, + 0x4FCB,0x4FCC,0x4FCD,0x4FD2,0x4FD3,0x4FD4,0x4FD5,0x4FD6, + 0x4FD9,0x4FDB,0x4FE0,0x4FE2,0x4FE4,0x4FE5,0x4FE7,0x4FEB, + 0x4FEC,0x4FF0,0x4FF2,0x4FF4,0x4FF5,0x4FF6,0x4FF7,0x4FF9, + 0x4FFB,0x4FFC,0x4FFD,0x4FFF,0x5000,0x5001,0x5002,0x5003, + 0x5004,0x5005,0x5006,0x5007,0x5008,0x5009,0x500A,0x500B, + 0x500E,0x5010,0x5011,0x5013,0x5015,0x5016,0x5017,0x501B, + 0x501D,0x501E,0x5020,0x5022,0x5023,0x5024,0x5027,0x502B, + 0x502F,0x5030,0x5031,0x5032,0x5033,0x5034,0x5035,0x5036, + 0x5037,0x5038,0x5039,0x503B,0x503D,0x503F,0x5040,0x5041, + 0x5042,0x5044,0x5045,0x5046,0x5049,0x504A,0x504B,0x504D, + 0x5050,0x5051,0x5052,0x5053,0x5054,0x5056,0x5057,0x5058, + 0x5059,0x505B,0x505D,0x505E,0x505F,0x5060,0x5061,0x5062, + 0x5063,0x5064,0x5066,0x5067,0x5068,0x5069,0x506A,0x506B, + 0x506D,0x506E,0x506F,0x5070,0x5071,0x5072,0x5073,0x5074, + 0x5075,0x5078,0x5079,0x507A,0x507C,0x507D,0x5081,0x5082, + 0x5083,0x5084,0x5086,0x5087,0x5089,0x508A,0x508B,0x508C, + 0x508E,0x508F,0x5090,0x5091,0x5092,0x5093,0x5094,0x5095, + 0x5096,0x5097,0x5098,0x5099,0x509A,0x509B,0x509C,0x509D, + 0x509E,0x509F,0x50A0,0x50A1,0x50A2,0x50A4,0x50A6,0x50AA, + 0x50AB,0x50AD,0x50AE,0x50AF,0x50B0,0x50B1,0x50B3,0x50B4, + 0x50B5,0x50B6,0x50B7,0x50B8,0x50B9,0x50BC, + }, + {0x50BD,0x50BE,0x50BF,0x50C0,0x50C1,0x50C2,0x50C3,0x50C4, + 0x50C5,0x50C6,0x50C7,0x50C8,0x50C9,0x50CA,0x50CB,0x50CC, + 0x50CD,0x50CE,0x50D0,0x50D1,0x50D2,0x50D3,0x50D4,0x50D5, + 0x50D7,0x50D8,0x50D9,0x50DB,0x50DC,0x50DD,0x50DE,0x50DF, + 0x50E0,0x50E1,0x50E2,0x50E3,0x50E4,0x50E5,0x50E8,0x50E9, + 0x50EA,0x50EB,0x50EF,0x50F0,0x50F1,0x50F2,0x50F4,0x50F6, + 0x50F7,0x50F8,0x50F9,0x50FA,0x50FC,0x50FD,0x50FE,0x50FF, + 0x5100,0x5101,0x5102,0x5103,0x5104,0x5105,0x5108,0x5109, + 0x510A,0x510C,0x510D,0x510E,0x510F,0x5110,0x5111,0x5113, + 0x5114,0x5115,0x5116,0x5117,0x5118,0x5119,0x511A,0x511B, + 0x511C,0x511D,0x511E,0x511F,0x5120,0x5122,0x5123,0x5124, + 0x5125,0x5126,0x5127,0x5128,0x5129,0x512A,0x512B,0x512C, + 0x512D,0x512E,0x512F,0x5130,0x5131,0x5132,0x5133,0x5134, + 0x5135,0x5136,0x5137,0x5138,0x5139,0x513A,0x513B,0x513C, + 0x513D,0x513E,0x5142,0x5147,0x514A,0x514C,0x514E,0x514F, + 0x5150,0x5152,0x5153,0x5157,0x5158,0x5159,0x515B,0x515D, + 0x515E,0x515F,0x5160,0x5161,0x5163,0x5164,0x5166,0x5167, + 0x5169,0x516A,0x516F,0x5172,0x517A,0x517E,0x517F,0x5183, + 0x5184,0x5186,0x5187,0x518A,0x518B,0x518E,0x518F,0x5190, + 0x5191,0x5193,0x5194,0x5198,0x519A,0x519D,0x519E,0x519F, + 0x51A1,0x51A3,0x51A6,0x51A7,0x51A8,0x51A9,0x51AA,0x51AD, + 0x51AE,0x51B4,0x51B8,0x51B9,0x51BA,0x51BE,0x51BF,0x51C1, + 0x51C2,0x51C3,0x51C5,0x51C8,0x51CA,0x51CD,0x51CE,0x51D0, + 0x51D2,0x51D3,0x51D4,0x51D5,0x51D6,0x51D7, + }, + {0x51D8,0x51D9,0x51DA,0x51DC,0x51DE,0x51DF,0x51E2,0x51E3, + 0x51E5,0x51E6,0x51E7,0x51E8,0x51E9,0x51EA,0x51EC,0x51EE, + 0x51F1,0x51F2,0x51F4,0x51F7,0x51FE,0x5204,0x5205,0x5209, + 0x520B,0x520C,0x520F,0x5210,0x5213,0x5214,0x5215,0x521C, + 0x521E,0x521F,0x5221,0x5222,0x5223,0x5225,0x5226,0x5227, + 0x522A,0x522C,0x522F,0x5231,0x5232,0x5234,0x5235,0x523C, + 0x523E,0x5244,0x5245,0x5246,0x5247,0x5248,0x5249,0x524B, + 0x524E,0x524F,0x5252,0x5253,0x5255,0x5257,0x5258,0x5259, + 0x525A,0x525B,0x525D,0x525F,0x5260,0x5262,0x5263,0x5264, + 0x5266,0x5268,0x526B,0x526C,0x526D,0x526E,0x5270,0x5271, + 0x5273,0x5274,0x5275,0x5276,0x5277,0x5278,0x5279,0x527A, + 0x527B,0x527C,0x527E,0x5280,0x5283,0x5284,0x5285,0x5286, + 0x5287,0x5289,0x528A,0x528B,0x528C,0x528D,0x528E,0x528F, + 0x5291,0x5292,0x5294,0x5295,0x5296,0x5297,0x5298,0x5299, + 0x529A,0x529C,0x52A4,0x52A5,0x52A6,0x52A7,0x52AE,0x52AF, + 0x52B0,0x52B4,0x52B5,0x52B6,0x52B7,0x52B8,0x52B9,0x52BA, + 0x52BB,0x52BC,0x52BD,0x52C0,0x52C1,0x52C2,0x52C4,0x52C5, + 0x52C6,0x52C8,0x52CA,0x52CC,0x52CD,0x52CE,0x52CF,0x52D1, + 0x52D3,0x52D4,0x52D5,0x52D7,0x52D9,0x52DA,0x52DB,0x52DC, + 0x52DD,0x52DE,0x52E0,0x52E1,0x52E2,0x52E3,0x52E5,0x52E6, + 0x52E7,0x52E8,0x52E9,0x52EA,0x52EB,0x52EC,0x52ED,0x52EE, + 0x52EF,0x52F1,0x52F2,0x52F3,0x52F4,0x52F5,0x52F6,0x52F7, + 0x52F8,0x52FB,0x52FC,0x52FD,0x5301,0x5302,0x5303,0x5304, + 0x5307,0x5309,0x530A,0x530B,0x530C,0x530E, + }, + {0x5311,0x5312,0x5313,0x5314,0x5318,0x531B,0x531C,0x531E, + 0x531F,0x5322,0x5324,0x5325,0x5327,0x5328,0x5329,0x532B, + 0x532C,0x532D,0x532F,0x5330,0x5331,0x5332,0x5333,0x5334, + 0x5335,0x5336,0x5337,0x5338,0x533C,0x533D,0x5340,0x5342, + 0x5344,0x5346,0x534B,0x534C,0x534D,0x5350,0x5354,0x5358, + 0x5359,0x535B,0x535D,0x5365,0x5368,0x536A,0x536C,0x536D, + 0x5372,0x5376,0x5379,0x537B,0x537C,0x537D,0x537E,0x5380, + 0x5381,0x5383,0x5387,0x5388,0x538A,0x538E,0x538F,0x5390, + 0x5391,0x5392,0x5393,0x5394,0x5396,0x5397,0x5399,0x539B, + 0x539C,0x539E,0x53A0,0x53A1,0x53A4,0x53A7,0x53AA,0x53AB, + 0x53AC,0x53AD,0x53AF,0x53B0,0x53B1,0x53B2,0x53B3,0x53B4, + 0x53B5,0x53B7,0x53B8,0x53B9,0x53BA,0x53BC,0x53BD,0x53BE, + 0x53C0,0x53C3,0x53C4,0x53C5,0x53C6,0x53C7,0x53CE,0x53CF, + 0x53D0,0x53D2,0x53D3,0x53D5,0x53DA,0x53DC,0x53DD,0x53DE, + 0x53E1,0x53E2,0x53E7,0x53F4,0x53FA,0x53FE,0x53FF,0x5400, + 0x5402,0x5405,0x5407,0x540B,0x5414,0x5418,0x5419,0x541A, + 0x541C,0x5422,0x5424,0x5425,0x542A,0x5430,0x5433,0x5436, + 0x5437,0x543A,0x543D,0x543F,0x5441,0x5442,0x5444,0x5445, + 0x5447,0x5449,0x544C,0x544D,0x544E,0x544F,0x5451,0x545A, + 0x545D,0x545E,0x545F,0x5460,0x5461,0x5463,0x5465,0x5467, + 0x5469,0x546A,0x546B,0x546C,0x546D,0x546E,0x546F,0x5470, + 0x5474,0x5479,0x547A,0x547E,0x547F,0x5481,0x5483,0x5485, + 0x5487,0x5488,0x5489,0x548A,0x548D,0x5491,0x5493,0x5497, + 0x5498,0x549C,0x549E,0x549F,0x54A0,0x54A1, + }, + {0x54A2,0x54A5,0x54AE,0x54B0,0x54B2,0x54B5,0x54B6,0x54B7, + 0x54B9,0x54BA,0x54BC,0x54BE,0x54C3,0x54C5,0x54CA,0x54CB, + 0x54D6,0x54D8,0x54DB,0x54E0,0x54E1,0x54E2,0x54E3,0x54E4, + 0x54EB,0x54EC,0x54EF,0x54F0,0x54F1,0x54F4,0x54F5,0x54F6, + 0x54F7,0x54F8,0x54F9,0x54FB,0x54FE,0x5500,0x5502,0x5503, + 0x5504,0x5505,0x5508,0x550A,0x550B,0x550C,0x550D,0x550E, + 0x5512,0x5513,0x5515,0x5516,0x5517,0x5518,0x5519,0x551A, + 0x551C,0x551D,0x551E,0x551F,0x5521,0x5525,0x5526,0x5528, + 0x5529,0x552B,0x552D,0x5532,0x5534,0x5535,0x5536,0x5538, + 0x5539,0x553A,0x553B,0x553D,0x5540,0x5542,0x5545,0x5547, + 0x5548,0x554B,0x554C,0x554D,0x554E,0x554F,0x5551,0x5552, + 0x5553,0x5554,0x5557,0x5558,0x5559,0x555A,0x555B,0x555D, + 0x555E,0x555F,0x5560,0x5562,0x5563,0x5568,0x5569,0x556B, + 0x556F,0x5570,0x5571,0x5572,0x5573,0x5574,0x5579,0x557A, + 0x557D,0x557F,0x5585,0x5586,0x558C,0x558D,0x558E,0x5590, + 0x5592,0x5593,0x5595,0x5596,0x5597,0x559A,0x559B,0x559E, + 0x55A0,0x55A1,0x55A2,0x55A3,0x55A4,0x55A5,0x55A6,0x55A8, + 0x55A9,0x55AA,0x55AB,0x55AC,0x55AD,0x55AE,0x55AF,0x55B0, + 0x55B2,0x55B4,0x55B6,0x55B8,0x55BA,0x55BC,0x55BF,0x55C0, + 0x55C1,0x55C2,0x55C3,0x55C6,0x55C7,0x55C8,0x55CA,0x55CB, + 0x55CE,0x55CF,0x55D0,0x55D5,0x55D7,0x55D8,0x55D9,0x55DA, + 0x55DB,0x55DE,0x55E0,0x55E2,0x55E7,0x55E9,0x55ED,0x55EE, + 0x55F0,0x55F1,0x55F4,0x55F6,0x55F8,0x55F9,0x55FA,0x55FB, + 0x55FC,0x55FF,0x5602,0x5603,0x5604,0x5605, + }, + {0x5606,0x5607,0x560A,0x560B,0x560D,0x5610,0x5611,0x5612, + 0x5613,0x5614,0x5615,0x5616,0x5617,0x5619,0x561A,0x561C, + 0x561D,0x5620,0x5621,0x5622,0x5625,0x5626,0x5628,0x5629, + 0x562A,0x562B,0x562E,0x562F,0x5630,0x5633,0x5635,0x5637, + 0x5638,0x563A,0x563C,0x563D,0x563E,0x5640,0x5641,0x5642, + 0x5643,0x5644,0x5645,0x5646,0x5647,0x5648,0x5649,0x564A, + 0x564B,0x564F,0x5650,0x5651,0x5652,0x5653,0x5655,0x5656, + 0x565A,0x565B,0x565D,0x565E,0x565F,0x5660,0x5661,0x5663, + 0x5665,0x5666,0x5667,0x566D,0x566E,0x566F,0x5670,0x5672, + 0x5673,0x5674,0x5675,0x5677,0x5678,0x5679,0x567A,0x567D, + 0x567E,0x567F,0x5680,0x5681,0x5682,0x5683,0x5684,0x5687, + 0x5688,0x5689,0x568A,0x568B,0x568C,0x568D,0x5690,0x5691, + 0x5692,0x5694,0x5695,0x5696,0x5697,0x5698,0x5699,0x569A, + 0x569B,0x569C,0x569D,0x569E,0x569F,0x56A0,0x56A1,0x56A2, + 0x56A4,0x56A5,0x56A6,0x56A7,0x56A8,0x56A9,0x56AA,0x56AB, + 0x56AC,0x56AD,0x56AE,0x56B0,0x56B1,0x56B2,0x56B3,0x56B4, + 0x56B5,0x56B6,0x56B8,0x56B9,0x56BA,0x56BB,0x56BD,0x56BE, + 0x56BF,0x56C0,0x56C1,0x56C2,0x56C3,0x56C4,0x56C5,0x56C6, + 0x56C7,0x56C8,0x56C9,0x56CB,0x56CC,0x56CD,0x56CE,0x56CF, + 0x56D0,0x56D1,0x56D2,0x56D3,0x56D5,0x56D6,0x56D8,0x56D9, + 0x56DC,0x56E3,0x56E5,0x56E6,0x56E7,0x56E8,0x56E9,0x56EA, + 0x56EC,0x56EE,0x56EF,0x56F2,0x56F3,0x56F6,0x56F7,0x56F8, + 0x56FB,0x56FC,0x5700,0x5701,0x5702,0x5705,0x5707,0x570B, + 0x570C,0x570D,0x570E,0x570F,0x5710,0x5711, + }, + {0x5712,0x5713,0x5714,0x5715,0x5716,0x5717,0x5718,0x5719, + 0x571A,0x571B,0x571D,0x571E,0x5720,0x5721,0x5722,0x5724, + 0x5725,0x5726,0x5727,0x572B,0x5731,0x5732,0x5734,0x5735, + 0x5736,0x5737,0x5738,0x573C,0x573D,0x573F,0x5741,0x5743, + 0x5744,0x5745,0x5746,0x5748,0x5749,0x574B,0x5752,0x5753, + 0x5754,0x5755,0x5756,0x5758,0x5759,0x5762,0x5763,0x5765, + 0x5767,0x576C,0x576E,0x5770,0x5771,0x5772,0x5774,0x5775, + 0x5778,0x5779,0x577A,0x577D,0x577E,0x577F,0x5780,0x5781, + 0x5787,0x5788,0x5789,0x578A,0x578D,0x578E,0x578F,0x5790, + 0x5791,0x5794,0x5795,0x5796,0x5797,0x5798,0x5799,0x579A, + 0x579C,0x579D,0x579E,0x579F,0x57A5,0x57A8,0x57AA,0x57AC, + 0x57AF,0x57B0,0x57B1,0x57B3,0x57B5,0x57B6,0x57B7,0x57B9, + 0x57BA,0x57BB,0x57BC,0x57BD,0x57BE,0x57BF,0x57C0,0x57C1, + 0x57C4,0x57C5,0x57C6,0x57C7,0x57C8,0x57C9,0x57CA,0x57CC, + 0x57CD,0x57D0,0x57D1,0x57D3,0x57D6,0x57D7,0x57DB,0x57DC, + 0x57DE,0x57E1,0x57E2,0x57E3,0x57E5,0x57E6,0x57E7,0x57E8, + 0x57E9,0x57EA,0x57EB,0x57EC,0x57EE,0x57F0,0x57F1,0x57F2, + 0x57F3,0x57F5,0x57F6,0x57F7,0x57FB,0x57FC,0x57FE,0x57FF, + 0x5801,0x5803,0x5804,0x5805,0x5808,0x5809,0x580A,0x580C, + 0x580E,0x580F,0x5810,0x5812,0x5813,0x5814,0x5816,0x5817, + 0x5818,0x581A,0x581B,0x581C,0x581D,0x581F,0x5822,0x5823, + 0x5825,0x5826,0x5827,0x5828,0x5829,0x582B,0x582C,0x582D, + 0x582E,0x582F,0x5831,0x5832,0x5833,0x5834,0x5836,0x5837, + 0x5838,0x5839,0x583A,0x583B,0x583C,0x583D, + }, + {0x583E,0x583F,0x5840,0x5841,0x5842,0x5843,0x5845,0x5846, + 0x5847,0x5848,0x5849,0x584A,0x584B,0x584E,0x584F,0x5850, + 0x5852,0x5853,0x5855,0x5856,0x5857,0x5859,0x585A,0x585B, + 0x585C,0x585D,0x585F,0x5860,0x5861,0x5862,0x5863,0x5864, + 0x5866,0x5867,0x5868,0x5869,0x586A,0x586D,0x586E,0x586F, + 0x5870,0x5871,0x5872,0x5873,0x5874,0x5875,0x5876,0x5877, + 0x5878,0x5879,0x587A,0x587B,0x587C,0x587D,0x587F,0x5882, + 0x5884,0x5886,0x5887,0x5888,0x588A,0x588B,0x588C,0x588D, + 0x588E,0x588F,0x5890,0x5891,0x5894,0x5895,0x5896,0x5897, + 0x5898,0x589B,0x589C,0x589D,0x58A0,0x58A1,0x58A2,0x58A3, + 0x58A4,0x58A5,0x58A6,0x58A7,0x58AA,0x58AB,0x58AC,0x58AD, + 0x58AE,0x58AF,0x58B0,0x58B1,0x58B2,0x58B3,0x58B4,0x58B5, + 0x58B6,0x58B7,0x58B8,0x58B9,0x58BA,0x58BB,0x58BD,0x58BE, + 0x58BF,0x58C0,0x58C2,0x58C3,0x58C4,0x58C6,0x58C7,0x58C8, + 0x58C9,0x58CA,0x58CB,0x58CC,0x58CD,0x58CE,0x58CF,0x58D0, + 0x58D2,0x58D3,0x58D4,0x58D6,0x58D7,0x58D8,0x58D9,0x58DA, + 0x58DB,0x58DC,0x58DD,0x58DE,0x58DF,0x58E0,0x58E1,0x58E2, + 0x58E3,0x58E5,0x58E6,0x58E7,0x58E8,0x58E9,0x58EA,0x58ED, + 0x58EF,0x58F1,0x58F2,0x58F4,0x58F5,0x58F7,0x58F8,0x58FA, + 0x58FB,0x58FC,0x58FD,0x58FE,0x58FF,0x5900,0x5901,0x5903, + 0x5905,0x5906,0x5908,0x5909,0x590A,0x590B,0x590C,0x590E, + 0x5910,0x5911,0x5912,0x5913,0x5917,0x5918,0x591B,0x591D, + 0x591E,0x5920,0x5921,0x5922,0x5923,0x5926,0x5928,0x592C, + 0x5930,0x5932,0x5933,0x5935,0x5936,0x593B, + }, + {0x593D,0x593E,0x593F,0x5940,0x5943,0x5945,0x5946,0x594A, + 0x594C,0x594D,0x5950,0x5952,0x5953,0x5959,0x595B,0x595C, + 0x595D,0x595E,0x595F,0x5961,0x5963,0x5964,0x5966,0x5967, + 0x5968,0x5969,0x596A,0x596B,0x596C,0x596D,0x596E,0x596F, + 0x5970,0x5971,0x5972,0x5975,0x5977,0x597A,0x597B,0x597C, + 0x597E,0x597F,0x5980,0x5985,0x5989,0x598B,0x598C,0x598E, + 0x598F,0x5990,0x5991,0x5994,0x5995,0x5998,0x599A,0x599B, + 0x599C,0x599D,0x599F,0x59A0,0x59A1,0x59A2,0x59A6,0x59A7, + 0x59AC,0x59AD,0x59B0,0x59B1,0x59B3,0x59B4,0x59B5,0x59B6, + 0x59B7,0x59B8,0x59BA,0x59BC,0x59BD,0x59BF,0x59C0,0x59C1, + 0x59C2,0x59C3,0x59C4,0x59C5,0x59C7,0x59C8,0x59C9,0x59CC, + 0x59CD,0x59CE,0x59CF,0x59D5,0x59D6,0x59D9,0x59DB,0x59DE, + 0x59DF,0x59E0,0x59E1,0x59E2,0x59E4,0x59E6,0x59E7,0x59E9, + 0x59EA,0x59EB,0x59ED,0x59EE,0x59EF,0x59F0,0x59F1,0x59F2, + 0x59F3,0x59F4,0x59F5,0x59F6,0x59F7,0x59F8,0x59FA,0x59FC, + 0x59FD,0x59FE,0x5A00,0x5A02,0x5A0A,0x5A0B,0x5A0D,0x5A0E, + 0x5A0F,0x5A10,0x5A12,0x5A14,0x5A15,0x5A16,0x5A17,0x5A19, + 0x5A1A,0x5A1B,0x5A1D,0x5A1E,0x5A21,0x5A22,0x5A24,0x5A26, + 0x5A27,0x5A28,0x5A2A,0x5A2B,0x5A2C,0x5A2D,0x5A2E,0x5A2F, + 0x5A30,0x5A33,0x5A35,0x5A37,0x5A38,0x5A39,0x5A3A,0x5A3B, + 0x5A3D,0x5A3E,0x5A3F,0x5A41,0x5A42,0x5A43,0x5A44,0x5A45, + 0x5A47,0x5A48,0x5A4B,0x5A4C,0x5A4D,0x5A4E,0x5A4F,0x5A50, + 0x5A51,0x5A52,0x5A53,0x5A54,0x5A56,0x5A57,0x5A58,0x5A59, + 0x5A5B,0x5A5C,0x5A5D,0x5A5E,0x5A5F,0x5A60, + }, + {0x5A61,0x5A63,0x5A64,0x5A65,0x5A66,0x5A68,0x5A69,0x5A6B, + 0x5A6C,0x5A6D,0x5A6E,0x5A6F,0x5A70,0x5A71,0x5A72,0x5A73, + 0x5A78,0x5A79,0x5A7B,0x5A7C,0x5A7D,0x5A7E,0x5A80,0x5A81, + 0x5A82,0x5A83,0x5A84,0x5A85,0x5A86,0x5A87,0x5A88,0x5A89, + 0x5A8A,0x5A8B,0x5A8C,0x5A8D,0x5A8E,0x5A8F,0x5A90,0x5A91, + 0x5A93,0x5A94,0x5A95,0x5A96,0x5A97,0x5A98,0x5A99,0x5A9C, + 0x5A9D,0x5A9E,0x5A9F,0x5AA0,0x5AA1,0x5AA2,0x5AA3,0x5AA4, + 0x5AA5,0x5AA6,0x5AA7,0x5AA8,0x5AA9,0x5AAB,0x5AAC,0x5AAD, + 0x5AAE,0x5AAF,0x5AB0,0x5AB1,0x5AB4,0x5AB6,0x5AB7,0x5AB9, + 0x5ABA,0x5ABB,0x5ABC,0x5ABD,0x5ABF,0x5AC0,0x5AC3,0x5AC4, + 0x5AC5,0x5AC6,0x5AC7,0x5AC8,0x5ACA,0x5ACB,0x5ACD,0x5ACE, + 0x5ACF,0x5AD0,0x5AD1,0x5AD3,0x5AD5,0x5AD7,0x5AD9,0x5ADA, + 0x5ADB,0x5ADD,0x5ADE,0x5ADF,0x5AE2,0x5AE4,0x5AE5,0x5AE7, + 0x5AE8,0x5AEA,0x5AEC,0x5AED,0x5AEE,0x5AEF,0x5AF0,0x5AF2, + 0x5AF3,0x5AF4,0x5AF5,0x5AF6,0x5AF7,0x5AF8,0x5AF9,0x5AFA, + 0x5AFB,0x5AFC,0x5AFD,0x5AFE,0x5AFF,0x5B00,0x5B01,0x5B02, + 0x5B03,0x5B04,0x5B05,0x5B06,0x5B07,0x5B08,0x5B0A,0x5B0B, + 0x5B0C,0x5B0D,0x5B0E,0x5B0F,0x5B10,0x5B11,0x5B12,0x5B13, + 0x5B14,0x5B15,0x5B18,0x5B19,0x5B1A,0x5B1B,0x5B1C,0x5B1D, + 0x5B1E,0x5B1F,0x5B20,0x5B21,0x5B22,0x5B23,0x5B24,0x5B25, + 0x5B26,0x5B27,0x5B28,0x5B29,0x5B2A,0x5B2B,0x5B2C,0x5B2D, + 0x5B2E,0x5B2F,0x5B30,0x5B31,0x5B33,0x5B35,0x5B36,0x5B38, + 0x5B39,0x5B3A,0x5B3B,0x5B3C,0x5B3D,0x5B3E,0x5B3F,0x5B41, + 0x5B42,0x5B43,0x5B44,0x5B45,0x5B46,0x5B47, + }, + {0x5B48,0x5B49,0x5B4A,0x5B4B,0x5B4C,0x5B4D,0x5B4E,0x5B4F, + 0x5B52,0x5B56,0x5B5E,0x5B60,0x5B61,0x5B67,0x5B68,0x5B6B, + 0x5B6D,0x5B6E,0x5B6F,0x5B72,0x5B74,0x5B76,0x5B77,0x5B78, + 0x5B79,0x5B7B,0x5B7C,0x5B7E,0x5B7F,0x5B82,0x5B86,0x5B8A, + 0x5B8D,0x5B8E,0x5B90,0x5B91,0x5B92,0x5B94,0x5B96,0x5B9F, + 0x5BA7,0x5BA8,0x5BA9,0x5BAC,0x5BAD,0x5BAE,0x5BAF,0x5BB1, + 0x5BB2,0x5BB7,0x5BBA,0x5BBB,0x5BBC,0x5BC0,0x5BC1,0x5BC3, + 0x5BC8,0x5BC9,0x5BCA,0x5BCB,0x5BCD,0x5BCE,0x5BCF,0x5BD1, + 0x5BD4,0x5BD5,0x5BD6,0x5BD7,0x5BD8,0x5BD9,0x5BDA,0x5BDB, + 0x5BDC,0x5BE0,0x5BE2,0x5BE3,0x5BE6,0x5BE7,0x5BE9,0x5BEA, + 0x5BEB,0x5BEC,0x5BED,0x5BEF,0x5BF1,0x5BF2,0x5BF3,0x5BF4, + 0x5BF5,0x5BF6,0x5BF7,0x5BFD,0x5BFE,0x5C00,0x5C02,0x5C03, + 0x5C05,0x5C07,0x5C08,0x5C0B,0x5C0C,0x5C0D,0x5C0E,0x5C10, + 0x5C12,0x5C13,0x5C17,0x5C19,0x5C1B,0x5C1E,0x5C1F,0x5C20, + 0x5C21,0x5C23,0x5C26,0x5C28,0x5C29,0x5C2A,0x5C2B,0x5C2D, + 0x5C2E,0x5C2F,0x5C30,0x5C32,0x5C33,0x5C35,0x5C36,0x5C37, + 0x5C43,0x5C44,0x5C46,0x5C47,0x5C4C,0x5C4D,0x5C52,0x5C53, + 0x5C54,0x5C56,0x5C57,0x5C58,0x5C5A,0x5C5B,0x5C5C,0x5C5D, + 0x5C5F,0x5C62,0x5C64,0x5C67,0x5C68,0x5C69,0x5C6A,0x5C6B, + 0x5C6C,0x5C6D,0x5C70,0x5C72,0x5C73,0x5C74,0x5C75,0x5C76, + 0x5C77,0x5C78,0x5C7B,0x5C7C,0x5C7D,0x5C7E,0x5C80,0x5C83, + 0x5C84,0x5C85,0x5C86,0x5C87,0x5C89,0x5C8A,0x5C8B,0x5C8E, + 0x5C8F,0x5C92,0x5C93,0x5C95,0x5C9D,0x5C9E,0x5C9F,0x5CA0, + 0x5CA1,0x5CA4,0x5CA5,0x5CA6,0x5CA7,0x5CA8, + }, + {0x5CAA,0x5CAE,0x5CAF,0x5CB0,0x5CB2,0x5CB4,0x5CB6,0x5CB9, + 0x5CBA,0x5CBB,0x5CBC,0x5CBE,0x5CC0,0x5CC2,0x5CC3,0x5CC5, + 0x5CC6,0x5CC7,0x5CC8,0x5CC9,0x5CCA,0x5CCC,0x5CCD,0x5CCE, + 0x5CCF,0x5CD0,0x5CD1,0x5CD3,0x5CD4,0x5CD5,0x5CD6,0x5CD7, + 0x5CD8,0x5CDA,0x5CDB,0x5CDC,0x5CDD,0x5CDE,0x5CDF,0x5CE0, + 0x5CE2,0x5CE3,0x5CE7,0x5CE9,0x5CEB,0x5CEC,0x5CEE,0x5CEF, + 0x5CF1,0x5CF2,0x5CF3,0x5CF4,0x5CF5,0x5CF6,0x5CF7,0x5CF8, + 0x5CF9,0x5CFA,0x5CFC,0x5CFD,0x5CFE,0x5CFF,0x5D00,0x5D01, + 0x5D04,0x5D05,0x5D08,0x5D09,0x5D0A,0x5D0B,0x5D0C,0x5D0D, + 0x5D0F,0x5D10,0x5D11,0x5D12,0x5D13,0x5D15,0x5D17,0x5D18, + 0x5D19,0x5D1A,0x5D1C,0x5D1D,0x5D1F,0x5D20,0x5D21,0x5D22, + 0x5D23,0x5D25,0x5D28,0x5D2A,0x5D2B,0x5D2C,0x5D2F,0x5D30, + 0x5D31,0x5D32,0x5D33,0x5D35,0x5D36,0x5D37,0x5D38,0x5D39, + 0x5D3A,0x5D3B,0x5D3C,0x5D3F,0x5D40,0x5D41,0x5D42,0x5D43, + 0x5D44,0x5D45,0x5D46,0x5D48,0x5D49,0x5D4D,0x5D4E,0x5D4F, + 0x5D50,0x5D51,0x5D52,0x5D53,0x5D54,0x5D55,0x5D56,0x5D57, + 0x5D59,0x5D5A,0x5D5C,0x5D5E,0x5D5F,0x5D60,0x5D61,0x5D62, + 0x5D63,0x5D64,0x5D65,0x5D66,0x5D67,0x5D68,0x5D6A,0x5D6D, + 0x5D6E,0x5D70,0x5D71,0x5D72,0x5D73,0x5D75,0x5D76,0x5D77, + 0x5D78,0x5D79,0x5D7A,0x5D7B,0x5D7C,0x5D7D,0x5D7E,0x5D7F, + 0x5D80,0x5D81,0x5D83,0x5D84,0x5D85,0x5D86,0x5D87,0x5D88, + 0x5D89,0x5D8A,0x5D8B,0x5D8C,0x5D8D,0x5D8E,0x5D8F,0x5D90, + 0x5D91,0x5D92,0x5D93,0x5D94,0x5D95,0x5D96,0x5D97,0x5D98, + 0x5D9A,0x5D9B,0x5D9C,0x5D9E,0x5D9F,0x5DA0, + }, + {0x5DA1,0x5DA2,0x5DA3,0x5DA4,0x5DA5,0x5DA6,0x5DA7,0x5DA8, + 0x5DA9,0x5DAA,0x5DAB,0x5DAC,0x5DAD,0x5DAE,0x5DAF,0x5DB0, + 0x5DB1,0x5DB2,0x5DB3,0x5DB4,0x5DB5,0x5DB6,0x5DB8,0x5DB9, + 0x5DBA,0x5DBB,0x5DBC,0x5DBD,0x5DBE,0x5DBF,0x5DC0,0x5DC1, + 0x5DC2,0x5DC3,0x5DC4,0x5DC6,0x5DC7,0x5DC8,0x5DC9,0x5DCA, + 0x5DCB,0x5DCC,0x5DCE,0x5DCF,0x5DD0,0x5DD1,0x5DD2,0x5DD3, + 0x5DD4,0x5DD5,0x5DD6,0x5DD7,0x5DD8,0x5DD9,0x5DDA,0x5DDC, + 0x5DDF,0x5DE0,0x5DE3,0x5DE4,0x5DEA,0x5DEC,0x5DED,0x5DF0, + 0x5DF5,0x5DF6,0x5DF8,0x5DF9,0x5DFA,0x5DFB,0x5DFC,0x5DFF, + 0x5E00,0x5E04,0x5E07,0x5E09,0x5E0A,0x5E0B,0x5E0D,0x5E0E, + 0x5E12,0x5E13,0x5E17,0x5E1E,0x5E1F,0x5E20,0x5E21,0x5E22, + 0x5E23,0x5E24,0x5E25,0x5E28,0x5E29,0x5E2A,0x5E2B,0x5E2C, + 0x5E2F,0x5E30,0x5E32,0x5E33,0x5E34,0x5E35,0x5E36,0x5E39, + 0x5E3A,0x5E3E,0x5E3F,0x5E40,0x5E41,0x5E43,0x5E46,0x5E47, + 0x5E48,0x5E49,0x5E4A,0x5E4B,0x5E4D,0x5E4E,0x5E4F,0x5E50, + 0x5E51,0x5E52,0x5E53,0x5E56,0x5E57,0x5E58,0x5E59,0x5E5A, + 0x5E5C,0x5E5D,0x5E5F,0x5E60,0x5E63,0x5E64,0x5E65,0x5E66, + 0x5E67,0x5E68,0x5E69,0x5E6A,0x5E6B,0x5E6C,0x5E6D,0x5E6E, + 0x5E6F,0x5E70,0x5E71,0x5E75,0x5E77,0x5E79,0x5E7E,0x5E81, + 0x5E82,0x5E83,0x5E85,0x5E88,0x5E89,0x5E8C,0x5E8D,0x5E8E, + 0x5E92,0x5E98,0x5E9B,0x5E9D,0x5EA1,0x5EA2,0x5EA3,0x5EA4, + 0x5EA8,0x5EA9,0x5EAA,0x5EAB,0x5EAC,0x5EAE,0x5EAF,0x5EB0, + 0x5EB1,0x5EB2,0x5EB4,0x5EBA,0x5EBB,0x5EBC,0x5EBD,0x5EBF, + 0x5EC0,0x5EC1,0x5EC2,0x5EC3,0x5EC4,0x5EC5, + }, + {0x5EC6,0x5EC7,0x5EC8,0x5ECB,0x5ECC,0x5ECD,0x5ECE,0x5ECF, + 0x5ED0,0x5ED4,0x5ED5,0x5ED7,0x5ED8,0x5ED9,0x5EDA,0x5EDC, + 0x5EDD,0x5EDE,0x5EDF,0x5EE0,0x5EE1,0x5EE2,0x5EE3,0x5EE4, + 0x5EE5,0x5EE6,0x5EE7,0x5EE9,0x5EEB,0x5EEC,0x5EED,0x5EEE, + 0x5EEF,0x5EF0,0x5EF1,0x5EF2,0x5EF3,0x5EF5,0x5EF8,0x5EF9, + 0x5EFB,0x5EFC,0x5EFD,0x5F05,0x5F06,0x5F07,0x5F09,0x5F0C, + 0x5F0D,0x5F0E,0x5F10,0x5F12,0x5F14,0x5F16,0x5F19,0x5F1A, + 0x5F1C,0x5F1D,0x5F1E,0x5F21,0x5F22,0x5F23,0x5F24,0x5F28, + 0x5F2B,0x5F2C,0x5F2E,0x5F30,0x5F32,0x5F33,0x5F34,0x5F35, + 0x5F36,0x5F37,0x5F38,0x5F3B,0x5F3D,0x5F3E,0x5F3F,0x5F41, + 0x5F42,0x5F43,0x5F44,0x5F45,0x5F46,0x5F47,0x5F48,0x5F49, + 0x5F4A,0x5F4B,0x5F4C,0x5F4D,0x5F4E,0x5F4F,0x5F51,0x5F54, + 0x5F59,0x5F5A,0x5F5B,0x5F5C,0x5F5E,0x5F5F,0x5F60,0x5F63, + 0x5F65,0x5F67,0x5F68,0x5F6B,0x5F6E,0x5F6F,0x5F72,0x5F74, + 0x5F75,0x5F76,0x5F78,0x5F7A,0x5F7D,0x5F7E,0x5F7F,0x5F83, + 0x5F86,0x5F8D,0x5F8E,0x5F8F,0x5F91,0x5F93,0x5F94,0x5F96, + 0x5F9A,0x5F9B,0x5F9D,0x5F9E,0x5F9F,0x5FA0,0x5FA2,0x5FA3, + 0x5FA4,0x5FA5,0x5FA6,0x5FA7,0x5FA9,0x5FAB,0x5FAC,0x5FAF, + 0x5FB0,0x5FB1,0x5FB2,0x5FB3,0x5FB4,0x5FB6,0x5FB8,0x5FB9, + 0x5FBA,0x5FBB,0x5FBE,0x5FBF,0x5FC0,0x5FC1,0x5FC2,0x5FC7, + 0x5FC8,0x5FCA,0x5FCB,0x5FCE,0x5FD3,0x5FD4,0x5FD5,0x5FDA, + 0x5FDB,0x5FDC,0x5FDE,0x5FDF,0x5FE2,0x5FE3,0x5FE5,0x5FE6, + 0x5FE8,0x5FE9,0x5FEC,0x5FEF,0x5FF0,0x5FF2,0x5FF3,0x5FF4, + 0x5FF6,0x5FF7,0x5FF9,0x5FFA,0x5FFC,0x6007, + }, + {0x6008,0x6009,0x600B,0x600C,0x6010,0x6011,0x6013,0x6017, + 0x6018,0x601A,0x601E,0x601F,0x6022,0x6023,0x6024,0x602C, + 0x602D,0x602E,0x6030,0x6031,0x6032,0x6033,0x6034,0x6036, + 0x6037,0x6038,0x6039,0x603A,0x603D,0x603E,0x6040,0x6044, + 0x6045,0x6046,0x6047,0x6048,0x6049,0x604A,0x604C,0x604E, + 0x604F,0x6051,0x6053,0x6054,0x6056,0x6057,0x6058,0x605B, + 0x605C,0x605E,0x605F,0x6060,0x6061,0x6065,0x6066,0x606E, + 0x6071,0x6072,0x6074,0x6075,0x6077,0x607E,0x6080,0x6081, + 0x6082,0x6085,0x6086,0x6087,0x6088,0x608A,0x608B,0x608E, + 0x608F,0x6090,0x6091,0x6093,0x6095,0x6097,0x6098,0x6099, + 0x609C,0x609E,0x60A1,0x60A2,0x60A4,0x60A5,0x60A7,0x60A9, + 0x60AA,0x60AE,0x60B0,0x60B3,0x60B5,0x60B6,0x60B7,0x60B9, + 0x60BA,0x60BD,0x60BE,0x60BF,0x60C0,0x60C1,0x60C2,0x60C3, + 0x60C4,0x60C7,0x60C8,0x60C9,0x60CC,0x60CD,0x60CE,0x60CF, + 0x60D0,0x60D2,0x60D3,0x60D4,0x60D6,0x60D7,0x60D9,0x60DB, + 0x60DE,0x60E1,0x60E2,0x60E3,0x60E4,0x60E5,0x60EA,0x60F1, + 0x60F2,0x60F5,0x60F7,0x60F8,0x60FB,0x60FC,0x60FD,0x60FE, + 0x60FF,0x6102,0x6103,0x6104,0x6105,0x6107,0x610A,0x610B, + 0x610C,0x6110,0x6111,0x6112,0x6113,0x6114,0x6116,0x6117, + 0x6118,0x6119,0x611B,0x611C,0x611D,0x611E,0x6121,0x6122, + 0x6125,0x6128,0x6129,0x612A,0x612C,0x612D,0x612E,0x612F, + 0x6130,0x6131,0x6132,0x6133,0x6134,0x6135,0x6136,0x6137, + 0x6138,0x6139,0x613A,0x613B,0x613C,0x613D,0x613E,0x6140, + 0x6141,0x6142,0x6143,0x6144,0x6145,0x6146, + }, + {0x6147,0x6149,0x614B,0x614D,0x614F,0x6150,0x6152,0x6153, + 0x6154,0x6156,0x6157,0x6158,0x6159,0x615A,0x615B,0x615C, + 0x615E,0x615F,0x6160,0x6161,0x6163,0x6164,0x6165,0x6166, + 0x6169,0x616A,0x616B,0x616C,0x616D,0x616E,0x616F,0x6171, + 0x6172,0x6173,0x6174,0x6176,0x6178,0x6179,0x617A,0x617B, + 0x617C,0x617D,0x617E,0x617F,0x6180,0x6181,0x6182,0x6183, + 0x6184,0x6185,0x6186,0x6187,0x6188,0x6189,0x618A,0x618C, + 0x618D,0x618F,0x6190,0x6191,0x6192,0x6193,0x6195,0x6196, + 0x6197,0x6198,0x6199,0x619A,0x619B,0x619C,0x619E,0x619F, + 0x61A0,0x61A1,0x61A2,0x61A3,0x61A4,0x61A5,0x61A6,0x61AA, + 0x61AB,0x61AD,0x61AE,0x61AF,0x61B0,0x61B1,0x61B2,0x61B3, + 0x61B4,0x61B5,0x61B6,0x61B8,0x61B9,0x61BA,0x61BB,0x61BC, + 0x61BD,0x61BF,0x61C0,0x61C1,0x61C3,0x61C4,0x61C5,0x61C6, + 0x61C7,0x61C9,0x61CC,0x61CD,0x61CE,0x61CF,0x61D0,0x61D3, + 0x61D5,0x61D6,0x61D7,0x61D8,0x61D9,0x61DA,0x61DB,0x61DC, + 0x61DD,0x61DE,0x61DF,0x61E0,0x61E1,0x61E2,0x61E3,0x61E4, + 0x61E5,0x61E7,0x61E8,0x61E9,0x61EA,0x61EB,0x61EC,0x61ED, + 0x61EE,0x61EF,0x61F0,0x61F1,0x61F2,0x61F3,0x61F4,0x61F6, + 0x61F7,0x61F8,0x61F9,0x61FA,0x61FB,0x61FC,0x61FD,0x61FE, + 0x6200,0x6201,0x6202,0x6203,0x6204,0x6205,0x6207,0x6209, + 0x6213,0x6214,0x6219,0x621C,0x621D,0x621E,0x6220,0x6223, + 0x6226,0x6227,0x6228,0x6229,0x622B,0x622D,0x622F,0x6230, + 0x6231,0x6232,0x6235,0x6236,0x6238,0x6239,0x623A,0x623B, + 0x623C,0x6242,0x6244,0x6245,0x6246,0x624A, + }, + {0x624F,0x6250,0x6255,0x6256,0x6257,0x6259,0x625A,0x625C, + 0x625D,0x625E,0x625F,0x6260,0x6261,0x6262,0x6264,0x6265, + 0x6268,0x6271,0x6272,0x6274,0x6275,0x6277,0x6278,0x627A, + 0x627B,0x627D,0x6281,0x6282,0x6283,0x6285,0x6286,0x6287, + 0x6288,0x628B,0x628C,0x628D,0x628E,0x628F,0x6290,0x6294, + 0x6299,0x629C,0x629D,0x629E,0x62A3,0x62A6,0x62A7,0x62A9, + 0x62AA,0x62AD,0x62AE,0x62AF,0x62B0,0x62B2,0x62B3,0x62B4, + 0x62B6,0x62B7,0x62B8,0x62BA,0x62BE,0x62C0,0x62C1,0x62C3, + 0x62CB,0x62CF,0x62D1,0x62D5,0x62DD,0x62DE,0x62E0,0x62E1, + 0x62E4,0x62EA,0x62EB,0x62F0,0x62F2,0x62F5,0x62F8,0x62F9, + 0x62FA,0x62FB,0x6300,0x6303,0x6304,0x6305,0x6306,0x630A, + 0x630B,0x630C,0x630D,0x630F,0x6310,0x6312,0x6313,0x6314, + 0x6315,0x6317,0x6318,0x6319,0x631C,0x6326,0x6327,0x6329, + 0x632C,0x632D,0x632E,0x6330,0x6331,0x6333,0x6334,0x6335, + 0x6336,0x6337,0x6338,0x633B,0x633C,0x633E,0x633F,0x6340, + 0x6341,0x6344,0x6347,0x6348,0x634A,0x6351,0x6352,0x6353, + 0x6354,0x6356,0x6357,0x6358,0x6359,0x635A,0x635B,0x635C, + 0x635D,0x6360,0x6364,0x6365,0x6366,0x6368,0x636A,0x636B, + 0x636C,0x636F,0x6370,0x6372,0x6373,0x6374,0x6375,0x6378, + 0x6379,0x637C,0x637D,0x637E,0x637F,0x6381,0x6383,0x6384, + 0x6385,0x6386,0x638B,0x638D,0x6391,0x6393,0x6394,0x6395, + 0x6397,0x6399,0x639A,0x639B,0x639C,0x639D,0x639E,0x639F, + 0x63A1,0x63A4,0x63A6,0x63AB,0x63AF,0x63B1,0x63B2,0x63B5, + 0x63B6,0x63B9,0x63BB,0x63BD,0x63BF,0x63C0, + }, + {0x63C1,0x63C2,0x63C3,0x63C5,0x63C7,0x63C8,0x63CA,0x63CB, + 0x63CC,0x63D1,0x63D3,0x63D4,0x63D5,0x63D7,0x63D8,0x63D9, + 0x63DA,0x63DB,0x63DC,0x63DD,0x63DF,0x63E2,0x63E4,0x63E5, + 0x63E6,0x63E7,0x63E8,0x63EB,0x63EC,0x63EE,0x63EF,0x63F0, + 0x63F1,0x63F3,0x63F5,0x63F7,0x63F9,0x63FA,0x63FB,0x63FC, + 0x63FE,0x6403,0x6404,0x6406,0x6407,0x6408,0x6409,0x640A, + 0x640D,0x640E,0x6411,0x6412,0x6415,0x6416,0x6417,0x6418, + 0x6419,0x641A,0x641D,0x641F,0x6422,0x6423,0x6424,0x6425, + 0x6427,0x6428,0x6429,0x642B,0x642E,0x642F,0x6430,0x6431, + 0x6432,0x6433,0x6435,0x6436,0x6437,0x6438,0x6439,0x643B, + 0x643C,0x643E,0x6440,0x6442,0x6443,0x6449,0x644B,0x644C, + 0x644D,0x644E,0x644F,0x6450,0x6451,0x6453,0x6455,0x6456, + 0x6457,0x6459,0x645A,0x645B,0x645C,0x645D,0x645F,0x6460, + 0x6461,0x6462,0x6463,0x6464,0x6465,0x6466,0x6468,0x646A, + 0x646B,0x646C,0x646E,0x646F,0x6470,0x6471,0x6472,0x6473, + 0x6474,0x6475,0x6476,0x6477,0x647B,0x647C,0x647D,0x647E, + 0x647F,0x6480,0x6481,0x6483,0x6486,0x6488,0x6489,0x648A, + 0x648B,0x648C,0x648D,0x648E,0x648F,0x6490,0x6493,0x6494, + 0x6497,0x6498,0x649A,0x649B,0x649C,0x649D,0x649F,0x64A0, + 0x64A1,0x64A2,0x64A3,0x64A5,0x64A6,0x64A7,0x64A8,0x64AA, + 0x64AB,0x64AF,0x64B1,0x64B2,0x64B3,0x64B4,0x64B6,0x64B9, + 0x64BB,0x64BD,0x64BE,0x64BF,0x64C1,0x64C3,0x64C4,0x64C6, + 0x64C7,0x64C8,0x64C9,0x64CA,0x64CB,0x64CC,0x64CF,0x64D1, + 0x64D3,0x64D4,0x64D5,0x64D6,0x64D9,0x64DA, + }, + {0x64DB,0x64DC,0x64DD,0x64DF,0x64E0,0x64E1,0x64E3,0x64E5, + 0x64E7,0x64E8,0x64E9,0x64EA,0x64EB,0x64EC,0x64ED,0x64EE, + 0x64EF,0x64F0,0x64F1,0x64F2,0x64F3,0x64F4,0x64F5,0x64F6, + 0x64F7,0x64F8,0x64F9,0x64FA,0x64FB,0x64FC,0x64FD,0x64FE, + 0x64FF,0x6501,0x6502,0x6503,0x6504,0x6505,0x6506,0x6507, + 0x6508,0x650A,0x650B,0x650C,0x650D,0x650E,0x650F,0x6510, + 0x6511,0x6513,0x6514,0x6515,0x6516,0x6517,0x6519,0x651A, + 0x651B,0x651C,0x651D,0x651E,0x651F,0x6520,0x6521,0x6522, + 0x6523,0x6524,0x6526,0x6527,0x6528,0x6529,0x652A,0x652C, + 0x652D,0x6530,0x6531,0x6532,0x6533,0x6537,0x653A,0x653C, + 0x653D,0x6540,0x6541,0x6542,0x6543,0x6544,0x6546,0x6547, + 0x654A,0x654B,0x654D,0x654E,0x6550,0x6552,0x6553,0x6554, + 0x6557,0x6558,0x655A,0x655C,0x655F,0x6560,0x6561,0x6564, + 0x6565,0x6567,0x6568,0x6569,0x656A,0x656D,0x656E,0x656F, + 0x6571,0x6573,0x6575,0x6576,0x6578,0x6579,0x657A,0x657B, + 0x657C,0x657D,0x657E,0x657F,0x6580,0x6581,0x6582,0x6583, + 0x6584,0x6585,0x6586,0x6588,0x6589,0x658A,0x658D,0x658E, + 0x658F,0x6592,0x6594,0x6595,0x6596,0x6598,0x659A,0x659D, + 0x659E,0x65A0,0x65A2,0x65A3,0x65A6,0x65A8,0x65AA,0x65AC, + 0x65AE,0x65B1,0x65B2,0x65B3,0x65B4,0x65B5,0x65B6,0x65B7, + 0x65B8,0x65BA,0x65BB,0x65BE,0x65BF,0x65C0,0x65C2,0x65C7, + 0x65C8,0x65C9,0x65CA,0x65CD,0x65D0,0x65D1,0x65D3,0x65D4, + 0x65D5,0x65D8,0x65D9,0x65DA,0x65DB,0x65DC,0x65DD,0x65DE, + 0x65DF,0x65E1,0x65E3,0x65E4,0x65EA,0x65EB, + }, + {0x65F2,0x65F3,0x65F4,0x65F5,0x65F8,0x65F9,0x65FB,0x65FC, + 0x65FD,0x65FE,0x65FF,0x6601,0x6604,0x6605,0x6607,0x6608, + 0x6609,0x660B,0x660D,0x6610,0x6611,0x6612,0x6616,0x6617, + 0x6618,0x661A,0x661B,0x661C,0x661E,0x6621,0x6622,0x6623, + 0x6624,0x6626,0x6629,0x662A,0x662B,0x662C,0x662E,0x6630, + 0x6632,0x6633,0x6637,0x6638,0x6639,0x663A,0x663B,0x663D, + 0x663F,0x6640,0x6642,0x6644,0x6645,0x6646,0x6647,0x6648, + 0x6649,0x664A,0x664D,0x664E,0x6650,0x6651,0x6658,0x6659, + 0x665B,0x665C,0x665D,0x665E,0x6660,0x6662,0x6663,0x6665, + 0x6667,0x6669,0x666A,0x666B,0x666C,0x666D,0x6671,0x6672, + 0x6673,0x6675,0x6678,0x6679,0x667B,0x667C,0x667D,0x667F, + 0x6680,0x6681,0x6683,0x6685,0x6686,0x6688,0x6689,0x668A, + 0x668B,0x668D,0x668E,0x668F,0x6690,0x6692,0x6693,0x6694, + 0x6695,0x6698,0x6699,0x669A,0x669B,0x669C,0x669E,0x669F, + 0x66A0,0x66A1,0x66A2,0x66A3,0x66A4,0x66A5,0x66A6,0x66A9, + 0x66AA,0x66AB,0x66AC,0x66AD,0x66AF,0x66B0,0x66B1,0x66B2, + 0x66B3,0x66B5,0x66B6,0x66B7,0x66B8,0x66BA,0x66BB,0x66BC, + 0x66BD,0x66BF,0x66C0,0x66C1,0x66C2,0x66C3,0x66C4,0x66C5, + 0x66C6,0x66C7,0x66C8,0x66C9,0x66CA,0x66CB,0x66CC,0x66CD, + 0x66CE,0x66CF,0x66D0,0x66D1,0x66D2,0x66D3,0x66D4,0x66D5, + 0x66D6,0x66D7,0x66D8,0x66DA,0x66DE,0x66DF,0x66E0,0x66E1, + 0x66E2,0x66E3,0x66E4,0x66E5,0x66E7,0x66E8,0x66EA,0x66EB, + 0x66EC,0x66ED,0x66EE,0x66EF,0x66F1,0x66F5,0x66F6,0x66F8, + 0x66FA,0x66FB,0x66FD,0x6701,0x6702,0x6703, + }, + {0x6704,0x6705,0x6706,0x6707,0x670C,0x670E,0x670F,0x6711, + 0x6712,0x6713,0x6716,0x6718,0x6719,0x671A,0x671C,0x671E, + 0x6720,0x6721,0x6722,0x6723,0x6724,0x6725,0x6727,0x6729, + 0x672E,0x6730,0x6732,0x6733,0x6736,0x6737,0x6738,0x6739, + 0x673B,0x673C,0x673E,0x673F,0x6741,0x6744,0x6745,0x6747, + 0x674A,0x674B,0x674D,0x6752,0x6754,0x6755,0x6757,0x6758, + 0x6759,0x675A,0x675B,0x675D,0x6762,0x6763,0x6764,0x6766, + 0x6767,0x676B,0x676C,0x676E,0x6771,0x6774,0x6776,0x6778, + 0x6779,0x677A,0x677B,0x677D,0x6780,0x6782,0x6783,0x6785, + 0x6786,0x6788,0x678A,0x678C,0x678D,0x678E,0x678F,0x6791, + 0x6792,0x6793,0x6794,0x6796,0x6799,0x679B,0x679F,0x67A0, + 0x67A1,0x67A4,0x67A6,0x67A9,0x67AC,0x67AE,0x67B1,0x67B2, + 0x67B4,0x67B9,0x67BA,0x67BB,0x67BC,0x67BD,0x67BE,0x67BF, + 0x67C0,0x67C2,0x67C5,0x67C6,0x67C7,0x67C8,0x67C9,0x67CA, + 0x67CB,0x67CC,0x67CD,0x67CE,0x67D5,0x67D6,0x67D7,0x67DB, + 0x67DF,0x67E1,0x67E3,0x67E4,0x67E6,0x67E7,0x67E8,0x67EA, + 0x67EB,0x67ED,0x67EE,0x67F2,0x67F5,0x67F6,0x67F7,0x67F8, + 0x67F9,0x67FA,0x67FB,0x67FC,0x67FE,0x6801,0x6802,0x6803, + 0x6804,0x6806,0x680D,0x6810,0x6812,0x6814,0x6815,0x6818, + 0x6819,0x681A,0x681B,0x681C,0x681E,0x681F,0x6820,0x6822, + 0x6823,0x6824,0x6825,0x6826,0x6827,0x6828,0x682B,0x682C, + 0x682D,0x682E,0x682F,0x6830,0x6831,0x6834,0x6835,0x6836, + 0x683A,0x683B,0x683F,0x6847,0x684B,0x684D,0x684F,0x6852, + 0x6856,0x6857,0x6858,0x6859,0x685A,0x685B, + }, + {0x685C,0x685D,0x685E,0x685F,0x686A,0x686C,0x686D,0x686E, + 0x686F,0x6870,0x6871,0x6872,0x6873,0x6875,0x6878,0x6879, + 0x687A,0x687B,0x687C,0x687D,0x687E,0x687F,0x6880,0x6882, + 0x6884,0x6887,0x6888,0x6889,0x688A,0x688B,0x688C,0x688D, + 0x688E,0x6890,0x6891,0x6892,0x6894,0x6895,0x6896,0x6898, + 0x6899,0x689A,0x689B,0x689C,0x689D,0x689E,0x689F,0x68A0, + 0x68A1,0x68A3,0x68A4,0x68A5,0x68A9,0x68AA,0x68AB,0x68AC, + 0x68AE,0x68B1,0x68B2,0x68B4,0x68B6,0x68B7,0x68B8,0x68B9, + 0x68BA,0x68BB,0x68BC,0x68BD,0x68BE,0x68BF,0x68C1,0x68C3, + 0x68C4,0x68C5,0x68C6,0x68C7,0x68C8,0x68CA,0x68CC,0x68CE, + 0x68CF,0x68D0,0x68D1,0x68D3,0x68D4,0x68D6,0x68D7,0x68D9, + 0x68DB,0x68DC,0x68DD,0x68DE,0x68DF,0x68E1,0x68E2,0x68E4, + 0x68E5,0x68E6,0x68E7,0x68E8,0x68E9,0x68EA,0x68EB,0x68EC, + 0x68ED,0x68EF,0x68F2,0x68F3,0x68F4,0x68F6,0x68F7,0x68F8, + 0x68FB,0x68FD,0x68FE,0x68FF,0x6900,0x6902,0x6903,0x6904, + 0x6906,0x6907,0x6908,0x6909,0x690A,0x690C,0x690F,0x6911, + 0x6913,0x6914,0x6915,0x6916,0x6917,0x6918,0x6919,0x691A, + 0x691B,0x691C,0x691D,0x691E,0x6921,0x6922,0x6923,0x6925, + 0x6926,0x6927,0x6928,0x6929,0x692A,0x692B,0x692C,0x692E, + 0x692F,0x6931,0x6932,0x6933,0x6935,0x6936,0x6937,0x6938, + 0x693A,0x693B,0x693C,0x693E,0x6940,0x6941,0x6943,0x6944, + 0x6945,0x6946,0x6947,0x6948,0x6949,0x694A,0x694B,0x694C, + 0x694D,0x694E,0x694F,0x6950,0x6951,0x6952,0x6953,0x6955, + 0x6956,0x6958,0x6959,0x695B,0x695C,0x695F, + }, + {0x6961,0x6962,0x6964,0x6965,0x6967,0x6968,0x6969,0x696A, + 0x696C,0x696D,0x696F,0x6970,0x6972,0x6973,0x6974,0x6975, + 0x6976,0x697A,0x697B,0x697D,0x697E,0x697F,0x6981,0x6983, + 0x6985,0x698A,0x698B,0x698C,0x698E,0x698F,0x6990,0x6991, + 0x6992,0x6993,0x6996,0x6997,0x6999,0x699A,0x699D,0x699E, + 0x699F,0x69A0,0x69A1,0x69A2,0x69A3,0x69A4,0x69A5,0x69A6, + 0x69A9,0x69AA,0x69AC,0x69AE,0x69AF,0x69B0,0x69B2,0x69B3, + 0x69B5,0x69B6,0x69B8,0x69B9,0x69BA,0x69BC,0x69BD,0x69BE, + 0x69BF,0x69C0,0x69C2,0x69C3,0x69C4,0x69C5,0x69C6,0x69C7, + 0x69C8,0x69C9,0x69CB,0x69CD,0x69CF,0x69D1,0x69D2,0x69D3, + 0x69D5,0x69D6,0x69D7,0x69D8,0x69D9,0x69DA,0x69DC,0x69DD, + 0x69DE,0x69E1,0x69E2,0x69E3,0x69E4,0x69E5,0x69E6,0x69E7, + 0x69E8,0x69E9,0x69EA,0x69EB,0x69EC,0x69EE,0x69EF,0x69F0, + 0x69F1,0x69F3,0x69F4,0x69F5,0x69F6,0x69F7,0x69F8,0x69F9, + 0x69FA,0x69FB,0x69FC,0x69FE,0x6A00,0x6A01,0x6A02,0x6A03, + 0x6A04,0x6A05,0x6A06,0x6A07,0x6A08,0x6A09,0x6A0B,0x6A0C, + 0x6A0D,0x6A0E,0x6A0F,0x6A10,0x6A11,0x6A12,0x6A13,0x6A14, + 0x6A15,0x6A16,0x6A19,0x6A1A,0x6A1B,0x6A1C,0x6A1D,0x6A1E, + 0x6A20,0x6A22,0x6A23,0x6A24,0x6A25,0x6A26,0x6A27,0x6A29, + 0x6A2B,0x6A2C,0x6A2D,0x6A2E,0x6A30,0x6A32,0x6A33,0x6A34, + 0x6A36,0x6A37,0x6A38,0x6A39,0x6A3A,0x6A3B,0x6A3C,0x6A3F, + 0x6A40,0x6A41,0x6A42,0x6A43,0x6A45,0x6A46,0x6A48,0x6A49, + 0x6A4A,0x6A4B,0x6A4C,0x6A4D,0x6A4E,0x6A4F,0x6A51,0x6A52, + 0x6A53,0x6A54,0x6A55,0x6A56,0x6A57,0x6A5A, + }, + {0x6A5C,0x6A5D,0x6A5E,0x6A5F,0x6A60,0x6A62,0x6A63,0x6A64, + 0x6A66,0x6A67,0x6A68,0x6A69,0x6A6A,0x6A6B,0x6A6C,0x6A6D, + 0x6A6E,0x6A6F,0x6A70,0x6A72,0x6A73,0x6A74,0x6A75,0x6A76, + 0x6A77,0x6A78,0x6A7A,0x6A7B,0x6A7D,0x6A7E,0x6A7F,0x6A81, + 0x6A82,0x6A83,0x6A85,0x6A86,0x6A87,0x6A88,0x6A89,0x6A8A, + 0x6A8B,0x6A8C,0x6A8D,0x6A8F,0x6A92,0x6A93,0x6A94,0x6A95, + 0x6A96,0x6A98,0x6A99,0x6A9A,0x6A9B,0x6A9C,0x6A9D,0x6A9E, + 0x6A9F,0x6AA1,0x6AA2,0x6AA3,0x6AA4,0x6AA5,0x6AA6,0x6AA7, + 0x6AA8,0x6AAA,0x6AAD,0x6AAE,0x6AAF,0x6AB0,0x6AB1,0x6AB2, + 0x6AB3,0x6AB4,0x6AB5,0x6AB6,0x6AB7,0x6AB8,0x6AB9,0x6ABA, + 0x6ABB,0x6ABC,0x6ABD,0x6ABE,0x6ABF,0x6AC0,0x6AC1,0x6AC2, + 0x6AC3,0x6AC4,0x6AC5,0x6AC6,0x6AC7,0x6AC8,0x6AC9,0x6ACA, + 0x6ACB,0x6ACC,0x6ACD,0x6ACE,0x6ACF,0x6AD0,0x6AD1,0x6AD2, + 0x6AD3,0x6AD4,0x6AD5,0x6AD6,0x6AD7,0x6AD8,0x6AD9,0x6ADA, + 0x6ADB,0x6ADC,0x6ADD,0x6ADE,0x6ADF,0x6AE0,0x6AE1,0x6AE2, + 0x6AE3,0x6AE4,0x6AE5,0x6AE6,0x6AE7,0x6AE8,0x6AE9,0x6AEA, + 0x6AEB,0x6AEC,0x6AED,0x6AEE,0x6AEF,0x6AF0,0x6AF1,0x6AF2, + 0x6AF3,0x6AF4,0x6AF5,0x6AF6,0x6AF7,0x6AF8,0x6AF9,0x6AFA, + 0x6AFB,0x6AFC,0x6AFD,0x6AFE,0x6AFF,0x6B00,0x6B01,0x6B02, + 0x6B03,0x6B04,0x6B05,0x6B06,0x6B07,0x6B08,0x6B09,0x6B0A, + 0x6B0B,0x6B0C,0x6B0D,0x6B0E,0x6B0F,0x6B10,0x6B11,0x6B12, + 0x6B13,0x6B14,0x6B15,0x6B16,0x6B17,0x6B18,0x6B19,0x6B1A, + 0x6B1B,0x6B1C,0x6B1D,0x6B1E,0x6B1F,0x6B25,0x6B26,0x6B28, + 0x6B29,0x6B2A,0x6B2B,0x6B2C,0x6B2D,0x6B2E, + }, + {0x6B2F,0x6B30,0x6B31,0x6B33,0x6B34,0x6B35,0x6B36,0x6B38, + 0x6B3B,0x6B3C,0x6B3D,0x6B3F,0x6B40,0x6B41,0x6B42,0x6B44, + 0x6B45,0x6B48,0x6B4A,0x6B4B,0x6B4D,0x6B4E,0x6B4F,0x6B50, + 0x6B51,0x6B52,0x6B53,0x6B54,0x6B55,0x6B56,0x6B57,0x6B58, + 0x6B5A,0x6B5B,0x6B5C,0x6B5D,0x6B5E,0x6B5F,0x6B60,0x6B61, + 0x6B68,0x6B69,0x6B6B,0x6B6C,0x6B6D,0x6B6E,0x6B6F,0x6B70, + 0x6B71,0x6B72,0x6B73,0x6B74,0x6B75,0x6B76,0x6B77,0x6B78, + 0x6B7A,0x6B7D,0x6B7E,0x6B7F,0x6B80,0x6B85,0x6B88,0x6B8C, + 0x6B8E,0x6B8F,0x6B90,0x6B91,0x6B94,0x6B95,0x6B97,0x6B98, + 0x6B99,0x6B9C,0x6B9D,0x6B9E,0x6B9F,0x6BA0,0x6BA2,0x6BA3, + 0x6BA4,0x6BA5,0x6BA6,0x6BA7,0x6BA8,0x6BA9,0x6BAB,0x6BAC, + 0x6BAD,0x6BAE,0x6BAF,0x6BB0,0x6BB1,0x6BB2,0x6BB6,0x6BB8, + 0x6BB9,0x6BBA,0x6BBB,0x6BBC,0x6BBD,0x6BBE,0x6BC0,0x6BC3, + 0x6BC4,0x6BC6,0x6BC7,0x6BC8,0x6BC9,0x6BCA,0x6BCC,0x6BCE, + 0x6BD0,0x6BD1,0x6BD8,0x6BDA,0x6BDC,0x6BDD,0x6BDE,0x6BDF, + 0x6BE0,0x6BE2,0x6BE3,0x6BE4,0x6BE5,0x6BE6,0x6BE7,0x6BE8, + 0x6BE9,0x6BEC,0x6BED,0x6BEE,0x6BF0,0x6BF1,0x6BF2,0x6BF4, + 0x6BF6,0x6BF7,0x6BF8,0x6BFA,0x6BFB,0x6BFC,0x6BFE,0x6BFF, + 0x6C00,0x6C01,0x6C02,0x6C03,0x6C04,0x6C08,0x6C09,0x6C0A, + 0x6C0B,0x6C0C,0x6C0E,0x6C12,0x6C17,0x6C1C,0x6C1D,0x6C1E, + 0x6C20,0x6C23,0x6C25,0x6C2B,0x6C2C,0x6C2D,0x6C31,0x6C33, + 0x6C36,0x6C37,0x6C39,0x6C3A,0x6C3B,0x6C3C,0x6C3E,0x6C3F, + 0x6C43,0x6C44,0x6C45,0x6C48,0x6C4B,0x6C4C,0x6C4D,0x6C4E, + 0x6C4F,0x6C51,0x6C52,0x6C53,0x6C56,0x6C58, + }, + {0x6C59,0x6C5A,0x6C62,0x6C63,0x6C65,0x6C66,0x6C67,0x6C6B, + 0x6C6C,0x6C6D,0x6C6E,0x6C6F,0x6C71,0x6C73,0x6C75,0x6C77, + 0x6C78,0x6C7A,0x6C7B,0x6C7C,0x6C7F,0x6C80,0x6C84,0x6C87, + 0x6C8A,0x6C8B,0x6C8D,0x6C8E,0x6C91,0x6C92,0x6C95,0x6C96, + 0x6C97,0x6C98,0x6C9A,0x6C9C,0x6C9D,0x6C9E,0x6CA0,0x6CA2, + 0x6CA8,0x6CAC,0x6CAF,0x6CB0,0x6CB4,0x6CB5,0x6CB6,0x6CB7, + 0x6CBA,0x6CC0,0x6CC1,0x6CC2,0x6CC3,0x6CC6,0x6CC7,0x6CC8, + 0x6CCB,0x6CCD,0x6CCE,0x6CCF,0x6CD1,0x6CD2,0x6CD8,0x6CD9, + 0x6CDA,0x6CDC,0x6CDD,0x6CDF,0x6CE4,0x6CE6,0x6CE7,0x6CE9, + 0x6CEC,0x6CED,0x6CF2,0x6CF4,0x6CF9,0x6CFF,0x6D00,0x6D02, + 0x6D03,0x6D05,0x6D06,0x6D08,0x6D09,0x6D0A,0x6D0D,0x6D0F, + 0x6D10,0x6D11,0x6D13,0x6D14,0x6D15,0x6D16,0x6D18,0x6D1C, + 0x6D1D,0x6D1F,0x6D20,0x6D21,0x6D22,0x6D23,0x6D24,0x6D26, + 0x6D28,0x6D29,0x6D2C,0x6D2D,0x6D2F,0x6D30,0x6D34,0x6D36, + 0x6D37,0x6D38,0x6D3A,0x6D3F,0x6D40,0x6D42,0x6D44,0x6D49, + 0x6D4C,0x6D50,0x6D55,0x6D56,0x6D57,0x6D58,0x6D5B,0x6D5D, + 0x6D5F,0x6D61,0x6D62,0x6D64,0x6D65,0x6D67,0x6D68,0x6D6B, + 0x6D6C,0x6D6D,0x6D70,0x6D71,0x6D72,0x6D73,0x6D75,0x6D76, + 0x6D79,0x6D7A,0x6D7B,0x6D7D,0x6D7E,0x6D7F,0x6D80,0x6D81, + 0x6D83,0x6D84,0x6D86,0x6D87,0x6D8A,0x6D8B,0x6D8D,0x6D8F, + 0x6D90,0x6D92,0x6D96,0x6D97,0x6D98,0x6D99,0x6D9A,0x6D9C, + 0x6DA2,0x6DA5,0x6DAC,0x6DAD,0x6DB0,0x6DB1,0x6DB3,0x6DB4, + 0x6DB6,0x6DB7,0x6DB9,0x6DBA,0x6DBB,0x6DBC,0x6DBD,0x6DBE, + 0x6DC1,0x6DC2,0x6DC3,0x6DC8,0x6DC9,0x6DCA, + }, + {0x6DCD,0x6DCE,0x6DCF,0x6DD0,0x6DD2,0x6DD3,0x6DD4,0x6DD5, + 0x6DD7,0x6DDA,0x6DDB,0x6DDC,0x6DDF,0x6DE2,0x6DE3,0x6DE5, + 0x6DE7,0x6DE8,0x6DE9,0x6DEA,0x6DED,0x6DEF,0x6DF0,0x6DF2, + 0x6DF4,0x6DF5,0x6DF6,0x6DF8,0x6DFA,0x6DFD,0x6DFE,0x6DFF, + 0x6E00,0x6E01,0x6E02,0x6E03,0x6E04,0x6E06,0x6E07,0x6E08, + 0x6E09,0x6E0B,0x6E0F,0x6E12,0x6E13,0x6E15,0x6E18,0x6E19, + 0x6E1B,0x6E1C,0x6E1E,0x6E1F,0x6E22,0x6E26,0x6E27,0x6E28, + 0x6E2A,0x6E2C,0x6E2E,0x6E30,0x6E31,0x6E33,0x6E35,0x6E36, + 0x6E37,0x6E39,0x6E3B,0x6E3C,0x6E3D,0x6E3E,0x6E3F,0x6E40, + 0x6E41,0x6E42,0x6E45,0x6E46,0x6E47,0x6E48,0x6E49,0x6E4A, + 0x6E4B,0x6E4C,0x6E4F,0x6E50,0x6E51,0x6E52,0x6E55,0x6E57, + 0x6E59,0x6E5A,0x6E5C,0x6E5D,0x6E5E,0x6E60,0x6E61,0x6E62, + 0x6E63,0x6E64,0x6E65,0x6E66,0x6E67,0x6E68,0x6E69,0x6E6A, + 0x6E6C,0x6E6D,0x6E6F,0x6E70,0x6E71,0x6E72,0x6E73,0x6E74, + 0x6E75,0x6E76,0x6E77,0x6E78,0x6E79,0x6E7A,0x6E7B,0x6E7C, + 0x6E7D,0x6E80,0x6E81,0x6E82,0x6E84,0x6E87,0x6E88,0x6E8A, + 0x6E8B,0x6E8C,0x6E8D,0x6E8E,0x6E91,0x6E92,0x6E93,0x6E94, + 0x6E95,0x6E96,0x6E97,0x6E99,0x6E9A,0x6E9B,0x6E9D,0x6E9E, + 0x6EA0,0x6EA1,0x6EA3,0x6EA4,0x6EA6,0x6EA8,0x6EA9,0x6EAB, + 0x6EAC,0x6EAD,0x6EAE,0x6EB0,0x6EB3,0x6EB5,0x6EB8,0x6EB9, + 0x6EBC,0x6EBE,0x6EBF,0x6EC0,0x6EC3,0x6EC4,0x6EC5,0x6EC6, + 0x6EC8,0x6EC9,0x6ECA,0x6ECC,0x6ECD,0x6ECE,0x6ED0,0x6ED2, + 0x6ED6,0x6ED8,0x6ED9,0x6EDB,0x6EDC,0x6EDD,0x6EE3,0x6EE7, + 0x6EEA,0x6EEB,0x6EEC,0x6EED,0x6EEE,0x6EEF, + }, + {0x6EF0,0x6EF1,0x6EF2,0x6EF3,0x6EF5,0x6EF6,0x6EF7,0x6EF8, + 0x6EFA,0x6EFB,0x6EFC,0x6EFD,0x6EFE,0x6EFF,0x6F00,0x6F01, + 0x6F03,0x6F04,0x6F05,0x6F07,0x6F08,0x6F0A,0x6F0B,0x6F0C, + 0x6F0D,0x6F0E,0x6F10,0x6F11,0x6F12,0x6F16,0x6F17,0x6F18, + 0x6F19,0x6F1A,0x6F1B,0x6F1C,0x6F1D,0x6F1E,0x6F1F,0x6F21, + 0x6F22,0x6F23,0x6F25,0x6F26,0x6F27,0x6F28,0x6F2C,0x6F2E, + 0x6F30,0x6F32,0x6F34,0x6F35,0x6F37,0x6F38,0x6F39,0x6F3A, + 0x6F3B,0x6F3C,0x6F3D,0x6F3F,0x6F40,0x6F41,0x6F42,0x6F43, + 0x6F44,0x6F45,0x6F48,0x6F49,0x6F4A,0x6F4C,0x6F4E,0x6F4F, + 0x6F50,0x6F51,0x6F52,0x6F53,0x6F54,0x6F55,0x6F56,0x6F57, + 0x6F59,0x6F5A,0x6F5B,0x6F5D,0x6F5F,0x6F60,0x6F61,0x6F63, + 0x6F64,0x6F65,0x6F67,0x6F68,0x6F69,0x6F6A,0x6F6B,0x6F6C, + 0x6F6F,0x6F70,0x6F71,0x6F73,0x6F75,0x6F76,0x6F77,0x6F79, + 0x6F7B,0x6F7D,0x6F7E,0x6F7F,0x6F80,0x6F81,0x6F82,0x6F83, + 0x6F85,0x6F86,0x6F87,0x6F8A,0x6F8B,0x6F8F,0x6F90,0x6F91, + 0x6F92,0x6F93,0x6F94,0x6F95,0x6F96,0x6F97,0x6F98,0x6F99, + 0x6F9A,0x6F9B,0x6F9D,0x6F9E,0x6F9F,0x6FA0,0x6FA2,0x6FA3, + 0x6FA4,0x6FA5,0x6FA6,0x6FA8,0x6FA9,0x6FAA,0x6FAB,0x6FAC, + 0x6FAD,0x6FAE,0x6FAF,0x6FB0,0x6FB1,0x6FB2,0x6FB4,0x6FB5, + 0x6FB7,0x6FB8,0x6FBA,0x6FBB,0x6FBC,0x6FBD,0x6FBE,0x6FBF, + 0x6FC1,0x6FC3,0x6FC4,0x6FC5,0x6FC6,0x6FC7,0x6FC8,0x6FCA, + 0x6FCB,0x6FCC,0x6FCD,0x6FCE,0x6FCF,0x6FD0,0x6FD3,0x6FD4, + 0x6FD5,0x6FD6,0x6FD7,0x6FD8,0x6FD9,0x6FDA,0x6FDB,0x6FDC, + 0x6FDD,0x6FDF,0x6FE2,0x6FE3,0x6FE4,0x6FE5, + }, + {0x6FE6,0x6FE7,0x6FE8,0x6FE9,0x6FEA,0x6FEB,0x6FEC,0x6FED, + 0x6FF0,0x6FF1,0x6FF2,0x6FF3,0x6FF4,0x6FF5,0x6FF6,0x6FF7, + 0x6FF8,0x6FF9,0x6FFA,0x6FFB,0x6FFC,0x6FFD,0x6FFE,0x6FFF, + 0x7000,0x7001,0x7002,0x7003,0x7004,0x7005,0x7006,0x7007, + 0x7008,0x7009,0x700A,0x700B,0x700C,0x700D,0x700E,0x700F, + 0x7010,0x7012,0x7013,0x7014,0x7015,0x7016,0x7017,0x7018, + 0x7019,0x701C,0x701D,0x701E,0x701F,0x7020,0x7021,0x7022, + 0x7024,0x7025,0x7026,0x7027,0x7028,0x7029,0x702A,0x702B, + 0x702C,0x702D,0x702E,0x702F,0x7030,0x7031,0x7032,0x7033, + 0x7034,0x7036,0x7037,0x7038,0x703A,0x703B,0x703C,0x703D, + 0x703E,0x703F,0x7040,0x7041,0x7042,0x7043,0x7044,0x7045, + 0x7046,0x7047,0x7048,0x7049,0x704A,0x704B,0x704D,0x704E, + 0x7050,0x7051,0x7052,0x7053,0x7054,0x7055,0x7056,0x7057, + 0x7058,0x7059,0x705A,0x705B,0x705C,0x705D,0x705F,0x7060, + 0x7061,0x7062,0x7063,0x7064,0x7065,0x7066,0x7067,0x7068, + 0x7069,0x706A,0x706E,0x7071,0x7072,0x7073,0x7074,0x7077, + 0x7079,0x707A,0x707B,0x707D,0x7081,0x7082,0x7083,0x7084, + 0x7086,0x7087,0x7088,0x708B,0x708C,0x708D,0x708F,0x7090, + 0x7091,0x7093,0x7097,0x7098,0x709A,0x709B,0x709E,0x709F, + 0x70A0,0x70A1,0x70A2,0x70A3,0x70A4,0x70A5,0x70A6,0x70A7, + 0x70A8,0x70A9,0x70AA,0x70B0,0x70B2,0x70B4,0x70B5,0x70B6, + 0x70BA,0x70BE,0x70BF,0x70C4,0x70C5,0x70C6,0x70C7,0x70C9, + 0x70CB,0x70CC,0x70CD,0x70CE,0x70CF,0x70D0,0x70D1,0x70D2, + 0x70D3,0x70D4,0x70D5,0x70D6,0x70D7,0x70DA, + }, + {0x70DC,0x70DD,0x70DE,0x70E0,0x70E1,0x70E2,0x70E3,0x70E5, + 0x70EA,0x70EE,0x70F0,0x70F1,0x70F2,0x70F3,0x70F4,0x70F5, + 0x70F6,0x70F8,0x70FA,0x70FB,0x70FC,0x70FE,0x70FF,0x7100, + 0x7101,0x7102,0x7103,0x7104,0x7105,0x7106,0x7107,0x7108, + 0x710B,0x710C,0x710D,0x710E,0x710F,0x7111,0x7112,0x7114, + 0x7117,0x711B,0x711C,0x711D,0x711E,0x711F,0x7120,0x7121, + 0x7122,0x7123,0x7124,0x7125,0x7127,0x7128,0x7129,0x712A, + 0x712B,0x712C,0x712D,0x712E,0x7132,0x7133,0x7134,0x7135, + 0x7137,0x7138,0x7139,0x713A,0x713B,0x713C,0x713D,0x713E, + 0x713F,0x7140,0x7141,0x7142,0x7143,0x7144,0x7146,0x7147, + 0x7148,0x7149,0x714B,0x714D,0x714F,0x7150,0x7151,0x7152, + 0x7153,0x7154,0x7155,0x7156,0x7157,0x7158,0x7159,0x715A, + 0x715B,0x715D,0x715F,0x7160,0x7161,0x7162,0x7163,0x7165, + 0x7169,0x716A,0x716B,0x716C,0x716D,0x716F,0x7170,0x7171, + 0x7174,0x7175,0x7176,0x7177,0x7179,0x717B,0x717C,0x717E, + 0x717F,0x7180,0x7181,0x7182,0x7183,0x7185,0x7186,0x7187, + 0x7188,0x7189,0x718B,0x718C,0x718D,0x718E,0x7190,0x7191, + 0x7192,0x7193,0x7195,0x7196,0x7197,0x719A,0x719B,0x719C, + 0x719D,0x719E,0x71A1,0x71A2,0x71A3,0x71A4,0x71A5,0x71A6, + 0x71A7,0x71A9,0x71AA,0x71AB,0x71AD,0x71AE,0x71AF,0x71B0, + 0x71B1,0x71B2,0x71B4,0x71B6,0x71B7,0x71B8,0x71BA,0x71BB, + 0x71BC,0x71BD,0x71BE,0x71BF,0x71C0,0x71C1,0x71C2,0x71C4, + 0x71C5,0x71C6,0x71C7,0x71C8,0x71C9,0x71CA,0x71CB,0x71CC, + 0x71CD,0x71CF,0x71D0,0x71D1,0x71D2,0x71D3, + }, + {0x71D6,0x71D7,0x71D8,0x71D9,0x71DA,0x71DB,0x71DC,0x71DD, + 0x71DE,0x71DF,0x71E1,0x71E2,0x71E3,0x71E4,0x71E6,0x71E8, + 0x71E9,0x71EA,0x71EB,0x71EC,0x71ED,0x71EF,0x71F0,0x71F1, + 0x71F2,0x71F3,0x71F4,0x71F5,0x71F6,0x71F7,0x71F8,0x71FA, + 0x71FB,0x71FC,0x71FD,0x71FE,0x71FF,0x7200,0x7201,0x7202, + 0x7203,0x7204,0x7205,0x7207,0x7208,0x7209,0x720A,0x720B, + 0x720C,0x720D,0x720E,0x720F,0x7210,0x7211,0x7212,0x7213, + 0x7214,0x7215,0x7216,0x7217,0x7218,0x7219,0x721A,0x721B, + 0x721C,0x721E,0x721F,0x7220,0x7221,0x7222,0x7223,0x7224, + 0x7225,0x7226,0x7227,0x7229,0x722B,0x722D,0x722E,0x722F, + 0x7232,0x7233,0x7234,0x723A,0x723C,0x723E,0x7240,0x7241, + 0x7242,0x7243,0x7244,0x7245,0x7246,0x7249,0x724A,0x724B, + 0x724E,0x724F,0x7250,0x7251,0x7253,0x7254,0x7255,0x7257, + 0x7258,0x725A,0x725C,0x725E,0x7260,0x7263,0x7264,0x7265, + 0x7268,0x726A,0x726B,0x726C,0x726D,0x7270,0x7271,0x7273, + 0x7274,0x7276,0x7277,0x7278,0x727B,0x727C,0x727D,0x7282, + 0x7283,0x7285,0x7286,0x7287,0x7288,0x7289,0x728C,0x728E, + 0x7290,0x7291,0x7293,0x7294,0x7295,0x7296,0x7297,0x7298, + 0x7299,0x729A,0x729B,0x729C,0x729D,0x729E,0x72A0,0x72A1, + 0x72A2,0x72A3,0x72A4,0x72A5,0x72A6,0x72A7,0x72A8,0x72A9, + 0x72AA,0x72AB,0x72AE,0x72B1,0x72B2,0x72B3,0x72B5,0x72BA, + 0x72BB,0x72BC,0x72BD,0x72BE,0x72BF,0x72C0,0x72C5,0x72C6, + 0x72C7,0x72C9,0x72CA,0x72CB,0x72CC,0x72CF,0x72D1,0x72D3, + 0x72D4,0x72D5,0x72D6,0x72D8,0x72DA,0x72DB, + }, + {0xE4C6,0xE4C7,0xE4C8,0xE4C9,0xE4CA,0xE4CB,0xE4CC,0xE4CD, + 0xE4CE,0xE4CF,0xE4D0,0xE4D1,0xE4D2,0xE4D3,0xE4D4,0xE4D5, + 0xE4D6,0xE4D7,0xE4D8,0xE4D9,0xE4DA,0xE4DB,0xE4DC,0xE4DD, + 0xE4DE,0xE4DF,0xE4E0,0xE4E1,0xE4E2,0xE4E3,0xE4E4,0xE4E5, + 0xE4E6,0xE4E7,0xE4E8,0xE4E9,0xE4EA,0xE4EB,0xE4EC,0xE4ED, + 0xE4EE,0xE4EF,0xE4F0,0xE4F1,0xE4F2,0xE4F3,0xE4F4,0xE4F5, + 0xE4F6,0xE4F7,0xE4F8,0xE4F9,0xE4FA,0xE4FB,0xE4FC,0xE4FD, + 0xE4FE,0xE4FF,0xE500,0xE501,0xE502,0xE503,0xE504,0xE505, + 0xE506,0xE507,0xE508,0xE509,0xE50A,0xE50B,0xE50C,0xE50D, + 0xE50E,0xE50F,0xE510,0xE511,0xE512,0xE513,0xE514,0xE515, + 0xE516,0xE517,0xE518,0xE519,0xE51A,0xE51B,0xE51C,0xE51D, + 0xE51E,0xE51F,0xE520,0xE521,0xE522,0xE523,0xE524,0xE525, + 0x3000,0x3001,0x3002,0x00B7,0x02C9,0x02C7,0x00A8,0x3003, + 0x3005,0x2014,0xFF5E,0x2016,0x2026,0x2018,0x2019,0x201C, + 0x201D,0x3014,0x3015,0x3008,0x3009,0x300A,0x300B,0x300C, + 0x300D,0x300E,0x300F,0x3016,0x3017,0x3010,0x3011,0x00B1, + 0x00D7,0x00F7,0x2236,0x2227,0x2228,0x2211,0x220F,0x222A, + 0x2229,0x2208,0x2237,0x221A,0x22A5,0x2225,0x2220,0x2312, + 0x2299,0x222B,0x222E,0x2261,0x224C,0x2248,0x223D,0x221D, + 0x2260,0x226E,0x226F,0x2264,0x2265,0x221E,0x2235,0x2234, + 0x2642,0x2640,0x00B0,0x2032,0x2033,0x2103,0xFF04,0x00A4, + 0xFFE0,0xFFE1,0x2030,0x00A7,0x2116,0x2606,0x2605,0x25CB, + 0x25CF,0x25CE,0x25C7,0x25C6,0x25A1,0x25A0,0x25B3,0x25B2, + 0x203B,0x2192,0x2190,0x2191,0x2193,0x3013, + }, + {0xE526,0xE527,0xE528,0xE529,0xE52A,0xE52B,0xE52C,0xE52D, + 0xE52E,0xE52F,0xE530,0xE531,0xE532,0xE533,0xE534,0xE535, + 0xE536,0xE537,0xE538,0xE539,0xE53A,0xE53B,0xE53C,0xE53D, + 0xE53E,0xE53F,0xE540,0xE541,0xE542,0xE543,0xE544,0xE545, + 0xE546,0xE547,0xE548,0xE549,0xE54A,0xE54B,0xE54C,0xE54D, + 0xE54E,0xE54F,0xE550,0xE551,0xE552,0xE553,0xE554,0xE555, + 0xE556,0xE557,0xE558,0xE559,0xE55A,0xE55B,0xE55C,0xE55D, + 0xE55E,0xE55F,0xE560,0xE561,0xE562,0xE563,0xE564,0xE565, + 0xE566,0xE567,0xE568,0xE569,0xE56A,0xE56B,0xE56C,0xE56D, + 0xE56E,0xE56F,0xE570,0xE571,0xE572,0xE573,0xE574,0xE575, + 0xE576,0xE577,0xE578,0xE579,0xE57A,0xE57B,0xE57C,0xE57D, + 0xE57E,0xE57F,0xE580,0xE581,0xE582,0xE583,0xE584,0xE585, + 0x2170,0x2171,0x2172,0x2173,0x2174,0x2175,0x2176,0x2177, + 0x2178,0x2179,0xE766,0xE767,0xE768,0xE769,0xE76A,0xE76B, + 0x2488,0x2489,0x248A,0x248B,0x248C,0x248D,0x248E,0x248F, + 0x2490,0x2491,0x2492,0x2493,0x2494,0x2495,0x2496,0x2497, + 0x2498,0x2499,0x249A,0x249B,0x2474,0x2475,0x2476,0x2477, + 0x2478,0x2479,0x247A,0x247B,0x247C,0x247D,0x247E,0x247F, + 0x2480,0x2481,0x2482,0x2483,0x2484,0x2485,0x2486,0x2487, + 0x2460,0x2461,0x2462,0x2463,0x2464,0x2465,0x2466,0x2467, + 0x2468,0x2469,0x20AC,0xE76D,0x3220,0x3221,0x3222,0x3223, + 0x3224,0x3225,0x3226,0x3227,0x3228,0x3229,0xE76E,0xE76F, + 0x2160,0x2161,0x2162,0x2163,0x2164,0x2165,0x2166,0x2167, + 0x2168,0x2169,0x216A,0x216B,0xE770,0xE771, + }, + {0xE586,0xE587,0xE588,0xE589,0xE58A,0xE58B,0xE58C,0xE58D, + 0xE58E,0xE58F,0xE590,0xE591,0xE592,0xE593,0xE594,0xE595, + 0xE596,0xE597,0xE598,0xE599,0xE59A,0xE59B,0xE59C,0xE59D, + 0xE59E,0xE59F,0xE5A0,0xE5A1,0xE5A2,0xE5A3,0xE5A4,0xE5A5, + 0xE5A6,0xE5A7,0xE5A8,0xE5A9,0xE5AA,0xE5AB,0xE5AC,0xE5AD, + 0xE5AE,0xE5AF,0xE5B0,0xE5B1,0xE5B2,0xE5B3,0xE5B4,0xE5B5, + 0xE5B6,0xE5B7,0xE5B8,0xE5B9,0xE5BA,0xE5BB,0xE5BC,0xE5BD, + 0xE5BE,0xE5BF,0xE5C0,0xE5C1,0xE5C2,0xE5C3,0xE5C4,0xE5C5, + 0xE5C6,0xE5C7,0xE5C8,0xE5C9,0xE5CA,0xE5CB,0xE5CC,0xE5CD, + 0xE5CE,0xE5CF,0xE5D0,0xE5D1,0xE5D2,0xE5D3,0xE5D4,0xE5D5, + 0xE5D6,0xE5D7,0xE5D8,0xE5D9,0xE5DA,0xE5DB,0xE5DC,0xE5DD, + 0xE5DE,0xE5DF,0xE5E0,0xE5E1,0xE5E2,0xE5E3,0xE5E4,0xE5E5, + 0xFF01,0xFF02,0xFF03,0xFFE5,0xFF05,0xFF06,0xFF07,0xFF08, + 0xFF09,0xFF0A,0xFF0B,0xFF0C,0xFF0D,0xFF0E,0xFF0F,0xFF10, + 0xFF11,0xFF12,0xFF13,0xFF14,0xFF15,0xFF16,0xFF17,0xFF18, + 0xFF19,0xFF1A,0xFF1B,0xFF1C,0xFF1D,0xFF1E,0xFF1F,0xFF20, + 0xFF21,0xFF22,0xFF23,0xFF24,0xFF25,0xFF26,0xFF27,0xFF28, + 0xFF29,0xFF2A,0xFF2B,0xFF2C,0xFF2D,0xFF2E,0xFF2F,0xFF30, + 0xFF31,0xFF32,0xFF33,0xFF34,0xFF35,0xFF36,0xFF37,0xFF38, + 0xFF39,0xFF3A,0xFF3B,0xFF3C,0xFF3D,0xFF3E,0xFF3F,0xFF40, + 0xFF41,0xFF42,0xFF43,0xFF44,0xFF45,0xFF46,0xFF47,0xFF48, + 0xFF49,0xFF4A,0xFF4B,0xFF4C,0xFF4D,0xFF4E,0xFF4F,0xFF50, + 0xFF51,0xFF52,0xFF53,0xFF54,0xFF55,0xFF56,0xFF57,0xFF58, + 0xFF59,0xFF5A,0xFF5B,0xFF5C,0xFF5D,0xFFE3, + }, + {0xE5E6,0xE5E7,0xE5E8,0xE5E9,0xE5EA,0xE5EB,0xE5EC,0xE5ED, + 0xE5EE,0xE5EF,0xE5F0,0xE5F1,0xE5F2,0xE5F3,0xE5F4,0xE5F5, + 0xE5F6,0xE5F7,0xE5F8,0xE5F9,0xE5FA,0xE5FB,0xE5FC,0xE5FD, + 0xE5FE,0xE5FF,0xE600,0xE601,0xE602,0xE603,0xE604,0xE605, + 0xE606,0xE607,0xE608,0xE609,0xE60A,0xE60B,0xE60C,0xE60D, + 0xE60E,0xE60F,0xE610,0xE611,0xE612,0xE613,0xE614,0xE615, + 0xE616,0xE617,0xE618,0xE619,0xE61A,0xE61B,0xE61C,0xE61D, + 0xE61E,0xE61F,0xE620,0xE621,0xE622,0xE623,0xE624,0xE625, + 0xE626,0xE627,0xE628,0xE629,0xE62A,0xE62B,0xE62C,0xE62D, + 0xE62E,0xE62F,0xE630,0xE631,0xE632,0xE633,0xE634,0xE635, + 0xE636,0xE637,0xE638,0xE639,0xE63A,0xE63B,0xE63C,0xE63D, + 0xE63E,0xE63F,0xE640,0xE641,0xE642,0xE643,0xE644,0xE645, + 0x3041,0x3042,0x3043,0x3044,0x3045,0x3046,0x3047,0x3048, + 0x3049,0x304A,0x304B,0x304C,0x304D,0x304E,0x304F,0x3050, + 0x3051,0x3052,0x3053,0x3054,0x3055,0x3056,0x3057,0x3058, + 0x3059,0x305A,0x305B,0x305C,0x305D,0x305E,0x305F,0x3060, + 0x3061,0x3062,0x3063,0x3064,0x3065,0x3066,0x3067,0x3068, + 0x3069,0x306A,0x306B,0x306C,0x306D,0x306E,0x306F,0x3070, + 0x3071,0x3072,0x3073,0x3074,0x3075,0x3076,0x3077,0x3078, + 0x3079,0x307A,0x307B,0x307C,0x307D,0x307E,0x307F,0x3080, + 0x3081,0x3082,0x3083,0x3084,0x3085,0x3086,0x3087,0x3088, + 0x3089,0x308A,0x308B,0x308C,0x308D,0x308E,0x308F,0x3090, + 0x3091,0x3092,0x3093,0xE772,0xE773,0xE774,0xE775,0xE776, + 0xE777,0xE778,0xE779,0xE77A,0xE77B,0xE77C, + }, + {0xE646,0xE647,0xE648,0xE649,0xE64A,0xE64B,0xE64C,0xE64D, + 0xE64E,0xE64F,0xE650,0xE651,0xE652,0xE653,0xE654,0xE655, + 0xE656,0xE657,0xE658,0xE659,0xE65A,0xE65B,0xE65C,0xE65D, + 0xE65E,0xE65F,0xE660,0xE661,0xE662,0xE663,0xE664,0xE665, + 0xE666,0xE667,0xE668,0xE669,0xE66A,0xE66B,0xE66C,0xE66D, + 0xE66E,0xE66F,0xE670,0xE671,0xE672,0xE673,0xE674,0xE675, + 0xE676,0xE677,0xE678,0xE679,0xE67A,0xE67B,0xE67C,0xE67D, + 0xE67E,0xE67F,0xE680,0xE681,0xE682,0xE683,0xE684,0xE685, + 0xE686,0xE687,0xE688,0xE689,0xE68A,0xE68B,0xE68C,0xE68D, + 0xE68E,0xE68F,0xE690,0xE691,0xE692,0xE693,0xE694,0xE695, + 0xE696,0xE697,0xE698,0xE699,0xE69A,0xE69B,0xE69C,0xE69D, + 0xE69E,0xE69F,0xE6A0,0xE6A1,0xE6A2,0xE6A3,0xE6A4,0xE6A5, + 0x30A1,0x30A2,0x30A3,0x30A4,0x30A5,0x30A6,0x30A7,0x30A8, + 0x30A9,0x30AA,0x30AB,0x30AC,0x30AD,0x30AE,0x30AF,0x30B0, + 0x30B1,0x30B2,0x30B3,0x30B4,0x30B5,0x30B6,0x30B7,0x30B8, + 0x30B9,0x30BA,0x30BB,0x30BC,0x30BD,0x30BE,0x30BF,0x30C0, + 0x30C1,0x30C2,0x30C3,0x30C4,0x30C5,0x30C6,0x30C7,0x30C8, + 0x30C9,0x30CA,0x30CB,0x30CC,0x30CD,0x30CE,0x30CF,0x30D0, + 0x30D1,0x30D2,0x30D3,0x30D4,0x30D5,0x30D6,0x30D7,0x30D8, + 0x30D9,0x30DA,0x30DB,0x30DC,0x30DD,0x30DE,0x30DF,0x30E0, + 0x30E1,0x30E2,0x30E3,0x30E4,0x30E5,0x30E6,0x30E7,0x30E8, + 0x30E9,0x30EA,0x30EB,0x30EC,0x30ED,0x30EE,0x30EF,0x30F0, + 0x30F1,0x30F2,0x30F3,0x30F4,0x30F5,0x30F6,0xE77D,0xE77E, + 0xE77F,0xE780,0xE781,0xE782,0xE783,0xE784, + }, + {0xE6A6,0xE6A7,0xE6A8,0xE6A9,0xE6AA,0xE6AB,0xE6AC,0xE6AD, + 0xE6AE,0xE6AF,0xE6B0,0xE6B1,0xE6B2,0xE6B3,0xE6B4,0xE6B5, + 0xE6B6,0xE6B7,0xE6B8,0xE6B9,0xE6BA,0xE6BB,0xE6BC,0xE6BD, + 0xE6BE,0xE6BF,0xE6C0,0xE6C1,0xE6C2,0xE6C3,0xE6C4,0xE6C5, + 0xE6C6,0xE6C7,0xE6C8,0xE6C9,0xE6CA,0xE6CB,0xE6CC,0xE6CD, + 0xE6CE,0xE6CF,0xE6D0,0xE6D1,0xE6D2,0xE6D3,0xE6D4,0xE6D5, + 0xE6D6,0xE6D7,0xE6D8,0xE6D9,0xE6DA,0xE6DB,0xE6DC,0xE6DD, + 0xE6DE,0xE6DF,0xE6E0,0xE6E1,0xE6E2,0xE6E3,0xE6E4,0xE6E5, + 0xE6E6,0xE6E7,0xE6E8,0xE6E9,0xE6EA,0xE6EB,0xE6EC,0xE6ED, + 0xE6EE,0xE6EF,0xE6F0,0xE6F1,0xE6F2,0xE6F3,0xE6F4,0xE6F5, + 0xE6F6,0xE6F7,0xE6F8,0xE6F9,0xE6FA,0xE6FB,0xE6FC,0xE6FD, + 0xE6FE,0xE6FF,0xE700,0xE701,0xE702,0xE703,0xE704,0xE705, + 0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398, + 0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,0x03A0, + 0x03A1,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9, + 0xE785,0xE786,0xE787,0xE788,0xE789,0xE78A,0xE78B,0xE78C, + 0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8, + 0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,0x03C0, + 0x03C1,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9, + 0xE78D,0xE78E,0xE78F,0xE790,0xE791,0xE792,0xE793,0xFE35, + 0xFE36,0xFE39,0xFE3A,0xFE3F,0xFE40,0xFE3D,0xFE3E,0xFE41, + 0xFE42,0xFE43,0xFE44,0xE794,0xE795,0xFE3B,0xFE3C,0xFE37, + 0xFE38,0xFE31,0xE796,0xFE33,0xFE34,0xE797,0xE798,0xE799, + 0xE79A,0xE79B,0xE79C,0xE79D,0xE79E,0xE79F, + }, + {0xE706,0xE707,0xE708,0xE709,0xE70A,0xE70B,0xE70C,0xE70D, + 0xE70E,0xE70F,0xE710,0xE711,0xE712,0xE713,0xE714,0xE715, + 0xE716,0xE717,0xE718,0xE719,0xE71A,0xE71B,0xE71C,0xE71D, + 0xE71E,0xE71F,0xE720,0xE721,0xE722,0xE723,0xE724,0xE725, + 0xE726,0xE727,0xE728,0xE729,0xE72A,0xE72B,0xE72C,0xE72D, + 0xE72E,0xE72F,0xE730,0xE731,0xE732,0xE733,0xE734,0xE735, + 0xE736,0xE737,0xE738,0xE739,0xE73A,0xE73B,0xE73C,0xE73D, + 0xE73E,0xE73F,0xE740,0xE741,0xE742,0xE743,0xE744,0xE745, + 0xE746,0xE747,0xE748,0xE749,0xE74A,0xE74B,0xE74C,0xE74D, + 0xE74E,0xE74F,0xE750,0xE751,0xE752,0xE753,0xE754,0xE755, + 0xE756,0xE757,0xE758,0xE759,0xE75A,0xE75B,0xE75C,0xE75D, + 0xE75E,0xE75F,0xE760,0xE761,0xE762,0xE763,0xE764,0xE765, + 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0401,0x0416, + 0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E, + 0x041F,0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426, + 0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E, + 0x042F,0xE7A0,0xE7A1,0xE7A2,0xE7A3,0xE7A4,0xE7A5,0xE7A6, + 0xE7A7,0xE7A8,0xE7A9,0xE7AA,0xE7AB,0xE7AC,0xE7AD,0xE7AE, + 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0451,0x0436, + 0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E, + 0x043F,0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446, + 0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E, + 0x044F,0xE7AF,0xE7B0,0xE7B1,0xE7B2,0xE7B3,0xE7B4,0xE7B5, + 0xE7B6,0xE7B7,0xE7B8,0xE7B9,0xE7BA,0xE7BB, + }, + {0x02CA,0x02CB,0x02D9,0x2013,0x2015,0x2025,0x2035,0x2105, + 0x2109,0x2196,0x2197,0x2198,0x2199,0x2215,0x221F,0x2223, + 0x2252,0x2266,0x2267,0x22BF,0x2550,0x2551,0x2552,0x2553, + 0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255A,0x255B, + 0x255C,0x255D,0x255E,0x255F,0x2560,0x2561,0x2562,0x2563, + 0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256A,0x256B, + 0x256C,0x256D,0x256E,0x256F,0x2570,0x2571,0x2572,0x2573, + 0x2581,0x2582,0x2583,0x2584,0x2585,0x2586,0x2587,0x2588, + 0x2589,0x258A,0x258B,0x258C,0x258D,0x258E,0x258F,0x2593, + 0x2594,0x2595,0x25BC,0x25BD,0x25E2,0x25E3,0x25E4,0x25E5, + 0x2609,0x2295,0x3012,0x301D,0x301E,0xE7BC,0xE7BD,0xE7BE, + 0xE7BF,0xE7C0,0xE7C1,0xE7C2,0xE7C3,0xE7C4,0xE7C5,0xE7C6, + 0x0101,0x00E1,0x01CE,0x00E0,0x0113,0x00E9,0x011B,0x00E8, + 0x012B,0x00ED,0x01D0,0x00EC,0x014D,0x00F3,0x01D2,0x00F2, + 0x016B,0x00FA,0x01D4,0x00F9,0x01D6,0x01D8,0x01DA,0x01DC, + 0x00FC,0x00EA,0x0251,0xE7C7,0x0144,0x0148,0x01F9,0x0261, + 0xE7C9,0xE7CA,0xE7CB,0xE7CC,0x3105,0x3106,0x3107,0x3108, + 0x3109,0x310A,0x310B,0x310C,0x310D,0x310E,0x310F,0x3110, + 0x3111,0x3112,0x3113,0x3114,0x3115,0x3116,0x3117,0x3118, + 0x3119,0x311A,0x311B,0x311C,0x311D,0x311E,0x311F,0x3120, + 0x3121,0x3122,0x3123,0x3124,0x3125,0x3126,0x3127,0x3128, + 0x3129,0xE7CD,0xE7CE,0xE7CF,0xE7D0,0xE7D1,0xE7D2,0xE7D3, + 0xE7D4,0xE7D5,0xE7D6,0xE7D7,0xE7D8,0xE7D9,0xE7DA,0xE7DB, + 0xE7DC,0xE7DD,0xE7DE,0xE7DF,0xE7E0,0xE7E1, + }, + {0x3021,0x3022,0x3023,0x3024,0x3025,0x3026,0x3027,0x3028, + 0x3029,0x32A3,0x338E,0x338F,0x339C,0x339D,0x339E,0x33A1, + 0x33C4,0x33CE,0x33D1,0x33D2,0x33D5,0xFE30,0xFFE2,0xFFE4, + 0xE7E2,0x2121,0x3231,0xE7E3,0x2010,0xE7E4,0xE7E5,0xE7E6, + 0x30FC,0x309B,0x309C,0x30FD,0x30FE,0x3006,0x309D,0x309E, + 0xFE49,0xFE4A,0xFE4B,0xFE4C,0xFE4D,0xFE4E,0xFE4F,0xFE50, + 0xFE51,0xFE52,0xFE54,0xFE55,0xFE56,0xFE57,0xFE59,0xFE5A, + 0xFE5B,0xFE5C,0xFE5D,0xFE5E,0xFE5F,0xFE60,0xFE61,0xFE62, + 0xFE63,0xFE64,0xFE65,0xFE66,0xFE68,0xFE69,0xFE6A,0xFE6B, + 0x303E,0x2FF0,0x2FF1,0x2FF2,0x2FF3,0x2FF4,0x2FF5,0x2FF6, + 0x2FF7,0x2FF8,0x2FF9,0x2FFA,0x2FFB,0x3007,0xE7F4,0xE7F5, + 0xE7F6,0xE7F7,0xE7F8,0xE7F9,0xE7FA,0xE7FB,0xE7FC,0xE7FD, + 0xE7FE,0xE7FF,0xE800,0x2500,0x2501,0x2502,0x2503,0x2504, + 0x2505,0x2506,0x2507,0x2508,0x2509,0x250A,0x250B,0x250C, + 0x250D,0x250E,0x250F,0x2510,0x2511,0x2512,0x2513,0x2514, + 0x2515,0x2516,0x2517,0x2518,0x2519,0x251A,0x251B,0x251C, + 0x251D,0x251E,0x251F,0x2520,0x2521,0x2522,0x2523,0x2524, + 0x2525,0x2526,0x2527,0x2528,0x2529,0x252A,0x252B,0x252C, + 0x252D,0x252E,0x252F,0x2530,0x2531,0x2532,0x2533,0x2534, + 0x2535,0x2536,0x2537,0x2538,0x2539,0x253A,0x253B,0x253C, + 0x253D,0x253E,0x253F,0x2540,0x2541,0x2542,0x2543,0x2544, + 0x2545,0x2546,0x2547,0x2548,0x2549,0x254A,0x254B,0xE801, + 0xE802,0xE803,0xE804,0xE805,0xE806,0xE807,0xE808,0xE809, + 0xE80A,0xE80B,0xE80C,0xE80D,0xE80E,0xE80F, + }, + {0x72DC,0x72DD,0x72DF,0x72E2,0x72E3,0x72E4,0x72E5,0x72E6, + 0x72E7,0x72EA,0x72EB,0x72F5,0x72F6,0x72F9,0x72FD,0x72FE, + 0x72FF,0x7300,0x7302,0x7304,0x7305,0x7306,0x7307,0x7308, + 0x7309,0x730B,0x730C,0x730D,0x730F,0x7310,0x7311,0x7312, + 0x7314,0x7318,0x7319,0x731A,0x731F,0x7320,0x7323,0x7324, + 0x7326,0x7327,0x7328,0x732D,0x732F,0x7330,0x7332,0x7333, + 0x7335,0x7336,0x733A,0x733B,0x733C,0x733D,0x7340,0x7341, + 0x7342,0x7343,0x7344,0x7345,0x7346,0x7347,0x7348,0x7349, + 0x734A,0x734B,0x734C,0x734E,0x734F,0x7351,0x7353,0x7354, + 0x7355,0x7356,0x7358,0x7359,0x735A,0x735B,0x735C,0x735D, + 0x735E,0x735F,0x7361,0x7362,0x7363,0x7364,0x7365,0x7366, + 0x7367,0x7368,0x7369,0x736A,0x736B,0x736E,0x7370,0x7371, + 0xE000,0xE001,0xE002,0xE003,0xE004,0xE005,0xE006,0xE007, + 0xE008,0xE009,0xE00A,0xE00B,0xE00C,0xE00D,0xE00E,0xE00F, + 0xE010,0xE011,0xE012,0xE013,0xE014,0xE015,0xE016,0xE017, + 0xE018,0xE019,0xE01A,0xE01B,0xE01C,0xE01D,0xE01E,0xE01F, + 0xE020,0xE021,0xE022,0xE023,0xE024,0xE025,0xE026,0xE027, + 0xE028,0xE029,0xE02A,0xE02B,0xE02C,0xE02D,0xE02E,0xE02F, + 0xE030,0xE031,0xE032,0xE033,0xE034,0xE035,0xE036,0xE037, + 0xE038,0xE039,0xE03A,0xE03B,0xE03C,0xE03D,0xE03E,0xE03F, + 0xE040,0xE041,0xE042,0xE043,0xE044,0xE045,0xE046,0xE047, + 0xE048,0xE049,0xE04A,0xE04B,0xE04C,0xE04D,0xE04E,0xE04F, + 0xE050,0xE051,0xE052,0xE053,0xE054,0xE055,0xE056,0xE057, + 0xE058,0xE059,0xE05A,0xE05B,0xE05C,0xE05D, + }, + {0x7372,0x7373,0x7374,0x7375,0x7376,0x7377,0x7378,0x7379, + 0x737A,0x737B,0x737C,0x737D,0x737F,0x7380,0x7381,0x7382, + 0x7383,0x7385,0x7386,0x7388,0x738A,0x738C,0x738D,0x738F, + 0x7390,0x7392,0x7393,0x7394,0x7395,0x7397,0x7398,0x7399, + 0x739A,0x739C,0x739D,0x739E,0x73A0,0x73A1,0x73A3,0x73A4, + 0x73A5,0x73A6,0x73A7,0x73A8,0x73AA,0x73AC,0x73AD,0x73B1, + 0x73B4,0x73B5,0x73B6,0x73B8,0x73B9,0x73BC,0x73BD,0x73BE, + 0x73BF,0x73C1,0x73C3,0x73C4,0x73C5,0x73C6,0x73C7,0x73CB, + 0x73CC,0x73CE,0x73D2,0x73D3,0x73D4,0x73D5,0x73D6,0x73D7, + 0x73D8,0x73DA,0x73DB,0x73DC,0x73DD,0x73DF,0x73E1,0x73E2, + 0x73E3,0x73E4,0x73E6,0x73E8,0x73EA,0x73EB,0x73EC,0x73EE, + 0x73EF,0x73F0,0x73F1,0x73F3,0x73F4,0x73F5,0x73F6,0x73F7, + 0xE05E,0xE05F,0xE060,0xE061,0xE062,0xE063,0xE064,0xE065, + 0xE066,0xE067,0xE068,0xE069,0xE06A,0xE06B,0xE06C,0xE06D, + 0xE06E,0xE06F,0xE070,0xE071,0xE072,0xE073,0xE074,0xE075, + 0xE076,0xE077,0xE078,0xE079,0xE07A,0xE07B,0xE07C,0xE07D, + 0xE07E,0xE07F,0xE080,0xE081,0xE082,0xE083,0xE084,0xE085, + 0xE086,0xE087,0xE088,0xE089,0xE08A,0xE08B,0xE08C,0xE08D, + 0xE08E,0xE08F,0xE090,0xE091,0xE092,0xE093,0xE094,0xE095, + 0xE096,0xE097,0xE098,0xE099,0xE09A,0xE09B,0xE09C,0xE09D, + 0xE09E,0xE09F,0xE0A0,0xE0A1,0xE0A2,0xE0A3,0xE0A4,0xE0A5, + 0xE0A6,0xE0A7,0xE0A8,0xE0A9,0xE0AA,0xE0AB,0xE0AC,0xE0AD, + 0xE0AE,0xE0AF,0xE0B0,0xE0B1,0xE0B2,0xE0B3,0xE0B4,0xE0B5, + 0xE0B6,0xE0B7,0xE0B8,0xE0B9,0xE0BA,0xE0BB, + }, + {0x73F8,0x73F9,0x73FA,0x73FB,0x73FC,0x73FD,0x73FE,0x73FF, + 0x7400,0x7401,0x7402,0x7404,0x7407,0x7408,0x740B,0x740C, + 0x740D,0x740E,0x7411,0x7412,0x7413,0x7414,0x7415,0x7416, + 0x7417,0x7418,0x7419,0x741C,0x741D,0x741E,0x741F,0x7420, + 0x7421,0x7423,0x7424,0x7427,0x7429,0x742B,0x742D,0x742F, + 0x7431,0x7432,0x7437,0x7438,0x7439,0x743A,0x743B,0x743D, + 0x743E,0x743F,0x7440,0x7442,0x7443,0x7444,0x7445,0x7446, + 0x7447,0x7448,0x7449,0x744A,0x744B,0x744C,0x744D,0x744E, + 0x744F,0x7450,0x7451,0x7452,0x7453,0x7454,0x7456,0x7458, + 0x745D,0x7460,0x7461,0x7462,0x7463,0x7464,0x7465,0x7466, + 0x7467,0x7468,0x7469,0x746A,0x746B,0x746C,0x746E,0x746F, + 0x7471,0x7472,0x7473,0x7474,0x7475,0x7478,0x7479,0x747A, + 0xE0BC,0xE0BD,0xE0BE,0xE0BF,0xE0C0,0xE0C1,0xE0C2,0xE0C3, + 0xE0C4,0xE0C5,0xE0C6,0xE0C7,0xE0C8,0xE0C9,0xE0CA,0xE0CB, + 0xE0CC,0xE0CD,0xE0CE,0xE0CF,0xE0D0,0xE0D1,0xE0D2,0xE0D3, + 0xE0D4,0xE0D5,0xE0D6,0xE0D7,0xE0D8,0xE0D9,0xE0DA,0xE0DB, + 0xE0DC,0xE0DD,0xE0DE,0xE0DF,0xE0E0,0xE0E1,0xE0E2,0xE0E3, + 0xE0E4,0xE0E5,0xE0E6,0xE0E7,0xE0E8,0xE0E9,0xE0EA,0xE0EB, + 0xE0EC,0xE0ED,0xE0EE,0xE0EF,0xE0F0,0xE0F1,0xE0F2,0xE0F3, + 0xE0F4,0xE0F5,0xE0F6,0xE0F7,0xE0F8,0xE0F9,0xE0FA,0xE0FB, + 0xE0FC,0xE0FD,0xE0FE,0xE0FF,0xE100,0xE101,0xE102,0xE103, + 0xE104,0xE105,0xE106,0xE107,0xE108,0xE109,0xE10A,0xE10B, + 0xE10C,0xE10D,0xE10E,0xE10F,0xE110,0xE111,0xE112,0xE113, + 0xE114,0xE115,0xE116,0xE117,0xE118,0xE119, + }, + {0x747B,0x747C,0x747D,0x747F,0x7482,0x7484,0x7485,0x7486, + 0x7488,0x7489,0x748A,0x748C,0x748D,0x748F,0x7491,0x7492, + 0x7493,0x7494,0x7495,0x7496,0x7497,0x7498,0x7499,0x749A, + 0x749B,0x749D,0x749F,0x74A0,0x74A1,0x74A2,0x74A3,0x74A4, + 0x74A5,0x74A6,0x74AA,0x74AB,0x74AC,0x74AD,0x74AE,0x74AF, + 0x74B0,0x74B1,0x74B2,0x74B3,0x74B4,0x74B5,0x74B6,0x74B7, + 0x74B8,0x74B9,0x74BB,0x74BC,0x74BD,0x74BE,0x74BF,0x74C0, + 0x74C1,0x74C2,0x74C3,0x74C4,0x74C5,0x74C6,0x74C7,0x74C8, + 0x74C9,0x74CA,0x74CB,0x74CC,0x74CD,0x74CE,0x74CF,0x74D0, + 0x74D1,0x74D3,0x74D4,0x74D5,0x74D6,0x74D7,0x74D8,0x74D9, + 0x74DA,0x74DB,0x74DD,0x74DF,0x74E1,0x74E5,0x74E7,0x74E8, + 0x74E9,0x74EA,0x74EB,0x74EC,0x74ED,0x74F0,0x74F1,0x74F2, + 0xE11A,0xE11B,0xE11C,0xE11D,0xE11E,0xE11F,0xE120,0xE121, + 0xE122,0xE123,0xE124,0xE125,0xE126,0xE127,0xE128,0xE129, + 0xE12A,0xE12B,0xE12C,0xE12D,0xE12E,0xE12F,0xE130,0xE131, + 0xE132,0xE133,0xE134,0xE135,0xE136,0xE137,0xE138,0xE139, + 0xE13A,0xE13B,0xE13C,0xE13D,0xE13E,0xE13F,0xE140,0xE141, + 0xE142,0xE143,0xE144,0xE145,0xE146,0xE147,0xE148,0xE149, + 0xE14A,0xE14B,0xE14C,0xE14D,0xE14E,0xE14F,0xE150,0xE151, + 0xE152,0xE153,0xE154,0xE155,0xE156,0xE157,0xE158,0xE159, + 0xE15A,0xE15B,0xE15C,0xE15D,0xE15E,0xE15F,0xE160,0xE161, + 0xE162,0xE163,0xE164,0xE165,0xE166,0xE167,0xE168,0xE169, + 0xE16A,0xE16B,0xE16C,0xE16D,0xE16E,0xE16F,0xE170,0xE171, + 0xE172,0xE173,0xE174,0xE175,0xE176,0xE177, + }, + {0x74F3,0x74F5,0x74F8,0x74F9,0x74FA,0x74FB,0x74FC,0x74FD, + 0x74FE,0x7500,0x7501,0x7502,0x7503,0x7505,0x7506,0x7507, + 0x7508,0x7509,0x750A,0x750B,0x750C,0x750E,0x7510,0x7512, + 0x7514,0x7515,0x7516,0x7517,0x751B,0x751D,0x751E,0x7520, + 0x7521,0x7522,0x7523,0x7524,0x7526,0x7527,0x752A,0x752E, + 0x7534,0x7536,0x7539,0x753C,0x753D,0x753F,0x7541,0x7542, + 0x7543,0x7544,0x7546,0x7547,0x7549,0x754A,0x754D,0x7550, + 0x7551,0x7552,0x7553,0x7555,0x7556,0x7557,0x7558,0x755D, + 0x755E,0x755F,0x7560,0x7561,0x7562,0x7563,0x7564,0x7567, + 0x7568,0x7569,0x756B,0x756C,0x756D,0x756E,0x756F,0x7570, + 0x7571,0x7573,0x7575,0x7576,0x7577,0x757A,0x757B,0x757C, + 0x757D,0x757E,0x7580,0x7581,0x7582,0x7584,0x7585,0x7587, + 0xE178,0xE179,0xE17A,0xE17B,0xE17C,0xE17D,0xE17E,0xE17F, + 0xE180,0xE181,0xE182,0xE183,0xE184,0xE185,0xE186,0xE187, + 0xE188,0xE189,0xE18A,0xE18B,0xE18C,0xE18D,0xE18E,0xE18F, + 0xE190,0xE191,0xE192,0xE193,0xE194,0xE195,0xE196,0xE197, + 0xE198,0xE199,0xE19A,0xE19B,0xE19C,0xE19D,0xE19E,0xE19F, + 0xE1A0,0xE1A1,0xE1A2,0xE1A3,0xE1A4,0xE1A5,0xE1A6,0xE1A7, + 0xE1A8,0xE1A9,0xE1AA,0xE1AB,0xE1AC,0xE1AD,0xE1AE,0xE1AF, + 0xE1B0,0xE1B1,0xE1B2,0xE1B3,0xE1B4,0xE1B5,0xE1B6,0xE1B7, + 0xE1B8,0xE1B9,0xE1BA,0xE1BB,0xE1BC,0xE1BD,0xE1BE,0xE1BF, + 0xE1C0,0xE1C1,0xE1C2,0xE1C3,0xE1C4,0xE1C5,0xE1C6,0xE1C7, + 0xE1C8,0xE1C9,0xE1CA,0xE1CB,0xE1CC,0xE1CD,0xE1CE,0xE1CF, + 0xE1D0,0xE1D1,0xE1D2,0xE1D3,0xE1D4,0xE1D5, + }, + {0x7588,0x7589,0x758A,0x758C,0x758D,0x758E,0x7590,0x7593, + 0x7595,0x7598,0x759B,0x759C,0x759E,0x75A2,0x75A6,0x75A7, + 0x75A8,0x75A9,0x75AA,0x75AD,0x75B6,0x75B7,0x75BA,0x75BB, + 0x75BF,0x75C0,0x75C1,0x75C6,0x75CB,0x75CC,0x75CE,0x75CF, + 0x75D0,0x75D1,0x75D3,0x75D7,0x75D9,0x75DA,0x75DC,0x75DD, + 0x75DF,0x75E0,0x75E1,0x75E5,0x75E9,0x75EC,0x75ED,0x75EE, + 0x75EF,0x75F2,0x75F3,0x75F5,0x75F6,0x75F7,0x75F8,0x75FA, + 0x75FB,0x75FD,0x75FE,0x7602,0x7604,0x7606,0x7607,0x7608, + 0x7609,0x760B,0x760D,0x760E,0x760F,0x7611,0x7612,0x7613, + 0x7614,0x7616,0x761A,0x761C,0x761D,0x761E,0x7621,0x7623, + 0x7627,0x7628,0x762C,0x762E,0x762F,0x7631,0x7632,0x7636, + 0x7637,0x7639,0x763A,0x763B,0x763D,0x7641,0x7642,0x7644, + 0xE1D6,0xE1D7,0xE1D8,0xE1D9,0xE1DA,0xE1DB,0xE1DC,0xE1DD, + 0xE1DE,0xE1DF,0xE1E0,0xE1E1,0xE1E2,0xE1E3,0xE1E4,0xE1E5, + 0xE1E6,0xE1E7,0xE1E8,0xE1E9,0xE1EA,0xE1EB,0xE1EC,0xE1ED, + 0xE1EE,0xE1EF,0xE1F0,0xE1F1,0xE1F2,0xE1F3,0xE1F4,0xE1F5, + 0xE1F6,0xE1F7,0xE1F8,0xE1F9,0xE1FA,0xE1FB,0xE1FC,0xE1FD, + 0xE1FE,0xE1FF,0xE200,0xE201,0xE202,0xE203,0xE204,0xE205, + 0xE206,0xE207,0xE208,0xE209,0xE20A,0xE20B,0xE20C,0xE20D, + 0xE20E,0xE20F,0xE210,0xE211,0xE212,0xE213,0xE214,0xE215, + 0xE216,0xE217,0xE218,0xE219,0xE21A,0xE21B,0xE21C,0xE21D, + 0xE21E,0xE21F,0xE220,0xE221,0xE222,0xE223,0xE224,0xE225, + 0xE226,0xE227,0xE228,0xE229,0xE22A,0xE22B,0xE22C,0xE22D, + 0xE22E,0xE22F,0xE230,0xE231,0xE232,0xE233, + }, + {0x7645,0x7646,0x7647,0x7648,0x7649,0x764A,0x764B,0x764E, + 0x764F,0x7650,0x7651,0x7652,0x7653,0x7655,0x7657,0x7658, + 0x7659,0x765A,0x765B,0x765D,0x765F,0x7660,0x7661,0x7662, + 0x7664,0x7665,0x7666,0x7667,0x7668,0x7669,0x766A,0x766C, + 0x766D,0x766E,0x7670,0x7671,0x7672,0x7673,0x7674,0x7675, + 0x7676,0x7677,0x7679,0x767A,0x767C,0x767F,0x7680,0x7681, + 0x7683,0x7685,0x7689,0x768A,0x768C,0x768D,0x768F,0x7690, + 0x7692,0x7694,0x7695,0x7697,0x7698,0x769A,0x769B,0x769C, + 0x769D,0x769E,0x769F,0x76A0,0x76A1,0x76A2,0x76A3,0x76A5, + 0x76A6,0x76A7,0x76A8,0x76A9,0x76AA,0x76AB,0x76AC,0x76AD, + 0x76AF,0x76B0,0x76B3,0x76B5,0x76B6,0x76B7,0x76B8,0x76B9, + 0x76BA,0x76BB,0x76BC,0x76BD,0x76BE,0x76C0,0x76C1,0x76C3, + 0x554A,0x963F,0x57C3,0x6328,0x54CE,0x5509,0x54C0,0x7691, + 0x764C,0x853C,0x77EE,0x827E,0x788D,0x7231,0x9698,0x978D, + 0x6C28,0x5B89,0x4FFA,0x6309,0x6697,0x5CB8,0x80FA,0x6848, + 0x80AE,0x6602,0x76CE,0x51F9,0x6556,0x71AC,0x7FF1,0x8884, + 0x50B2,0x5965,0x61CA,0x6FB3,0x82AD,0x634C,0x6252,0x53ED, + 0x5427,0x7B06,0x516B,0x75A4,0x5DF4,0x62D4,0x8DCB,0x9776, + 0x628A,0x8019,0x575D,0x9738,0x7F62,0x7238,0x767D,0x67CF, + 0x767E,0x6446,0x4F70,0x8D25,0x62DC,0x7A17,0x6591,0x73ED, + 0x642C,0x6273,0x822C,0x9881,0x677F,0x7248,0x626E,0x62CC, + 0x4F34,0x74E3,0x534A,0x529E,0x7ECA,0x90A6,0x5E2E,0x6886, + 0x699C,0x8180,0x7ED1,0x68D2,0x78C5,0x868C,0x9551,0x508D, + 0x8C24,0x82DE,0x80DE,0x5305,0x8912,0x5265, + }, + {0x76C4,0x76C7,0x76C9,0x76CB,0x76CC,0x76D3,0x76D5,0x76D9, + 0x76DA,0x76DC,0x76DD,0x76DE,0x76E0,0x76E1,0x76E2,0x76E3, + 0x76E4,0x76E6,0x76E7,0x76E8,0x76E9,0x76EA,0x76EB,0x76EC, + 0x76ED,0x76F0,0x76F3,0x76F5,0x76F6,0x76F7,0x76FA,0x76FB, + 0x76FD,0x76FF,0x7700,0x7702,0x7703,0x7705,0x7706,0x770A, + 0x770C,0x770E,0x770F,0x7710,0x7711,0x7712,0x7713,0x7714, + 0x7715,0x7716,0x7717,0x7718,0x771B,0x771C,0x771D,0x771E, + 0x7721,0x7723,0x7724,0x7725,0x7727,0x772A,0x772B,0x772C, + 0x772E,0x7730,0x7731,0x7732,0x7733,0x7734,0x7739,0x773B, + 0x773D,0x773E,0x773F,0x7742,0x7744,0x7745,0x7746,0x7748, + 0x7749,0x774A,0x774B,0x774C,0x774D,0x774E,0x774F,0x7752, + 0x7753,0x7754,0x7755,0x7756,0x7757,0x7758,0x7759,0x775C, + 0x8584,0x96F9,0x4FDD,0x5821,0x9971,0x5B9D,0x62B1,0x62A5, + 0x66B4,0x8C79,0x9C8D,0x7206,0x676F,0x7891,0x60B2,0x5351, + 0x5317,0x8F88,0x80CC,0x8D1D,0x94A1,0x500D,0x72C8,0x5907, + 0x60EB,0x7119,0x88AB,0x5954,0x82EF,0x672C,0x7B28,0x5D29, + 0x7EF7,0x752D,0x6CF5,0x8E66,0x8FF8,0x903C,0x9F3B,0x6BD4, + 0x9119,0x7B14,0x5F7C,0x78A7,0x84D6,0x853D,0x6BD5,0x6BD9, + 0x6BD6,0x5E01,0x5E87,0x75F9,0x95ED,0x655D,0x5F0A,0x5FC5, + 0x8F9F,0x58C1,0x81C2,0x907F,0x965B,0x97AD,0x8FB9,0x7F16, + 0x8D2C,0x6241,0x4FBF,0x53D8,0x535E,0x8FA8,0x8FA9,0x8FAB, + 0x904D,0x6807,0x5F6A,0x8198,0x8868,0x9CD6,0x618B,0x522B, + 0x762A,0x5F6C,0x658C,0x6FD2,0x6EE8,0x5BBE,0x6448,0x5175, + 0x51B0,0x67C4,0x4E19,0x79C9,0x997C,0x70B3, + }, + {0x775D,0x775E,0x775F,0x7760,0x7764,0x7767,0x7769,0x776A, + 0x776D,0x776E,0x776F,0x7770,0x7771,0x7772,0x7773,0x7774, + 0x7775,0x7776,0x7777,0x7778,0x777A,0x777B,0x777C,0x7781, + 0x7782,0x7783,0x7786,0x7787,0x7788,0x7789,0x778A,0x778B, + 0x778F,0x7790,0x7793,0x7794,0x7795,0x7796,0x7797,0x7798, + 0x7799,0x779A,0x779B,0x779C,0x779D,0x779E,0x77A1,0x77A3, + 0x77A4,0x77A6,0x77A8,0x77AB,0x77AD,0x77AE,0x77AF,0x77B1, + 0x77B2,0x77B4,0x77B6,0x77B7,0x77B8,0x77B9,0x77BA,0x77BC, + 0x77BE,0x77C0,0x77C1,0x77C2,0x77C3,0x77C4,0x77C5,0x77C6, + 0x77C7,0x77C8,0x77C9,0x77CA,0x77CB,0x77CC,0x77CE,0x77CF, + 0x77D0,0x77D1,0x77D2,0x77D3,0x77D4,0x77D5,0x77D6,0x77D8, + 0x77D9,0x77DA,0x77DD,0x77DE,0x77DF,0x77E0,0x77E1,0x77E4, + 0x75C5,0x5E76,0x73BB,0x83E0,0x64AD,0x62E8,0x94B5,0x6CE2, + 0x535A,0x52C3,0x640F,0x94C2,0x7B94,0x4F2F,0x5E1B,0x8236, + 0x8116,0x818A,0x6E24,0x6CCA,0x9A73,0x6355,0x535C,0x54FA, + 0x8865,0x57E0,0x4E0D,0x5E03,0x6B65,0x7C3F,0x90E8,0x6016, + 0x64E6,0x731C,0x88C1,0x6750,0x624D,0x8D22,0x776C,0x8E29, + 0x91C7,0x5F69,0x83DC,0x8521,0x9910,0x53C2,0x8695,0x6B8B, + 0x60ED,0x60E8,0x707F,0x82CD,0x8231,0x4ED3,0x6CA7,0x85CF, + 0x64CD,0x7CD9,0x69FD,0x66F9,0x8349,0x5395,0x7B56,0x4FA7, + 0x518C,0x6D4B,0x5C42,0x8E6D,0x63D2,0x53C9,0x832C,0x8336, + 0x67E5,0x78B4,0x643D,0x5BDF,0x5C94,0x5DEE,0x8BE7,0x62C6, + 0x67F4,0x8C7A,0x6400,0x63BA,0x8749,0x998B,0x8C17,0x7F20, + 0x94F2,0x4EA7,0x9610,0x98A4,0x660C,0x7316, + }, + {0x77E6,0x77E8,0x77EA,0x77EF,0x77F0,0x77F1,0x77F2,0x77F4, + 0x77F5,0x77F7,0x77F9,0x77FA,0x77FB,0x77FC,0x7803,0x7804, + 0x7805,0x7806,0x7807,0x7808,0x780A,0x780B,0x780E,0x780F, + 0x7810,0x7813,0x7815,0x7819,0x781B,0x781E,0x7820,0x7821, + 0x7822,0x7824,0x7828,0x782A,0x782B,0x782E,0x782F,0x7831, + 0x7832,0x7833,0x7835,0x7836,0x783D,0x783F,0x7841,0x7842, + 0x7843,0x7844,0x7846,0x7848,0x7849,0x784A,0x784B,0x784D, + 0x784F,0x7851,0x7853,0x7854,0x7858,0x7859,0x785A,0x785B, + 0x785C,0x785E,0x785F,0x7860,0x7861,0x7862,0x7863,0x7864, + 0x7865,0x7866,0x7867,0x7868,0x7869,0x786F,0x7870,0x7871, + 0x7872,0x7873,0x7874,0x7875,0x7876,0x7878,0x7879,0x787A, + 0x787B,0x787D,0x787E,0x787F,0x7880,0x7881,0x7882,0x7883, + 0x573A,0x5C1D,0x5E38,0x957F,0x507F,0x80A0,0x5382,0x655E, + 0x7545,0x5531,0x5021,0x8D85,0x6284,0x949E,0x671D,0x5632, + 0x6F6E,0x5DE2,0x5435,0x7092,0x8F66,0x626F,0x64A4,0x63A3, + 0x5F7B,0x6F88,0x90F4,0x81E3,0x8FB0,0x5C18,0x6668,0x5FF1, + 0x6C89,0x9648,0x8D81,0x886C,0x6491,0x79F0,0x57CE,0x6A59, + 0x6210,0x5448,0x4E58,0x7A0B,0x60E9,0x6F84,0x8BDA,0x627F, + 0x901E,0x9A8B,0x79E4,0x5403,0x75F4,0x6301,0x5319,0x6C60, + 0x8FDF,0x5F1B,0x9A70,0x803B,0x9F7F,0x4F88,0x5C3A,0x8D64, + 0x7FC5,0x65A5,0x70BD,0x5145,0x51B2,0x866B,0x5D07,0x5BA0, + 0x62BD,0x916C,0x7574,0x8E0C,0x7A20,0x6101,0x7B79,0x4EC7, + 0x7EF8,0x7785,0x4E11,0x81ED,0x521D,0x51FA,0x6A71,0x53A8, + 0x8E87,0x9504,0x96CF,0x6EC1,0x9664,0x695A, + }, + {0x7884,0x7885,0x7886,0x7888,0x788A,0x788B,0x788F,0x7890, + 0x7892,0x7894,0x7895,0x7896,0x7899,0x789D,0x789E,0x78A0, + 0x78A2,0x78A4,0x78A6,0x78A8,0x78A9,0x78AA,0x78AB,0x78AC, + 0x78AD,0x78AE,0x78AF,0x78B5,0x78B6,0x78B7,0x78B8,0x78BA, + 0x78BB,0x78BC,0x78BD,0x78BF,0x78C0,0x78C2,0x78C3,0x78C4, + 0x78C6,0x78C7,0x78C8,0x78CC,0x78CD,0x78CE,0x78CF,0x78D1, + 0x78D2,0x78D3,0x78D6,0x78D7,0x78D8,0x78DA,0x78DB,0x78DC, + 0x78DD,0x78DE,0x78DF,0x78E0,0x78E1,0x78E2,0x78E3,0x78E4, + 0x78E5,0x78E6,0x78E7,0x78E9,0x78EA,0x78EB,0x78ED,0x78EE, + 0x78EF,0x78F0,0x78F1,0x78F3,0x78F5,0x78F6,0x78F8,0x78F9, + 0x78FB,0x78FC,0x78FD,0x78FE,0x78FF,0x7900,0x7902,0x7903, + 0x7904,0x7906,0x7907,0x7908,0x7909,0x790A,0x790B,0x790C, + 0x7840,0x50A8,0x77D7,0x6410,0x89E6,0x5904,0x63E3,0x5DDD, + 0x7A7F,0x693D,0x4F20,0x8239,0x5598,0x4E32,0x75AE,0x7A97, + 0x5E62,0x5E8A,0x95EF,0x521B,0x5439,0x708A,0x6376,0x9524, + 0x5782,0x6625,0x693F,0x9187,0x5507,0x6DF3,0x7EAF,0x8822, + 0x6233,0x7EF0,0x75B5,0x8328,0x78C1,0x96CC,0x8F9E,0x6148, + 0x74F7,0x8BCD,0x6B64,0x523A,0x8D50,0x6B21,0x806A,0x8471, + 0x56F1,0x5306,0x4ECE,0x4E1B,0x51D1,0x7C97,0x918B,0x7C07, + 0x4FC3,0x8E7F,0x7BE1,0x7A9C,0x6467,0x5D14,0x50AC,0x8106, + 0x7601,0x7CB9,0x6DEC,0x7FE0,0x6751,0x5B58,0x5BF8,0x78CB, + 0x64AE,0x6413,0x63AA,0x632B,0x9519,0x642D,0x8FBE,0x7B54, + 0x7629,0x6253,0x5927,0x5446,0x6B79,0x50A3,0x6234,0x5E26, + 0x6B86,0x4EE3,0x8D37,0x888B,0x5F85,0x902E, + }, + {0x790D,0x790E,0x790F,0x7910,0x7911,0x7912,0x7914,0x7915, + 0x7916,0x7917,0x7918,0x7919,0x791A,0x791B,0x791C,0x791D, + 0x791F,0x7920,0x7921,0x7922,0x7923,0x7925,0x7926,0x7927, + 0x7928,0x7929,0x792A,0x792B,0x792C,0x792D,0x792E,0x792F, + 0x7930,0x7931,0x7932,0x7933,0x7935,0x7936,0x7937,0x7938, + 0x7939,0x793D,0x793F,0x7942,0x7943,0x7944,0x7945,0x7947, + 0x794A,0x794B,0x794C,0x794D,0x794E,0x794F,0x7950,0x7951, + 0x7952,0x7954,0x7955,0x7958,0x7959,0x7961,0x7963,0x7964, + 0x7966,0x7969,0x796A,0x796B,0x796C,0x796E,0x7970,0x7971, + 0x7972,0x7973,0x7974,0x7975,0x7976,0x7979,0x797B,0x797C, + 0x797D,0x797E,0x797F,0x7982,0x7983,0x7986,0x7987,0x7988, + 0x7989,0x798B,0x798C,0x798D,0x798E,0x7990,0x7991,0x7992, + 0x6020,0x803D,0x62C5,0x4E39,0x5355,0x90F8,0x63B8,0x80C6, + 0x65E6,0x6C2E,0x4F46,0x60EE,0x6DE1,0x8BDE,0x5F39,0x86CB, + 0x5F53,0x6321,0x515A,0x8361,0x6863,0x5200,0x6363,0x8E48, + 0x5012,0x5C9B,0x7977,0x5BFC,0x5230,0x7A3B,0x60BC,0x9053, + 0x76D7,0x5FB7,0x5F97,0x7684,0x8E6C,0x706F,0x767B,0x7B49, + 0x77AA,0x51F3,0x9093,0x5824,0x4F4E,0x6EF4,0x8FEA,0x654C, + 0x7B1B,0x72C4,0x6DA4,0x7FDF,0x5AE1,0x62B5,0x5E95,0x5730, + 0x8482,0x7B2C,0x5E1D,0x5F1F,0x9012,0x7F14,0x98A0,0x6382, + 0x6EC7,0x7898,0x70B9,0x5178,0x975B,0x57AB,0x7535,0x4F43, + 0x7538,0x5E97,0x60E6,0x5960,0x6DC0,0x6BBF,0x7889,0x53FC, + 0x96D5,0x51CB,0x5201,0x6389,0x540A,0x9493,0x8C03,0x8DCC, + 0x7239,0x789F,0x8776,0x8FED,0x8C0D,0x53E0, + }, + {0x7993,0x7994,0x7995,0x7996,0x7997,0x7998,0x7999,0x799B, + 0x799C,0x799D,0x799E,0x799F,0x79A0,0x79A1,0x79A2,0x79A3, + 0x79A4,0x79A5,0x79A6,0x79A8,0x79A9,0x79AA,0x79AB,0x79AC, + 0x79AD,0x79AE,0x79AF,0x79B0,0x79B1,0x79B2,0x79B4,0x79B5, + 0x79B6,0x79B7,0x79B8,0x79BC,0x79BF,0x79C2,0x79C4,0x79C5, + 0x79C7,0x79C8,0x79CA,0x79CC,0x79CE,0x79CF,0x79D0,0x79D3, + 0x79D4,0x79D6,0x79D7,0x79D9,0x79DA,0x79DB,0x79DC,0x79DD, + 0x79DE,0x79E0,0x79E1,0x79E2,0x79E5,0x79E8,0x79EA,0x79EC, + 0x79EE,0x79F1,0x79F2,0x79F3,0x79F4,0x79F5,0x79F6,0x79F7, + 0x79F9,0x79FA,0x79FC,0x79FE,0x79FF,0x7A01,0x7A04,0x7A05, + 0x7A07,0x7A08,0x7A09,0x7A0A,0x7A0C,0x7A0F,0x7A10,0x7A11, + 0x7A12,0x7A13,0x7A15,0x7A16,0x7A18,0x7A19,0x7A1B,0x7A1C, + 0x4E01,0x76EF,0x53EE,0x9489,0x9876,0x9F0E,0x952D,0x5B9A, + 0x8BA2,0x4E22,0x4E1C,0x51AC,0x8463,0x61C2,0x52A8,0x680B, + 0x4F97,0x606B,0x51BB,0x6D1E,0x515C,0x6296,0x6597,0x9661, + 0x8C46,0x9017,0x75D8,0x90FD,0x7763,0x6BD2,0x728A,0x72EC, + 0x8BFB,0x5835,0x7779,0x8D4C,0x675C,0x9540,0x809A,0x5EA6, + 0x6E21,0x5992,0x7AEF,0x77ED,0x953B,0x6BB5,0x65AD,0x7F0E, + 0x5806,0x5151,0x961F,0x5BF9,0x58A9,0x5428,0x8E72,0x6566, + 0x987F,0x56E4,0x949D,0x76FE,0x9041,0x6387,0x54C6,0x591A, + 0x593A,0x579B,0x8EB2,0x6735,0x8DFA,0x8235,0x5241,0x60F0, + 0x5815,0x86FE,0x5CE8,0x9E45,0x4FC4,0x989D,0x8BB9,0x5A25, + 0x6076,0x5384,0x627C,0x904F,0x9102,0x997F,0x6069,0x800C, + 0x513F,0x8033,0x5C14,0x9975,0x6D31,0x4E8C, + }, + {0x7A1D,0x7A1F,0x7A21,0x7A22,0x7A24,0x7A25,0x7A26,0x7A27, + 0x7A28,0x7A29,0x7A2A,0x7A2B,0x7A2C,0x7A2D,0x7A2E,0x7A2F, + 0x7A30,0x7A31,0x7A32,0x7A34,0x7A35,0x7A36,0x7A38,0x7A3A, + 0x7A3E,0x7A40,0x7A41,0x7A42,0x7A43,0x7A44,0x7A45,0x7A47, + 0x7A48,0x7A49,0x7A4A,0x7A4B,0x7A4C,0x7A4D,0x7A4E,0x7A4F, + 0x7A50,0x7A52,0x7A53,0x7A54,0x7A55,0x7A56,0x7A58,0x7A59, + 0x7A5A,0x7A5B,0x7A5C,0x7A5D,0x7A5E,0x7A5F,0x7A60,0x7A61, + 0x7A62,0x7A63,0x7A64,0x7A65,0x7A66,0x7A67,0x7A68,0x7A69, + 0x7A6A,0x7A6B,0x7A6C,0x7A6D,0x7A6E,0x7A6F,0x7A71,0x7A72, + 0x7A73,0x7A75,0x7A7B,0x7A7C,0x7A7D,0x7A7E,0x7A82,0x7A85, + 0x7A87,0x7A89,0x7A8A,0x7A8B,0x7A8C,0x7A8E,0x7A8F,0x7A90, + 0x7A93,0x7A94,0x7A99,0x7A9A,0x7A9B,0x7A9E,0x7AA1,0x7AA2, + 0x8D30,0x53D1,0x7F5A,0x7B4F,0x4F10,0x4E4F,0x9600,0x6CD5, + 0x73D0,0x85E9,0x5E06,0x756A,0x7FFB,0x6A0A,0x77FE,0x9492, + 0x7E41,0x51E1,0x70E6,0x53CD,0x8FD4,0x8303,0x8D29,0x72AF, + 0x996D,0x6CDB,0x574A,0x82B3,0x65B9,0x80AA,0x623F,0x9632, + 0x59A8,0x4EFF,0x8BBF,0x7EBA,0x653E,0x83F2,0x975E,0x5561, + 0x98DE,0x80A5,0x532A,0x8BFD,0x5420,0x80BA,0x5E9F,0x6CB8, + 0x8D39,0x82AC,0x915A,0x5429,0x6C1B,0x5206,0x7EB7,0x575F, + 0x711A,0x6C7E,0x7C89,0x594B,0x4EFD,0x5FFF,0x6124,0x7CAA, + 0x4E30,0x5C01,0x67AB,0x8702,0x5CF0,0x950B,0x98CE,0x75AF, + 0x70FD,0x9022,0x51AF,0x7F1D,0x8BBD,0x5949,0x51E4,0x4F5B, + 0x5426,0x592B,0x6577,0x80A4,0x5B75,0x6276,0x62C2,0x8F90, + 0x5E45,0x6C1F,0x7B26,0x4F0F,0x4FD8,0x670D, + }, + {0x7AA3,0x7AA4,0x7AA7,0x7AA9,0x7AAA,0x7AAB,0x7AAE,0x7AAF, + 0x7AB0,0x7AB1,0x7AB2,0x7AB4,0x7AB5,0x7AB6,0x7AB7,0x7AB8, + 0x7AB9,0x7ABA,0x7ABB,0x7ABC,0x7ABD,0x7ABE,0x7AC0,0x7AC1, + 0x7AC2,0x7AC3,0x7AC4,0x7AC5,0x7AC6,0x7AC7,0x7AC8,0x7AC9, + 0x7ACA,0x7ACC,0x7ACD,0x7ACE,0x7ACF,0x7AD0,0x7AD1,0x7AD2, + 0x7AD3,0x7AD4,0x7AD5,0x7AD7,0x7AD8,0x7ADA,0x7ADB,0x7ADC, + 0x7ADD,0x7AE1,0x7AE2,0x7AE4,0x7AE7,0x7AE8,0x7AE9,0x7AEA, + 0x7AEB,0x7AEC,0x7AEE,0x7AF0,0x7AF1,0x7AF2,0x7AF3,0x7AF4, + 0x7AF5,0x7AF6,0x7AF7,0x7AF8,0x7AFB,0x7AFC,0x7AFE,0x7B00, + 0x7B01,0x7B02,0x7B05,0x7B07,0x7B09,0x7B0C,0x7B0D,0x7B0E, + 0x7B10,0x7B12,0x7B13,0x7B16,0x7B17,0x7B18,0x7B1A,0x7B1C, + 0x7B1D,0x7B1F,0x7B21,0x7B22,0x7B23,0x7B27,0x7B29,0x7B2D, + 0x6D6E,0x6DAA,0x798F,0x88B1,0x5F17,0x752B,0x629A,0x8F85, + 0x4FEF,0x91DC,0x65A7,0x812F,0x8151,0x5E9C,0x8150,0x8D74, + 0x526F,0x8986,0x8D4B,0x590D,0x5085,0x4ED8,0x961C,0x7236, + 0x8179,0x8D1F,0x5BCC,0x8BA3,0x9644,0x5987,0x7F1A,0x5490, + 0x5676,0x560E,0x8BE5,0x6539,0x6982,0x9499,0x76D6,0x6E89, + 0x5E72,0x7518,0x6746,0x67D1,0x7AFF,0x809D,0x8D76,0x611F, + 0x79C6,0x6562,0x8D63,0x5188,0x521A,0x94A2,0x7F38,0x809B, + 0x7EB2,0x5C97,0x6E2F,0x6760,0x7BD9,0x768B,0x9AD8,0x818F, + 0x7F94,0x7CD5,0x641E,0x9550,0x7A3F,0x544A,0x54E5,0x6B4C, + 0x6401,0x6208,0x9E3D,0x80F3,0x7599,0x5272,0x9769,0x845B, + 0x683C,0x86E4,0x9601,0x9694,0x94EC,0x4E2A,0x5404,0x7ED9, + 0x6839,0x8DDF,0x8015,0x66F4,0x5E9A,0x7FB9, + }, + {0x7B2F,0x7B30,0x7B32,0x7B34,0x7B35,0x7B36,0x7B37,0x7B39, + 0x7B3B,0x7B3D,0x7B3F,0x7B40,0x7B41,0x7B42,0x7B43,0x7B44, + 0x7B46,0x7B48,0x7B4A,0x7B4D,0x7B4E,0x7B53,0x7B55,0x7B57, + 0x7B59,0x7B5C,0x7B5E,0x7B5F,0x7B61,0x7B63,0x7B64,0x7B65, + 0x7B66,0x7B67,0x7B68,0x7B69,0x7B6A,0x7B6B,0x7B6C,0x7B6D, + 0x7B6F,0x7B70,0x7B73,0x7B74,0x7B76,0x7B78,0x7B7A,0x7B7C, + 0x7B7D,0x7B7F,0x7B81,0x7B82,0x7B83,0x7B84,0x7B86,0x7B87, + 0x7B88,0x7B89,0x7B8A,0x7B8B,0x7B8C,0x7B8E,0x7B8F,0x7B91, + 0x7B92,0x7B93,0x7B96,0x7B98,0x7B99,0x7B9A,0x7B9B,0x7B9E, + 0x7B9F,0x7BA0,0x7BA3,0x7BA4,0x7BA5,0x7BAE,0x7BAF,0x7BB0, + 0x7BB2,0x7BB3,0x7BB5,0x7BB6,0x7BB7,0x7BB9,0x7BBA,0x7BBB, + 0x7BBC,0x7BBD,0x7BBE,0x7BBF,0x7BC0,0x7BC2,0x7BC3,0x7BC4, + 0x57C2,0x803F,0x6897,0x5DE5,0x653B,0x529F,0x606D,0x9F9A, + 0x4F9B,0x8EAC,0x516C,0x5BAB,0x5F13,0x5DE9,0x6C5E,0x62F1, + 0x8D21,0x5171,0x94A9,0x52FE,0x6C9F,0x82DF,0x72D7,0x57A2, + 0x6784,0x8D2D,0x591F,0x8F9C,0x83C7,0x5495,0x7B8D,0x4F30, + 0x6CBD,0x5B64,0x59D1,0x9F13,0x53E4,0x86CA,0x9AA8,0x8C37, + 0x80A1,0x6545,0x987E,0x56FA,0x96C7,0x522E,0x74DC,0x5250, + 0x5BE1,0x6302,0x8902,0x4E56,0x62D0,0x602A,0x68FA,0x5173, + 0x5B98,0x51A0,0x89C2,0x7BA1,0x9986,0x7F50,0x60EF,0x704C, + 0x8D2F,0x5149,0x5E7F,0x901B,0x7470,0x89C4,0x572D,0x7845, + 0x5F52,0x9F9F,0x95FA,0x8F68,0x9B3C,0x8BE1,0x7678,0x6842, + 0x67DC,0x8DEA,0x8D35,0x523D,0x8F8A,0x6EDA,0x68CD,0x9505, + 0x90ED,0x56FD,0x679C,0x88F9,0x8FC7,0x54C8, + }, + {0x7BC5,0x7BC8,0x7BC9,0x7BCA,0x7BCB,0x7BCD,0x7BCE,0x7BCF, + 0x7BD0,0x7BD2,0x7BD4,0x7BD5,0x7BD6,0x7BD7,0x7BD8,0x7BDB, + 0x7BDC,0x7BDE,0x7BDF,0x7BE0,0x7BE2,0x7BE3,0x7BE4,0x7BE7, + 0x7BE8,0x7BE9,0x7BEB,0x7BEC,0x7BED,0x7BEF,0x7BF0,0x7BF2, + 0x7BF3,0x7BF4,0x7BF5,0x7BF6,0x7BF8,0x7BF9,0x7BFA,0x7BFB, + 0x7BFD,0x7BFF,0x7C00,0x7C01,0x7C02,0x7C03,0x7C04,0x7C05, + 0x7C06,0x7C08,0x7C09,0x7C0A,0x7C0D,0x7C0E,0x7C10,0x7C11, + 0x7C12,0x7C13,0x7C14,0x7C15,0x7C17,0x7C18,0x7C19,0x7C1A, + 0x7C1B,0x7C1C,0x7C1D,0x7C1E,0x7C20,0x7C21,0x7C22,0x7C23, + 0x7C24,0x7C25,0x7C28,0x7C29,0x7C2B,0x7C2C,0x7C2D,0x7C2E, + 0x7C2F,0x7C30,0x7C31,0x7C32,0x7C33,0x7C34,0x7C35,0x7C36, + 0x7C37,0x7C39,0x7C3A,0x7C3B,0x7C3C,0x7C3D,0x7C3E,0x7C42, + 0x9AB8,0x5B69,0x6D77,0x6C26,0x4EA5,0x5BB3,0x9A87,0x9163, + 0x61A8,0x90AF,0x97E9,0x542B,0x6DB5,0x5BD2,0x51FD,0x558A, + 0x7F55,0x7FF0,0x64BC,0x634D,0x65F1,0x61BE,0x608D,0x710A, + 0x6C57,0x6C49,0x592F,0x676D,0x822A,0x58D5,0x568E,0x8C6A, + 0x6BEB,0x90DD,0x597D,0x8017,0x53F7,0x6D69,0x5475,0x559D, + 0x8377,0x83CF,0x6838,0x79BE,0x548C,0x4F55,0x5408,0x76D2, + 0x8C89,0x9602,0x6CB3,0x6DB8,0x8D6B,0x8910,0x9E64,0x8D3A, + 0x563F,0x9ED1,0x75D5,0x5F88,0x72E0,0x6068,0x54FC,0x4EA8, + 0x6A2A,0x8861,0x6052,0x8F70,0x54C4,0x70D8,0x8679,0x9E3F, + 0x6D2A,0x5B8F,0x5F18,0x7EA2,0x5589,0x4FAF,0x7334,0x543C, + 0x539A,0x5019,0x540E,0x547C,0x4E4E,0x5FFD,0x745A,0x58F6, + 0x846B,0x80E1,0x8774,0x72D0,0x7CCA,0x6E56, + }, + {0x7C43,0x7C44,0x7C45,0x7C46,0x7C47,0x7C48,0x7C49,0x7C4A, + 0x7C4B,0x7C4C,0x7C4E,0x7C4F,0x7C50,0x7C51,0x7C52,0x7C53, + 0x7C54,0x7C55,0x7C56,0x7C57,0x7C58,0x7C59,0x7C5A,0x7C5B, + 0x7C5C,0x7C5D,0x7C5E,0x7C5F,0x7C60,0x7C61,0x7C62,0x7C63, + 0x7C64,0x7C65,0x7C66,0x7C67,0x7C68,0x7C69,0x7C6A,0x7C6B, + 0x7C6C,0x7C6D,0x7C6E,0x7C6F,0x7C70,0x7C71,0x7C72,0x7C75, + 0x7C76,0x7C77,0x7C78,0x7C79,0x7C7A,0x7C7E,0x7C7F,0x7C80, + 0x7C81,0x7C82,0x7C83,0x7C84,0x7C85,0x7C86,0x7C87,0x7C88, + 0x7C8A,0x7C8B,0x7C8C,0x7C8D,0x7C8E,0x7C8F,0x7C90,0x7C93, + 0x7C94,0x7C96,0x7C99,0x7C9A,0x7C9B,0x7CA0,0x7CA1,0x7CA3, + 0x7CA6,0x7CA7,0x7CA8,0x7CA9,0x7CAB,0x7CAC,0x7CAD,0x7CAF, + 0x7CB0,0x7CB4,0x7CB5,0x7CB6,0x7CB7,0x7CB8,0x7CBA,0x7CBB, + 0x5F27,0x864E,0x552C,0x62A4,0x4E92,0x6CAA,0x6237,0x82B1, + 0x54D7,0x534E,0x733E,0x6ED1,0x753B,0x5212,0x5316,0x8BDD, + 0x69D0,0x5F8A,0x6000,0x6DEE,0x574F,0x6B22,0x73AF,0x6853, + 0x8FD8,0x7F13,0x6362,0x60A3,0x5524,0x75EA,0x8C62,0x7115, + 0x6DA3,0x5BA6,0x5E7B,0x8352,0x614C,0x9EC4,0x78FA,0x8757, + 0x7C27,0x7687,0x51F0,0x60F6,0x714C,0x6643,0x5E4C,0x604D, + 0x8C0E,0x7070,0x6325,0x8F89,0x5FBD,0x6062,0x86D4,0x56DE, + 0x6BC1,0x6094,0x6167,0x5349,0x60E0,0x6666,0x8D3F,0x79FD, + 0x4F1A,0x70E9,0x6C47,0x8BB3,0x8BF2,0x7ED8,0x8364,0x660F, + 0x5A5A,0x9B42,0x6D51,0x6DF7,0x8C41,0x6D3B,0x4F19,0x706B, + 0x83B7,0x6216,0x60D1,0x970D,0x8D27,0x7978,0x51FB,0x573E, + 0x57FA,0x673A,0x7578,0x7A3D,0x79EF,0x7B95, + }, + {0x7CBF,0x7CC0,0x7CC2,0x7CC3,0x7CC4,0x7CC6,0x7CC9,0x7CCB, + 0x7CCE,0x7CCF,0x7CD0,0x7CD1,0x7CD2,0x7CD3,0x7CD4,0x7CD8, + 0x7CDA,0x7CDB,0x7CDD,0x7CDE,0x7CE1,0x7CE2,0x7CE3,0x7CE4, + 0x7CE5,0x7CE6,0x7CE7,0x7CE9,0x7CEA,0x7CEB,0x7CEC,0x7CED, + 0x7CEE,0x7CF0,0x7CF1,0x7CF2,0x7CF3,0x7CF4,0x7CF5,0x7CF6, + 0x7CF7,0x7CF9,0x7CFA,0x7CFC,0x7CFD,0x7CFE,0x7CFF,0x7D00, + 0x7D01,0x7D02,0x7D03,0x7D04,0x7D05,0x7D06,0x7D07,0x7D08, + 0x7D09,0x7D0B,0x7D0C,0x7D0D,0x7D0E,0x7D0F,0x7D10,0x7D11, + 0x7D12,0x7D13,0x7D14,0x7D15,0x7D16,0x7D17,0x7D18,0x7D19, + 0x7D1A,0x7D1B,0x7D1C,0x7D1D,0x7D1E,0x7D1F,0x7D21,0x7D23, + 0x7D24,0x7D25,0x7D26,0x7D28,0x7D29,0x7D2A,0x7D2C,0x7D2D, + 0x7D2E,0x7D30,0x7D31,0x7D32,0x7D33,0x7D34,0x7D35,0x7D36, + 0x808C,0x9965,0x8FF9,0x6FC0,0x8BA5,0x9E21,0x59EC,0x7EE9, + 0x7F09,0x5409,0x6781,0x68D8,0x8F91,0x7C4D,0x96C6,0x53CA, + 0x6025,0x75BE,0x6C72,0x5373,0x5AC9,0x7EA7,0x6324,0x51E0, + 0x810A,0x5DF1,0x84DF,0x6280,0x5180,0x5B63,0x4F0E,0x796D, + 0x5242,0x60B8,0x6D4E,0x5BC4,0x5BC2,0x8BA1,0x8BB0,0x65E2, + 0x5FCC,0x9645,0x5993,0x7EE7,0x7EAA,0x5609,0x67B7,0x5939, + 0x4F73,0x5BB6,0x52A0,0x835A,0x988A,0x8D3E,0x7532,0x94BE, + 0x5047,0x7A3C,0x4EF7,0x67B6,0x9A7E,0x5AC1,0x6B7C,0x76D1, + 0x575A,0x5C16,0x7B3A,0x95F4,0x714E,0x517C,0x80A9,0x8270, + 0x5978,0x7F04,0x8327,0x68C0,0x67EC,0x78B1,0x7877,0x62E3, + 0x6361,0x7B80,0x4FED,0x526A,0x51CF,0x8350,0x69DB,0x9274, + 0x8DF5,0x8D31,0x89C1,0x952E,0x7BAD,0x4EF6, + }, + {0x7D37,0x7D38,0x7D39,0x7D3A,0x7D3B,0x7D3C,0x7D3D,0x7D3E, + 0x7D3F,0x7D40,0x7D41,0x7D42,0x7D43,0x7D44,0x7D45,0x7D46, + 0x7D47,0x7D48,0x7D49,0x7D4A,0x7D4B,0x7D4C,0x7D4D,0x7D4E, + 0x7D4F,0x7D50,0x7D51,0x7D52,0x7D53,0x7D54,0x7D55,0x7D56, + 0x7D57,0x7D58,0x7D59,0x7D5A,0x7D5B,0x7D5C,0x7D5D,0x7D5E, + 0x7D5F,0x7D60,0x7D61,0x7D62,0x7D63,0x7D64,0x7D65,0x7D66, + 0x7D67,0x7D68,0x7D69,0x7D6A,0x7D6B,0x7D6C,0x7D6D,0x7D6F, + 0x7D70,0x7D71,0x7D72,0x7D73,0x7D74,0x7D75,0x7D76,0x7D78, + 0x7D79,0x7D7A,0x7D7B,0x7D7C,0x7D7D,0x7D7E,0x7D7F,0x7D80, + 0x7D81,0x7D82,0x7D83,0x7D84,0x7D85,0x7D86,0x7D87,0x7D88, + 0x7D89,0x7D8A,0x7D8B,0x7D8C,0x7D8D,0x7D8E,0x7D8F,0x7D90, + 0x7D91,0x7D92,0x7D93,0x7D94,0x7D95,0x7D96,0x7D97,0x7D98, + 0x5065,0x8230,0x5251,0x996F,0x6E10,0x6E85,0x6DA7,0x5EFA, + 0x50F5,0x59DC,0x5C06,0x6D46,0x6C5F,0x7586,0x848B,0x6868, + 0x5956,0x8BB2,0x5320,0x9171,0x964D,0x8549,0x6912,0x7901, + 0x7126,0x80F6,0x4EA4,0x90CA,0x6D47,0x9A84,0x5A07,0x56BC, + 0x6405,0x94F0,0x77EB,0x4FA5,0x811A,0x72E1,0x89D2,0x997A, + 0x7F34,0x7EDE,0x527F,0x6559,0x9175,0x8F7F,0x8F83,0x53EB, + 0x7A96,0x63ED,0x63A5,0x7686,0x79F8,0x8857,0x9636,0x622A, + 0x52AB,0x8282,0x6854,0x6770,0x6377,0x776B,0x7AED,0x6D01, + 0x7ED3,0x89E3,0x59D0,0x6212,0x85C9,0x82A5,0x754C,0x501F, + 0x4ECB,0x75A5,0x8BEB,0x5C4A,0x5DFE,0x7B4B,0x65A4,0x91D1, + 0x4ECA,0x6D25,0x895F,0x7D27,0x9526,0x4EC5,0x8C28,0x8FDB, + 0x9773,0x664B,0x7981,0x8FD1,0x70EC,0x6D78, + }, + {0x7D99,0x7D9A,0x7D9B,0x7D9C,0x7D9D,0x7D9E,0x7D9F,0x7DA0, + 0x7DA1,0x7DA2,0x7DA3,0x7DA4,0x7DA5,0x7DA7,0x7DA8,0x7DA9, + 0x7DAA,0x7DAB,0x7DAC,0x7DAD,0x7DAF,0x7DB0,0x7DB1,0x7DB2, + 0x7DB3,0x7DB4,0x7DB5,0x7DB6,0x7DB7,0x7DB8,0x7DB9,0x7DBA, + 0x7DBB,0x7DBC,0x7DBD,0x7DBE,0x7DBF,0x7DC0,0x7DC1,0x7DC2, + 0x7DC3,0x7DC4,0x7DC5,0x7DC6,0x7DC7,0x7DC8,0x7DC9,0x7DCA, + 0x7DCB,0x7DCC,0x7DCD,0x7DCE,0x7DCF,0x7DD0,0x7DD1,0x7DD2, + 0x7DD3,0x7DD4,0x7DD5,0x7DD6,0x7DD7,0x7DD8,0x7DD9,0x7DDA, + 0x7DDB,0x7DDC,0x7DDD,0x7DDE,0x7DDF,0x7DE0,0x7DE1,0x7DE2, + 0x7DE3,0x7DE4,0x7DE5,0x7DE6,0x7DE7,0x7DE8,0x7DE9,0x7DEA, + 0x7DEB,0x7DEC,0x7DED,0x7DEE,0x7DEF,0x7DF0,0x7DF1,0x7DF2, + 0x7DF3,0x7DF4,0x7DF5,0x7DF6,0x7DF7,0x7DF8,0x7DF9,0x7DFA, + 0x5C3D,0x52B2,0x8346,0x5162,0x830E,0x775B,0x6676,0x9CB8, + 0x4EAC,0x60CA,0x7CBE,0x7CB3,0x7ECF,0x4E95,0x8B66,0x666F, + 0x9888,0x9759,0x5883,0x656C,0x955C,0x5F84,0x75C9,0x9756, + 0x7ADF,0x7ADE,0x51C0,0x70AF,0x7A98,0x63EA,0x7A76,0x7EA0, + 0x7396,0x97ED,0x4E45,0x7078,0x4E5D,0x9152,0x53A9,0x6551, + 0x65E7,0x81FC,0x8205,0x548E,0x5C31,0x759A,0x97A0,0x62D8, + 0x72D9,0x75BD,0x5C45,0x9A79,0x83CA,0x5C40,0x5480,0x77E9, + 0x4E3E,0x6CAE,0x805A,0x62D2,0x636E,0x5DE8,0x5177,0x8DDD, + 0x8E1E,0x952F,0x4FF1,0x53E5,0x60E7,0x70AC,0x5267,0x6350, + 0x9E43,0x5A1F,0x5026,0x7737,0x5377,0x7EE2,0x6485,0x652B, + 0x6289,0x6398,0x5014,0x7235,0x89C9,0x51B3,0x8BC0,0x7EDD, + 0x5747,0x83CC,0x94A7,0x519B,0x541B,0x5CFB, + }, + {0x7DFB,0x7DFC,0x7DFD,0x7DFE,0x7DFF,0x7E00,0x7E01,0x7E02, + 0x7E03,0x7E04,0x7E05,0x7E06,0x7E07,0x7E08,0x7E09,0x7E0A, + 0x7E0B,0x7E0C,0x7E0D,0x7E0E,0x7E0F,0x7E10,0x7E11,0x7E12, + 0x7E13,0x7E14,0x7E15,0x7E16,0x7E17,0x7E18,0x7E19,0x7E1A, + 0x7E1B,0x7E1C,0x7E1D,0x7E1E,0x7E1F,0x7E20,0x7E21,0x7E22, + 0x7E23,0x7E24,0x7E25,0x7E26,0x7E27,0x7E28,0x7E29,0x7E2A, + 0x7E2B,0x7E2C,0x7E2D,0x7E2E,0x7E2F,0x7E30,0x7E31,0x7E32, + 0x7E33,0x7E34,0x7E35,0x7E36,0x7E37,0x7E38,0x7E39,0x7E3A, + 0x7E3C,0x7E3D,0x7E3E,0x7E3F,0x7E40,0x7E42,0x7E43,0x7E44, + 0x7E45,0x7E46,0x7E48,0x7E49,0x7E4A,0x7E4B,0x7E4C,0x7E4D, + 0x7E4E,0x7E4F,0x7E50,0x7E51,0x7E52,0x7E53,0x7E54,0x7E55, + 0x7E56,0x7E57,0x7E58,0x7E59,0x7E5A,0x7E5B,0x7E5C,0x7E5D, + 0x4FCA,0x7AE3,0x6D5A,0x90E1,0x9A8F,0x5580,0x5496,0x5361, + 0x54AF,0x5F00,0x63E9,0x6977,0x51EF,0x6168,0x520A,0x582A, + 0x52D8,0x574E,0x780D,0x770B,0x5EB7,0x6177,0x7CE0,0x625B, + 0x6297,0x4EA2,0x7095,0x8003,0x62F7,0x70E4,0x9760,0x5777, + 0x82DB,0x67EF,0x68F5,0x78D5,0x9897,0x79D1,0x58F3,0x54B3, + 0x53EF,0x6E34,0x514B,0x523B,0x5BA2,0x8BFE,0x80AF,0x5543, + 0x57A6,0x6073,0x5751,0x542D,0x7A7A,0x6050,0x5B54,0x63A7, + 0x62A0,0x53E3,0x6263,0x5BC7,0x67AF,0x54ED,0x7A9F,0x82E6, + 0x9177,0x5E93,0x88E4,0x5938,0x57AE,0x630E,0x8DE8,0x80EF, + 0x5757,0x7B77,0x4FA9,0x5FEB,0x5BBD,0x6B3E,0x5321,0x7B50, + 0x72C2,0x6846,0x77FF,0x7736,0x65F7,0x51B5,0x4E8F,0x76D4, + 0x5CBF,0x7AA5,0x8475,0x594E,0x9B41,0x5080, + }, + {0x7E5E,0x7E5F,0x7E60,0x7E61,0x7E62,0x7E63,0x7E64,0x7E65, + 0x7E66,0x7E67,0x7E68,0x7E69,0x7E6A,0x7E6B,0x7E6C,0x7E6D, + 0x7E6E,0x7E6F,0x7E70,0x7E71,0x7E72,0x7E73,0x7E74,0x7E75, + 0x7E76,0x7E77,0x7E78,0x7E79,0x7E7A,0x7E7B,0x7E7C,0x7E7D, + 0x7E7E,0x7E7F,0x7E80,0x7E81,0x7E83,0x7E84,0x7E85,0x7E86, + 0x7E87,0x7E88,0x7E89,0x7E8A,0x7E8B,0x7E8C,0x7E8D,0x7E8E, + 0x7E8F,0x7E90,0x7E91,0x7E92,0x7E93,0x7E94,0x7E95,0x7E96, + 0x7E97,0x7E98,0x7E99,0x7E9A,0x7E9C,0x7E9D,0x7E9E,0x7EAE, + 0x7EB4,0x7EBB,0x7EBC,0x7ED6,0x7EE4,0x7EEC,0x7EF9,0x7F0A, + 0x7F10,0x7F1E,0x7F37,0x7F39,0x7F3B,0x7F3C,0x7F3D,0x7F3E, + 0x7F3F,0x7F40,0x7F41,0x7F43,0x7F46,0x7F47,0x7F48,0x7F49, + 0x7F4A,0x7F4B,0x7F4C,0x7F4D,0x7F4E,0x7F4F,0x7F52,0x7F53, + 0x9988,0x6127,0x6E83,0x5764,0x6606,0x6346,0x56F0,0x62EC, + 0x6269,0x5ED3,0x9614,0x5783,0x62C9,0x5587,0x8721,0x814A, + 0x8FA3,0x5566,0x83B1,0x6765,0x8D56,0x84DD,0x5A6A,0x680F, + 0x62E6,0x7BEE,0x9611,0x5170,0x6F9C,0x8C30,0x63FD,0x89C8, + 0x61D2,0x7F06,0x70C2,0x6EE5,0x7405,0x6994,0x72FC,0x5ECA, + 0x90CE,0x6717,0x6D6A,0x635E,0x52B3,0x7262,0x8001,0x4F6C, + 0x59E5,0x916A,0x70D9,0x6D9D,0x52D2,0x4E50,0x96F7,0x956D, + 0x857E,0x78CA,0x7D2F,0x5121,0x5792,0x64C2,0x808B,0x7C7B, + 0x6CEA,0x68F1,0x695E,0x51B7,0x5398,0x68A8,0x7281,0x9ECE, + 0x7BF1,0x72F8,0x79BB,0x6F13,0x7406,0x674E,0x91CC,0x9CA4, + 0x793C,0x8389,0x8354,0x540F,0x6817,0x4E3D,0x5389,0x52B1, + 0x783E,0x5386,0x5229,0x5088,0x4F8B,0x4FD0, + }, + {0x7F56,0x7F59,0x7F5B,0x7F5C,0x7F5D,0x7F5E,0x7F60,0x7F63, + 0x7F64,0x7F65,0x7F66,0x7F67,0x7F6B,0x7F6C,0x7F6D,0x7F6F, + 0x7F70,0x7F73,0x7F75,0x7F76,0x7F77,0x7F78,0x7F7A,0x7F7B, + 0x7F7C,0x7F7D,0x7F7F,0x7F80,0x7F82,0x7F83,0x7F84,0x7F85, + 0x7F86,0x7F87,0x7F88,0x7F89,0x7F8B,0x7F8D,0x7F8F,0x7F90, + 0x7F91,0x7F92,0x7F93,0x7F95,0x7F96,0x7F97,0x7F98,0x7F99, + 0x7F9B,0x7F9C,0x7FA0,0x7FA2,0x7FA3,0x7FA5,0x7FA6,0x7FA8, + 0x7FA9,0x7FAA,0x7FAB,0x7FAC,0x7FAD,0x7FAE,0x7FB1,0x7FB3, + 0x7FB4,0x7FB5,0x7FB6,0x7FB7,0x7FBA,0x7FBB,0x7FBE,0x7FC0, + 0x7FC2,0x7FC3,0x7FC4,0x7FC6,0x7FC7,0x7FC8,0x7FC9,0x7FCB, + 0x7FCD,0x7FCF,0x7FD0,0x7FD1,0x7FD2,0x7FD3,0x7FD6,0x7FD7, + 0x7FD9,0x7FDA,0x7FDB,0x7FDC,0x7FDD,0x7FDE,0x7FE2,0x7FE3, + 0x75E2,0x7ACB,0x7C92,0x6CA5,0x96B6,0x529B,0x7483,0x54E9, + 0x4FE9,0x8054,0x83B2,0x8FDE,0x9570,0x5EC9,0x601C,0x6D9F, + 0x5E18,0x655B,0x8138,0x94FE,0x604B,0x70BC,0x7EC3,0x7CAE, + 0x51C9,0x6881,0x7CB1,0x826F,0x4E24,0x8F86,0x91CF,0x667E, + 0x4EAE,0x8C05,0x64A9,0x804A,0x50DA,0x7597,0x71CE,0x5BE5, + 0x8FBD,0x6F66,0x4E86,0x6482,0x9563,0x5ED6,0x6599,0x5217, + 0x88C2,0x70C8,0x52A3,0x730E,0x7433,0x6797,0x78F7,0x9716, + 0x4E34,0x90BB,0x9CDE,0x6DCB,0x51DB,0x8D41,0x541D,0x62CE, + 0x73B2,0x83F1,0x96F6,0x9F84,0x94C3,0x4F36,0x7F9A,0x51CC, + 0x7075,0x9675,0x5CAD,0x9886,0x53E6,0x4EE4,0x6E9C,0x7409, + 0x69B4,0x786B,0x998F,0x7559,0x5218,0x7624,0x6D41,0x67F3, + 0x516D,0x9F99,0x804B,0x5499,0x7B3C,0x7ABF, + }, + {0x7FE4,0x7FE7,0x7FE8,0x7FEA,0x7FEB,0x7FEC,0x7FED,0x7FEF, + 0x7FF2,0x7FF4,0x7FF5,0x7FF6,0x7FF7,0x7FF8,0x7FF9,0x7FFA, + 0x7FFD,0x7FFE,0x7FFF,0x8002,0x8007,0x8008,0x8009,0x800A, + 0x800E,0x800F,0x8011,0x8013,0x801A,0x801B,0x801D,0x801E, + 0x801F,0x8021,0x8023,0x8024,0x802B,0x802C,0x802D,0x802E, + 0x802F,0x8030,0x8032,0x8034,0x8039,0x803A,0x803C,0x803E, + 0x8040,0x8041,0x8044,0x8045,0x8047,0x8048,0x8049,0x804E, + 0x804F,0x8050,0x8051,0x8053,0x8055,0x8056,0x8057,0x8059, + 0x805B,0x805C,0x805D,0x805E,0x805F,0x8060,0x8061,0x8062, + 0x8063,0x8064,0x8065,0x8066,0x8067,0x8068,0x806B,0x806C, + 0x806D,0x806E,0x806F,0x8070,0x8072,0x8073,0x8074,0x8075, + 0x8076,0x8077,0x8078,0x8079,0x807A,0x807B,0x807C,0x807D, + 0x9686,0x5784,0x62E2,0x9647,0x697C,0x5A04,0x6402,0x7BD3, + 0x6F0F,0x964B,0x82A6,0x5362,0x9885,0x5E90,0x7089,0x63B3, + 0x5364,0x864F,0x9C81,0x9E93,0x788C,0x9732,0x8DEF,0x8D42, + 0x9E7F,0x6F5E,0x7984,0x5F55,0x9646,0x622E,0x9A74,0x5415, + 0x94DD,0x4FA3,0x65C5,0x5C65,0x5C61,0x7F15,0x8651,0x6C2F, + 0x5F8B,0x7387,0x6EE4,0x7EFF,0x5CE6,0x631B,0x5B6A,0x6EE6, + 0x5375,0x4E71,0x63A0,0x7565,0x62A1,0x8F6E,0x4F26,0x4ED1, + 0x6CA6,0x7EB6,0x8BBA,0x841D,0x87BA,0x7F57,0x903B,0x9523, + 0x7BA9,0x9AA1,0x88F8,0x843D,0x6D1B,0x9A86,0x7EDC,0x5988, + 0x9EBB,0x739B,0x7801,0x8682,0x9A6C,0x9A82,0x561B,0x5417, + 0x57CB,0x4E70,0x9EA6,0x5356,0x8FC8,0x8109,0x7792,0x9992, + 0x86EE,0x6EE1,0x8513,0x66FC,0x6162,0x6F2B, + }, + {0x807E,0x8081,0x8082,0x8085,0x8088,0x808A,0x808D,0x808E, + 0x808F,0x8090,0x8091,0x8092,0x8094,0x8095,0x8097,0x8099, + 0x809E,0x80A3,0x80A6,0x80A7,0x80A8,0x80AC,0x80B0,0x80B3, + 0x80B5,0x80B6,0x80B8,0x80B9,0x80BB,0x80C5,0x80C7,0x80C8, + 0x80C9,0x80CA,0x80CB,0x80CF,0x80D0,0x80D1,0x80D2,0x80D3, + 0x80D4,0x80D5,0x80D8,0x80DF,0x80E0,0x80E2,0x80E3,0x80E6, + 0x80EE,0x80F5,0x80F7,0x80F9,0x80FB,0x80FE,0x80FF,0x8100, + 0x8101,0x8103,0x8104,0x8105,0x8107,0x8108,0x810B,0x810C, + 0x8115,0x8117,0x8119,0x811B,0x811C,0x811D,0x811F,0x8120, + 0x8121,0x8122,0x8123,0x8124,0x8125,0x8126,0x8127,0x8128, + 0x8129,0x812A,0x812B,0x812D,0x812E,0x8130,0x8133,0x8134, + 0x8135,0x8137,0x8139,0x813A,0x813B,0x813C,0x813D,0x813F, + 0x8C29,0x8292,0x832B,0x76F2,0x6C13,0x5FD9,0x83BD,0x732B, + 0x8305,0x951A,0x6BDB,0x77DB,0x94C6,0x536F,0x8302,0x5192, + 0x5E3D,0x8C8C,0x8D38,0x4E48,0x73AB,0x679A,0x6885,0x9176, + 0x9709,0x7164,0x6CA1,0x7709,0x5A92,0x9541,0x6BCF,0x7F8E, + 0x6627,0x5BD0,0x59B9,0x5A9A,0x95E8,0x95F7,0x4EEC,0x840C, + 0x8499,0x6AAC,0x76DF,0x9530,0x731B,0x68A6,0x5B5F,0x772F, + 0x919A,0x9761,0x7CDC,0x8FF7,0x8C1C,0x5F25,0x7C73,0x79D8, + 0x89C5,0x6CCC,0x871C,0x5BC6,0x5E42,0x68C9,0x7720,0x7EF5, + 0x5195,0x514D,0x52C9,0x5A29,0x7F05,0x9762,0x82D7,0x63CF, + 0x7784,0x85D0,0x79D2,0x6E3A,0x5E99,0x5999,0x8511,0x706D, + 0x6C11,0x62BF,0x76BF,0x654F,0x60AF,0x95FD,0x660E,0x879F, + 0x9E23,0x94ED,0x540D,0x547D,0x8C2C,0x6478, + }, + {0x8140,0x8141,0x8142,0x8143,0x8144,0x8145,0x8147,0x8149, + 0x814D,0x814E,0x814F,0x8152,0x8156,0x8157,0x8158,0x815B, + 0x815C,0x815D,0x815E,0x815F,0x8161,0x8162,0x8163,0x8164, + 0x8166,0x8168,0x816A,0x816B,0x816C,0x816F,0x8172,0x8173, + 0x8175,0x8176,0x8177,0x8178,0x8181,0x8183,0x8184,0x8185, + 0x8186,0x8187,0x8189,0x818B,0x818C,0x818D,0x818E,0x8190, + 0x8192,0x8193,0x8194,0x8195,0x8196,0x8197,0x8199,0x819A, + 0x819E,0x819F,0x81A0,0x81A1,0x81A2,0x81A4,0x81A5,0x81A7, + 0x81A9,0x81AB,0x81AC,0x81AD,0x81AE,0x81AF,0x81B0,0x81B1, + 0x81B2,0x81B4,0x81B5,0x81B6,0x81B7,0x81B8,0x81B9,0x81BC, + 0x81BD,0x81BE,0x81BF,0x81C4,0x81C5,0x81C7,0x81C8,0x81C9, + 0x81CB,0x81CD,0x81CE,0x81CF,0x81D0,0x81D1,0x81D2,0x81D3, + 0x6479,0x8611,0x6A21,0x819C,0x78E8,0x6469,0x9B54,0x62B9, + 0x672B,0x83AB,0x58A8,0x9ED8,0x6CAB,0x6F20,0x5BDE,0x964C, + 0x8C0B,0x725F,0x67D0,0x62C7,0x7261,0x4EA9,0x59C6,0x6BCD, + 0x5893,0x66AE,0x5E55,0x52DF,0x6155,0x6728,0x76EE,0x7766, + 0x7267,0x7A46,0x62FF,0x54EA,0x5450,0x94A0,0x90A3,0x5A1C, + 0x7EB3,0x6C16,0x4E43,0x5976,0x8010,0x5948,0x5357,0x7537, + 0x96BE,0x56CA,0x6320,0x8111,0x607C,0x95F9,0x6DD6,0x5462, + 0x9981,0x5185,0x5AE9,0x80FD,0x59AE,0x9713,0x502A,0x6CE5, + 0x5C3C,0x62DF,0x4F60,0x533F,0x817B,0x9006,0x6EBA,0x852B, + 0x62C8,0x5E74,0x78BE,0x64B5,0x637B,0x5FF5,0x5A18,0x917F, + 0x9E1F,0x5C3F,0x634F,0x8042,0x5B7D,0x556E,0x954A,0x954D, + 0x6D85,0x60A8,0x67E0,0x72DE,0x51DD,0x5B81, + }, + {0x81D4,0x81D5,0x81D6,0x81D7,0x81D8,0x81D9,0x81DA,0x81DB, + 0x81DC,0x81DD,0x81DE,0x81DF,0x81E0,0x81E1,0x81E2,0x81E4, + 0x81E5,0x81E6,0x81E8,0x81E9,0x81EB,0x81EE,0x81EF,0x81F0, + 0x81F1,0x81F2,0x81F5,0x81F6,0x81F7,0x81F8,0x81F9,0x81FA, + 0x81FD,0x81FF,0x8203,0x8207,0x8208,0x8209,0x820A,0x820B, + 0x820E,0x820F,0x8211,0x8213,0x8215,0x8216,0x8217,0x8218, + 0x8219,0x821A,0x821D,0x8220,0x8224,0x8225,0x8226,0x8227, + 0x8229,0x822E,0x8232,0x823A,0x823C,0x823D,0x823F,0x8240, + 0x8241,0x8242,0x8243,0x8245,0x8246,0x8248,0x824A,0x824C, + 0x824D,0x824E,0x8250,0x8251,0x8252,0x8253,0x8254,0x8255, + 0x8256,0x8257,0x8259,0x825B,0x825C,0x825D,0x825E,0x8260, + 0x8261,0x8262,0x8263,0x8264,0x8265,0x8266,0x8267,0x8269, + 0x62E7,0x6CDE,0x725B,0x626D,0x94AE,0x7EBD,0x8113,0x6D53, + 0x519C,0x5F04,0x5974,0x52AA,0x6012,0x5973,0x6696,0x8650, + 0x759F,0x632A,0x61E6,0x7CEF,0x8BFA,0x54E6,0x6B27,0x9E25, + 0x6BB4,0x85D5,0x5455,0x5076,0x6CA4,0x556A,0x8DB4,0x722C, + 0x5E15,0x6015,0x7436,0x62CD,0x6392,0x724C,0x5F98,0x6E43, + 0x6D3E,0x6500,0x6F58,0x76D8,0x78D0,0x76FC,0x7554,0x5224, + 0x53DB,0x4E53,0x5E9E,0x65C1,0x802A,0x80D6,0x629B,0x5486, + 0x5228,0x70AE,0x888D,0x8DD1,0x6CE1,0x5478,0x80DA,0x57F9, + 0x88F4,0x8D54,0x966A,0x914D,0x4F69,0x6C9B,0x55B7,0x76C6, + 0x7830,0x62A8,0x70F9,0x6F8E,0x5F6D,0x84EC,0x68DA,0x787C, + 0x7BF7,0x81A8,0x670B,0x9E4F,0x6367,0x78B0,0x576F,0x7812, + 0x9739,0x6279,0x62AB,0x5288,0x7435,0x6BD7, + }, + {0x826A,0x826B,0x826C,0x826D,0x8271,0x8275,0x8276,0x8277, + 0x8278,0x827B,0x827C,0x8280,0x8281,0x8283,0x8285,0x8286, + 0x8287,0x8289,0x828C,0x8290,0x8293,0x8294,0x8295,0x8296, + 0x829A,0x829B,0x829E,0x82A0,0x82A2,0x82A3,0x82A7,0x82B2, + 0x82B5,0x82B6,0x82BA,0x82BB,0x82BC,0x82BF,0x82C0,0x82C2, + 0x82C3,0x82C5,0x82C6,0x82C9,0x82D0,0x82D6,0x82D9,0x82DA, + 0x82DD,0x82E2,0x82E7,0x82E8,0x82E9,0x82EA,0x82EC,0x82ED, + 0x82EE,0x82F0,0x82F2,0x82F3,0x82F5,0x82F6,0x82F8,0x82FA, + 0x82FC,0x82FD,0x82FE,0x82FF,0x8300,0x830A,0x830B,0x830D, + 0x8310,0x8312,0x8313,0x8316,0x8318,0x8319,0x831D,0x831E, + 0x831F,0x8320,0x8321,0x8322,0x8323,0x8324,0x8325,0x8326, + 0x8329,0x832A,0x832E,0x8330,0x8332,0x8337,0x833B,0x833D, + 0x5564,0x813E,0x75B2,0x76AE,0x5339,0x75DE,0x50FB,0x5C41, + 0x8B6C,0x7BC7,0x504F,0x7247,0x9A97,0x98D8,0x6F02,0x74E2, + 0x7968,0x6487,0x77A5,0x62FC,0x9891,0x8D2B,0x54C1,0x8058, + 0x4E52,0x576A,0x82F9,0x840D,0x5E73,0x51ED,0x74F6,0x8BC4, + 0x5C4F,0x5761,0x6CFC,0x9887,0x5A46,0x7834,0x9B44,0x8FEB, + 0x7C95,0x5256,0x6251,0x94FA,0x4EC6,0x8386,0x8461,0x83E9, + 0x84B2,0x57D4,0x6734,0x5703,0x666E,0x6D66,0x8C31,0x66DD, + 0x7011,0x671F,0x6B3A,0x6816,0x621A,0x59BB,0x4E03,0x51C4, + 0x6F06,0x67D2,0x6C8F,0x5176,0x68CB,0x5947,0x6B67,0x7566, + 0x5D0E,0x8110,0x9F50,0x65D7,0x7948,0x7941,0x9A91,0x8D77, + 0x5C82,0x4E5E,0x4F01,0x542F,0x5951,0x780C,0x5668,0x6C14, + 0x8FC4,0x5F03,0x6C7D,0x6CE3,0x8BAB,0x6390, + }, + {0x833E,0x833F,0x8341,0x8342,0x8344,0x8345,0x8348,0x834A, + 0x834B,0x834C,0x834D,0x834E,0x8353,0x8355,0x8356,0x8357, + 0x8358,0x8359,0x835D,0x8362,0x8370,0x8371,0x8372,0x8373, + 0x8374,0x8375,0x8376,0x8379,0x837A,0x837E,0x837F,0x8380, + 0x8381,0x8382,0x8383,0x8384,0x8387,0x8388,0x838A,0x838B, + 0x838C,0x838D,0x838F,0x8390,0x8391,0x8394,0x8395,0x8396, + 0x8397,0x8399,0x839A,0x839D,0x839F,0x83A1,0x83A2,0x83A3, + 0x83A4,0x83A5,0x83A6,0x83A7,0x83AC,0x83AD,0x83AE,0x83AF, + 0x83B5,0x83BB,0x83BE,0x83BF,0x83C2,0x83C3,0x83C4,0x83C6, + 0x83C8,0x83C9,0x83CB,0x83CD,0x83CE,0x83D0,0x83D1,0x83D2, + 0x83D3,0x83D5,0x83D7,0x83D9,0x83DA,0x83DB,0x83DE,0x83E2, + 0x83E3,0x83E4,0x83E6,0x83E7,0x83E8,0x83EB,0x83EC,0x83ED, + 0x6070,0x6D3D,0x7275,0x6266,0x948E,0x94C5,0x5343,0x8FC1, + 0x7B7E,0x4EDF,0x8C26,0x4E7E,0x9ED4,0x94B1,0x94B3,0x524D, + 0x6F5C,0x9063,0x6D45,0x8C34,0x5811,0x5D4C,0x6B20,0x6B49, + 0x67AA,0x545B,0x8154,0x7F8C,0x5899,0x8537,0x5F3A,0x62A2, + 0x6A47,0x9539,0x6572,0x6084,0x6865,0x77A7,0x4E54,0x4FA8, + 0x5DE7,0x9798,0x64AC,0x7FD8,0x5CED,0x4FCF,0x7A8D,0x5207, + 0x8304,0x4E14,0x602F,0x7A83,0x94A6,0x4FB5,0x4EB2,0x79E6, + 0x7434,0x52E4,0x82B9,0x64D2,0x79BD,0x5BDD,0x6C81,0x9752, + 0x8F7B,0x6C22,0x503E,0x537F,0x6E05,0x64CE,0x6674,0x6C30, + 0x60C5,0x9877,0x8BF7,0x5E86,0x743C,0x7A77,0x79CB,0x4E18, + 0x90B1,0x7403,0x6C42,0x56DA,0x914B,0x6CC5,0x8D8B,0x533A, + 0x86C6,0x66F2,0x8EAF,0x5C48,0x9A71,0x6E20, + }, + {0x83EE,0x83EF,0x83F3,0x83F4,0x83F5,0x83F6,0x83F7,0x83FA, + 0x83FB,0x83FC,0x83FE,0x83FF,0x8400,0x8402,0x8405,0x8407, + 0x8408,0x8409,0x840A,0x8410,0x8412,0x8413,0x8414,0x8415, + 0x8416,0x8417,0x8419,0x841A,0x841B,0x841E,0x841F,0x8420, + 0x8421,0x8422,0x8423,0x8429,0x842A,0x842B,0x842C,0x842D, + 0x842E,0x842F,0x8430,0x8432,0x8433,0x8434,0x8435,0x8436, + 0x8437,0x8439,0x843A,0x843B,0x843E,0x843F,0x8440,0x8441, + 0x8442,0x8443,0x8444,0x8445,0x8447,0x8448,0x8449,0x844A, + 0x844B,0x844C,0x844D,0x844E,0x844F,0x8450,0x8452,0x8453, + 0x8454,0x8455,0x8456,0x8458,0x845D,0x845E,0x845F,0x8460, + 0x8462,0x8464,0x8465,0x8466,0x8467,0x8468,0x846A,0x846E, + 0x846F,0x8470,0x8472,0x8474,0x8477,0x8479,0x847B,0x847C, + 0x53D6,0x5A36,0x9F8B,0x8DA3,0x53BB,0x5708,0x98A7,0x6743, + 0x919B,0x6CC9,0x5168,0x75CA,0x62F3,0x72AC,0x5238,0x529D, + 0x7F3A,0x7094,0x7638,0x5374,0x9E4A,0x69B7,0x786E,0x96C0, + 0x88D9,0x7FA4,0x7136,0x71C3,0x5189,0x67D3,0x74E4,0x58E4, + 0x6518,0x56B7,0x8BA9,0x9976,0x6270,0x7ED5,0x60F9,0x70ED, + 0x58EC,0x4EC1,0x4EBA,0x5FCD,0x97E7,0x4EFB,0x8BA4,0x5203, + 0x598A,0x7EAB,0x6254,0x4ECD,0x65E5,0x620E,0x8338,0x84C9, + 0x8363,0x878D,0x7194,0x6EB6,0x5BB9,0x7ED2,0x5197,0x63C9, + 0x67D4,0x8089,0x8339,0x8815,0x5112,0x5B7A,0x5982,0x8FB1, + 0x4E73,0x6C5D,0x5165,0x8925,0x8F6F,0x962E,0x854A,0x745E, + 0x9510,0x95F0,0x6DA6,0x82E5,0x5F31,0x6492,0x6D12,0x8428, + 0x816E,0x9CC3,0x585E,0x8D5B,0x4E09,0x53C1, + }, + {0x847D,0x847E,0x847F,0x8480,0x8481,0x8483,0x8484,0x8485, + 0x8486,0x848A,0x848D,0x848F,0x8490,0x8491,0x8492,0x8493, + 0x8494,0x8495,0x8496,0x8498,0x849A,0x849B,0x849D,0x849E, + 0x849F,0x84A0,0x84A2,0x84A3,0x84A4,0x84A5,0x84A6,0x84A7, + 0x84A8,0x84A9,0x84AA,0x84AB,0x84AC,0x84AD,0x84AE,0x84B0, + 0x84B1,0x84B3,0x84B5,0x84B6,0x84B7,0x84BB,0x84BC,0x84BE, + 0x84C0,0x84C2,0x84C3,0x84C5,0x84C6,0x84C7,0x84C8,0x84CB, + 0x84CC,0x84CE,0x84CF,0x84D2,0x84D4,0x84D5,0x84D7,0x84D8, + 0x84D9,0x84DA,0x84DB,0x84DC,0x84DE,0x84E1,0x84E2,0x84E4, + 0x84E7,0x84E8,0x84E9,0x84EA,0x84EB,0x84ED,0x84EE,0x84EF, + 0x84F1,0x84F2,0x84F3,0x84F4,0x84F5,0x84F6,0x84F7,0x84F8, + 0x84F9,0x84FA,0x84FB,0x84FD,0x84FE,0x8500,0x8501,0x8502, + 0x4F1E,0x6563,0x6851,0x55D3,0x4E27,0x6414,0x9A9A,0x626B, + 0x5AC2,0x745F,0x8272,0x6DA9,0x68EE,0x50E7,0x838E,0x7802, + 0x6740,0x5239,0x6C99,0x7EB1,0x50BB,0x5565,0x715E,0x7B5B, + 0x6652,0x73CA,0x82EB,0x6749,0x5C71,0x5220,0x717D,0x886B, + 0x95EA,0x9655,0x64C5,0x8D61,0x81B3,0x5584,0x6C55,0x6247, + 0x7F2E,0x5892,0x4F24,0x5546,0x8D4F,0x664C,0x4E0A,0x5C1A, + 0x88F3,0x68A2,0x634E,0x7A0D,0x70E7,0x828D,0x52FA,0x97F6, + 0x5C11,0x54E8,0x90B5,0x7ECD,0x5962,0x8D4A,0x86C7,0x820C, + 0x820D,0x8D66,0x6444,0x5C04,0x6151,0x6D89,0x793E,0x8BBE, + 0x7837,0x7533,0x547B,0x4F38,0x8EAB,0x6DF1,0x5A20,0x7EC5, + 0x795E,0x6C88,0x5BA1,0x5A76,0x751A,0x80BE,0x614E,0x6E17, + 0x58F0,0x751F,0x7525,0x7272,0x5347,0x7EF3, + }, + {0x8503,0x8504,0x8505,0x8506,0x8507,0x8508,0x8509,0x850A, + 0x850B,0x850D,0x850E,0x850F,0x8510,0x8512,0x8514,0x8515, + 0x8516,0x8518,0x8519,0x851B,0x851C,0x851D,0x851E,0x8520, + 0x8522,0x8523,0x8524,0x8525,0x8526,0x8527,0x8528,0x8529, + 0x852A,0x852D,0x852E,0x852F,0x8530,0x8531,0x8532,0x8533, + 0x8534,0x8535,0x8536,0x853E,0x853F,0x8540,0x8541,0x8542, + 0x8544,0x8545,0x8546,0x8547,0x854B,0x854C,0x854D,0x854E, + 0x854F,0x8550,0x8551,0x8552,0x8553,0x8554,0x8555,0x8557, + 0x8558,0x855A,0x855B,0x855C,0x855D,0x855F,0x8560,0x8561, + 0x8562,0x8563,0x8565,0x8566,0x8567,0x8569,0x856A,0x856B, + 0x856C,0x856D,0x856E,0x856F,0x8570,0x8571,0x8573,0x8575, + 0x8576,0x8577,0x8578,0x857C,0x857D,0x857F,0x8580,0x8581, + 0x7701,0x76DB,0x5269,0x80DC,0x5723,0x5E08,0x5931,0x72EE, + 0x65BD,0x6E7F,0x8BD7,0x5C38,0x8671,0x5341,0x77F3,0x62FE, + 0x65F6,0x4EC0,0x98DF,0x8680,0x5B9E,0x8BC6,0x53F2,0x77E2, + 0x4F7F,0x5C4E,0x9A76,0x59CB,0x5F0F,0x793A,0x58EB,0x4E16, + 0x67FF,0x4E8B,0x62ED,0x8A93,0x901D,0x52BF,0x662F,0x55DC, + 0x566C,0x9002,0x4ED5,0x4F8D,0x91CA,0x9970,0x6C0F,0x5E02, + 0x6043,0x5BA4,0x89C6,0x8BD5,0x6536,0x624B,0x9996,0x5B88, + 0x5BFF,0x6388,0x552E,0x53D7,0x7626,0x517D,0x852C,0x67A2, + 0x68B3,0x6B8A,0x6292,0x8F93,0x53D4,0x8212,0x6DD1,0x758F, + 0x4E66,0x8D4E,0x5B70,0x719F,0x85AF,0x6691,0x66D9,0x7F72, + 0x8700,0x9ECD,0x9F20,0x5C5E,0x672F,0x8FF0,0x6811,0x675F, + 0x620D,0x7AD6,0x5885,0x5EB6,0x6570,0x6F31, + }, + {0x8582,0x8583,0x8586,0x8588,0x8589,0x858A,0x858B,0x858C, + 0x858D,0x858E,0x8590,0x8591,0x8592,0x8593,0x8594,0x8595, + 0x8596,0x8597,0x8598,0x8599,0x859A,0x859D,0x859E,0x859F, + 0x85A0,0x85A1,0x85A2,0x85A3,0x85A5,0x85A6,0x85A7,0x85A9, + 0x85AB,0x85AC,0x85AD,0x85B1,0x85B2,0x85B3,0x85B4,0x85B5, + 0x85B6,0x85B8,0x85BA,0x85BB,0x85BC,0x85BD,0x85BE,0x85BF, + 0x85C0,0x85C2,0x85C3,0x85C4,0x85C5,0x85C6,0x85C7,0x85C8, + 0x85CA,0x85CB,0x85CC,0x85CD,0x85CE,0x85D1,0x85D2,0x85D4, + 0x85D6,0x85D7,0x85D8,0x85D9,0x85DA,0x85DB,0x85DD,0x85DE, + 0x85DF,0x85E0,0x85E1,0x85E2,0x85E3,0x85E5,0x85E6,0x85E7, + 0x85E8,0x85EA,0x85EB,0x85EC,0x85ED,0x85EE,0x85EF,0x85F0, + 0x85F1,0x85F2,0x85F3,0x85F4,0x85F5,0x85F6,0x85F7,0x85F8, + 0x6055,0x5237,0x800D,0x6454,0x8870,0x7529,0x5E05,0x6813, + 0x62F4,0x971C,0x53CC,0x723D,0x8C01,0x6C34,0x7761,0x7A0E, + 0x542E,0x77AC,0x987A,0x821C,0x8BF4,0x7855,0x6714,0x70C1, + 0x65AF,0x6495,0x5636,0x601D,0x79C1,0x53F8,0x4E1D,0x6B7B, + 0x8086,0x5BFA,0x55E3,0x56DB,0x4F3A,0x4F3C,0x9972,0x5DF3, + 0x677E,0x8038,0x6002,0x9882,0x9001,0x5B8B,0x8BBC,0x8BF5, + 0x641C,0x8258,0x64DE,0x55FD,0x82CF,0x9165,0x4FD7,0x7D20, + 0x901F,0x7C9F,0x50F3,0x5851,0x6EAF,0x5BBF,0x8BC9,0x8083, + 0x9178,0x849C,0x7B97,0x867D,0x968B,0x968F,0x7EE5,0x9AD3, + 0x788E,0x5C81,0x7A57,0x9042,0x96A7,0x795F,0x5B59,0x635F, + 0x7B0B,0x84D1,0x68AD,0x5506,0x7F29,0x7410,0x7D22,0x9501, + 0x6240,0x584C,0x4ED6,0x5B83,0x5979,0x5854, + }, + {0x85F9,0x85FA,0x85FC,0x85FD,0x85FE,0x8600,0x8601,0x8602, + 0x8603,0x8604,0x8606,0x8607,0x8608,0x8609,0x860A,0x860B, + 0x860C,0x860D,0x860E,0x860F,0x8610,0x8612,0x8613,0x8614, + 0x8615,0x8617,0x8618,0x8619,0x861A,0x861B,0x861C,0x861D, + 0x861E,0x861F,0x8620,0x8621,0x8622,0x8623,0x8624,0x8625, + 0x8626,0x8628,0x862A,0x862B,0x862C,0x862D,0x862E,0x862F, + 0x8630,0x8631,0x8632,0x8633,0x8634,0x8635,0x8636,0x8637, + 0x8639,0x863A,0x863B,0x863D,0x863E,0x863F,0x8640,0x8641, + 0x8642,0x8643,0x8644,0x8645,0x8646,0x8647,0x8648,0x8649, + 0x864A,0x864B,0x864C,0x8652,0x8653,0x8655,0x8656,0x8657, + 0x8658,0x8659,0x865B,0x865C,0x865D,0x865F,0x8660,0x8661, + 0x8663,0x8664,0x8665,0x8666,0x8667,0x8668,0x8669,0x866A, + 0x736D,0x631E,0x8E4B,0x8E0F,0x80CE,0x82D4,0x62AC,0x53F0, + 0x6CF0,0x915E,0x592A,0x6001,0x6C70,0x574D,0x644A,0x8D2A, + 0x762B,0x6EE9,0x575B,0x6A80,0x75F0,0x6F6D,0x8C2D,0x8C08, + 0x5766,0x6BEF,0x8892,0x78B3,0x63A2,0x53F9,0x70AD,0x6C64, + 0x5858,0x642A,0x5802,0x68E0,0x819B,0x5510,0x7CD6,0x5018, + 0x8EBA,0x6DCC,0x8D9F,0x70EB,0x638F,0x6D9B,0x6ED4,0x7EE6, + 0x8404,0x6843,0x9003,0x6DD8,0x9676,0x8BA8,0x5957,0x7279, + 0x85E4,0x817E,0x75BC,0x8A8A,0x68AF,0x5254,0x8E22,0x9511, + 0x63D0,0x9898,0x8E44,0x557C,0x4F53,0x66FF,0x568F,0x60D5, + 0x6D95,0x5243,0x5C49,0x5929,0x6DFB,0x586B,0x7530,0x751C, + 0x606C,0x8214,0x8146,0x6311,0x6761,0x8FE2,0x773A,0x8DF3, + 0x8D34,0x94C1,0x5E16,0x5385,0x542C,0x70C3, + }, + {0x866D,0x866F,0x8670,0x8672,0x8673,0x8674,0x8675,0x8676, + 0x8677,0x8678,0x8683,0x8684,0x8685,0x8686,0x8687,0x8688, + 0x8689,0x868E,0x868F,0x8690,0x8691,0x8692,0x8694,0x8696, + 0x8697,0x8698,0x8699,0x869A,0x869B,0x869E,0x869F,0x86A0, + 0x86A1,0x86A2,0x86A5,0x86A6,0x86AB,0x86AD,0x86AE,0x86B2, + 0x86B3,0x86B7,0x86B8,0x86B9,0x86BB,0x86BC,0x86BD,0x86BE, + 0x86BF,0x86C1,0x86C2,0x86C3,0x86C5,0x86C8,0x86CC,0x86CD, + 0x86D2,0x86D3,0x86D5,0x86D6,0x86D7,0x86DA,0x86DC,0x86DD, + 0x86E0,0x86E1,0x86E2,0x86E3,0x86E5,0x86E6,0x86E7,0x86E8, + 0x86EA,0x86EB,0x86EC,0x86EF,0x86F5,0x86F6,0x86F7,0x86FA, + 0x86FB,0x86FC,0x86FD,0x86FF,0x8701,0x8704,0x8705,0x8706, + 0x870B,0x870C,0x870E,0x870F,0x8710,0x8711,0x8714,0x8716, + 0x6C40,0x5EF7,0x505C,0x4EAD,0x5EAD,0x633A,0x8247,0x901A, + 0x6850,0x916E,0x77B3,0x540C,0x94DC,0x5F64,0x7AE5,0x6876, + 0x6345,0x7B52,0x7EDF,0x75DB,0x5077,0x6295,0x5934,0x900F, + 0x51F8,0x79C3,0x7A81,0x56FE,0x5F92,0x9014,0x6D82,0x5C60, + 0x571F,0x5410,0x5154,0x6E4D,0x56E2,0x63A8,0x9893,0x817F, + 0x8715,0x892A,0x9000,0x541E,0x5C6F,0x81C0,0x62D6,0x6258, + 0x8131,0x9E35,0x9640,0x9A6E,0x9A7C,0x692D,0x59A5,0x62D3, + 0x553E,0x6316,0x54C7,0x86D9,0x6D3C,0x5A03,0x74E6,0x889C, + 0x6B6A,0x5916,0x8C4C,0x5F2F,0x6E7E,0x73A9,0x987D,0x4E38, + 0x70F7,0x5B8C,0x7897,0x633D,0x665A,0x7696,0x60CB,0x5B9B, + 0x5A49,0x4E07,0x8155,0x6C6A,0x738B,0x4EA1,0x6789,0x7F51, + 0x5F80,0x65FA,0x671B,0x5FD8,0x5984,0x5A01, + }, + {0x8719,0x871B,0x871D,0x871F,0x8720,0x8724,0x8726,0x8727, + 0x8728,0x872A,0x872B,0x872C,0x872D,0x872F,0x8730,0x8732, + 0x8733,0x8735,0x8736,0x8738,0x8739,0x873A,0x873C,0x873D, + 0x8740,0x8741,0x8742,0x8743,0x8744,0x8745,0x8746,0x874A, + 0x874B,0x874D,0x874F,0x8750,0x8751,0x8752,0x8754,0x8755, + 0x8756,0x8758,0x875A,0x875B,0x875C,0x875D,0x875E,0x875F, + 0x8761,0x8762,0x8766,0x8767,0x8768,0x8769,0x876A,0x876B, + 0x876C,0x876D,0x876F,0x8771,0x8772,0x8773,0x8775,0x8777, + 0x8778,0x8779,0x877A,0x877F,0x8780,0x8781,0x8784,0x8786, + 0x8787,0x8789,0x878A,0x878C,0x878E,0x878F,0x8790,0x8791, + 0x8792,0x8794,0x8795,0x8796,0x8798,0x8799,0x879A,0x879B, + 0x879C,0x879D,0x879E,0x87A0,0x87A1,0x87A2,0x87A3,0x87A4, + 0x5DCD,0x5FAE,0x5371,0x97E6,0x8FDD,0x6845,0x56F4,0x552F, + 0x60DF,0x4E3A,0x6F4D,0x7EF4,0x82C7,0x840E,0x59D4,0x4F1F, + 0x4F2A,0x5C3E,0x7EAC,0x672A,0x851A,0x5473,0x754F,0x80C3, + 0x5582,0x9B4F,0x4F4D,0x6E2D,0x8C13,0x5C09,0x6170,0x536B, + 0x761F,0x6E29,0x868A,0x6587,0x95FB,0x7EB9,0x543B,0x7A33, + 0x7D0A,0x95EE,0x55E1,0x7FC1,0x74EE,0x631D,0x8717,0x6DA1, + 0x7A9D,0x6211,0x65A1,0x5367,0x63E1,0x6C83,0x5DEB,0x545C, + 0x94A8,0x4E4C,0x6C61,0x8BEC,0x5C4B,0x65E0,0x829C,0x68A7, + 0x543E,0x5434,0x6BCB,0x6B66,0x4E94,0x6342,0x5348,0x821E, + 0x4F0D,0x4FAE,0x575E,0x620A,0x96FE,0x6664,0x7269,0x52FF, + 0x52A1,0x609F,0x8BEF,0x6614,0x7199,0x6790,0x897F,0x7852, + 0x77FD,0x6670,0x563B,0x5438,0x9521,0x727A, + }, + {0x87A5,0x87A6,0x87A7,0x87A9,0x87AA,0x87AE,0x87B0,0x87B1, + 0x87B2,0x87B4,0x87B6,0x87B7,0x87B8,0x87B9,0x87BB,0x87BC, + 0x87BE,0x87BF,0x87C1,0x87C2,0x87C3,0x87C4,0x87C5,0x87C7, + 0x87C8,0x87C9,0x87CC,0x87CD,0x87CE,0x87CF,0x87D0,0x87D4, + 0x87D5,0x87D6,0x87D7,0x87D8,0x87D9,0x87DA,0x87DC,0x87DD, + 0x87DE,0x87DF,0x87E1,0x87E2,0x87E3,0x87E4,0x87E6,0x87E7, + 0x87E8,0x87E9,0x87EB,0x87EC,0x87ED,0x87EF,0x87F0,0x87F1, + 0x87F2,0x87F3,0x87F4,0x87F5,0x87F6,0x87F7,0x87F8,0x87FA, + 0x87FB,0x87FC,0x87FD,0x87FF,0x8800,0x8801,0x8802,0x8804, + 0x8805,0x8806,0x8807,0x8808,0x8809,0x880B,0x880C,0x880D, + 0x880E,0x880F,0x8810,0x8811,0x8812,0x8814,0x8817,0x8818, + 0x8819,0x881A,0x881C,0x881D,0x881E,0x881F,0x8820,0x8823, + 0x7A00,0x606F,0x5E0C,0x6089,0x819D,0x5915,0x60DC,0x7184, + 0x70EF,0x6EAA,0x6C50,0x7280,0x6A84,0x88AD,0x5E2D,0x4E60, + 0x5AB3,0x559C,0x94E3,0x6D17,0x7CFB,0x9699,0x620F,0x7EC6, + 0x778E,0x867E,0x5323,0x971E,0x8F96,0x6687,0x5CE1,0x4FA0, + 0x72ED,0x4E0B,0x53A6,0x590F,0x5413,0x6380,0x9528,0x5148, + 0x4ED9,0x9C9C,0x7EA4,0x54B8,0x8D24,0x8854,0x8237,0x95F2, + 0x6D8E,0x5F26,0x5ACC,0x663E,0x9669,0x73B0,0x732E,0x53BF, + 0x817A,0x9985,0x7FA1,0x5BAA,0x9677,0x9650,0x7EBF,0x76F8, + 0x53A2,0x9576,0x9999,0x7BB1,0x8944,0x6E58,0x4E61,0x7FD4, + 0x7965,0x8BE6,0x60F3,0x54CD,0x4EAB,0x9879,0x5DF7,0x6A61, + 0x50CF,0x5411,0x8C61,0x8427,0x785D,0x9704,0x524A,0x54EE, + 0x56A3,0x9500,0x6D88,0x5BB5,0x6DC6,0x6653, + }, + {0x8824,0x8825,0x8826,0x8827,0x8828,0x8829,0x882A,0x882B, + 0x882C,0x882D,0x882E,0x882F,0x8830,0x8831,0x8833,0x8834, + 0x8835,0x8836,0x8837,0x8838,0x883A,0x883B,0x883D,0x883E, + 0x883F,0x8841,0x8842,0x8843,0x8846,0x8847,0x8848,0x8849, + 0x884A,0x884B,0x884E,0x884F,0x8850,0x8851,0x8852,0x8853, + 0x8855,0x8856,0x8858,0x885A,0x885B,0x885C,0x885D,0x885E, + 0x885F,0x8860,0x8866,0x8867,0x886A,0x886D,0x886F,0x8871, + 0x8873,0x8874,0x8875,0x8876,0x8878,0x8879,0x887A,0x887B, + 0x887C,0x8880,0x8883,0x8886,0x8887,0x8889,0x888A,0x888C, + 0x888E,0x888F,0x8890,0x8891,0x8893,0x8894,0x8895,0x8897, + 0x8898,0x8899,0x889A,0x889B,0x889D,0x889E,0x889F,0x88A0, + 0x88A1,0x88A3,0x88A5,0x88A6,0x88A7,0x88A8,0x88A9,0x88AA, + 0x5C0F,0x5B5D,0x6821,0x8096,0x5578,0x7B11,0x6548,0x6954, + 0x4E9B,0x6B47,0x874E,0x978B,0x534F,0x631F,0x643A,0x90AA, + 0x659C,0x80C1,0x8C10,0x5199,0x68B0,0x5378,0x87F9,0x61C8, + 0x6CC4,0x6CFB,0x8C22,0x5C51,0x85AA,0x82AF,0x950C,0x6B23, + 0x8F9B,0x65B0,0x5FFB,0x5FC3,0x4FE1,0x8845,0x661F,0x8165, + 0x7329,0x60FA,0x5174,0x5211,0x578B,0x5F62,0x90A2,0x884C, + 0x9192,0x5E78,0x674F,0x6027,0x59D3,0x5144,0x51F6,0x80F8, + 0x5308,0x6C79,0x96C4,0x718A,0x4F11,0x4FEE,0x7F9E,0x673D, + 0x55C5,0x9508,0x79C0,0x8896,0x7EE3,0x589F,0x620C,0x9700, + 0x865A,0x5618,0x987B,0x5F90,0x8BB8,0x84C4,0x9157,0x53D9, + 0x65ED,0x5E8F,0x755C,0x6064,0x7D6E,0x5A7F,0x7EEA,0x7EED, + 0x8F69,0x55A7,0x5BA3,0x60AC,0x65CB,0x7384, + }, + {0x88AC,0x88AE,0x88AF,0x88B0,0x88B2,0x88B3,0x88B4,0x88B5, + 0x88B6,0x88B8,0x88B9,0x88BA,0x88BB,0x88BD,0x88BE,0x88BF, + 0x88C0,0x88C3,0x88C4,0x88C7,0x88C8,0x88CA,0x88CB,0x88CC, + 0x88CD,0x88CF,0x88D0,0x88D1,0x88D3,0x88D6,0x88D7,0x88DA, + 0x88DB,0x88DC,0x88DD,0x88DE,0x88E0,0x88E1,0x88E6,0x88E7, + 0x88E9,0x88EA,0x88EB,0x88EC,0x88ED,0x88EE,0x88EF,0x88F2, + 0x88F5,0x88F6,0x88F7,0x88FA,0x88FB,0x88FD,0x88FF,0x8900, + 0x8901,0x8903,0x8904,0x8905,0x8906,0x8907,0x8908,0x8909, + 0x890B,0x890C,0x890D,0x890E,0x890F,0x8911,0x8914,0x8915, + 0x8916,0x8917,0x8918,0x891C,0x891D,0x891E,0x891F,0x8920, + 0x8922,0x8923,0x8924,0x8926,0x8927,0x8928,0x8929,0x892C, + 0x892D,0x892E,0x892F,0x8931,0x8932,0x8933,0x8935,0x8937, + 0x9009,0x7663,0x7729,0x7EDA,0x9774,0x859B,0x5B66,0x7A74, + 0x96EA,0x8840,0x52CB,0x718F,0x5FAA,0x65EC,0x8BE2,0x5BFB, + 0x9A6F,0x5DE1,0x6B89,0x6C5B,0x8BAD,0x8BAF,0x900A,0x8FC5, + 0x538B,0x62BC,0x9E26,0x9E2D,0x5440,0x4E2B,0x82BD,0x7259, + 0x869C,0x5D16,0x8859,0x6DAF,0x96C5,0x54D1,0x4E9A,0x8BB6, + 0x7109,0x54BD,0x9609,0x70DF,0x6DF9,0x76D0,0x4E25,0x7814, + 0x8712,0x5CA9,0x5EF6,0x8A00,0x989C,0x960E,0x708E,0x6CBF, + 0x5944,0x63A9,0x773C,0x884D,0x6F14,0x8273,0x5830,0x71D5, + 0x538C,0x781A,0x96C1,0x5501,0x5F66,0x7130,0x5BB4,0x8C1A, + 0x9A8C,0x6B83,0x592E,0x9E2F,0x79E7,0x6768,0x626C,0x4F6F, + 0x75A1,0x7F8A,0x6D0B,0x9633,0x6C27,0x4EF0,0x75D2,0x517B, + 0x6837,0x6F3E,0x9080,0x8170,0x5996,0x7476, + }, + {0x8938,0x8939,0x893A,0x893B,0x893C,0x893D,0x893E,0x893F, + 0x8940,0x8942,0x8943,0x8945,0x8946,0x8947,0x8948,0x8949, + 0x894A,0x894B,0x894C,0x894D,0x894E,0x894F,0x8950,0x8951, + 0x8952,0x8953,0x8954,0x8955,0x8956,0x8957,0x8958,0x8959, + 0x895A,0x895B,0x895C,0x895D,0x8960,0x8961,0x8962,0x8963, + 0x8964,0x8965,0x8967,0x8968,0x8969,0x896A,0x896B,0x896C, + 0x896D,0x896E,0x896F,0x8970,0x8971,0x8972,0x8973,0x8974, + 0x8975,0x8976,0x8977,0x8978,0x8979,0x897A,0x897C,0x897D, + 0x897E,0x8980,0x8982,0x8984,0x8985,0x8987,0x8988,0x8989, + 0x898A,0x898B,0x898C,0x898D,0x898E,0x898F,0x8990,0x8991, + 0x8992,0x8993,0x8994,0x8995,0x8996,0x8997,0x8998,0x8999, + 0x899A,0x899B,0x899C,0x899D,0x899E,0x899F,0x89A0,0x89A1, + 0x6447,0x5C27,0x9065,0x7A91,0x8C23,0x59DA,0x54AC,0x8200, + 0x836F,0x8981,0x8000,0x6930,0x564E,0x8036,0x7237,0x91CE, + 0x51B6,0x4E5F,0x9875,0x6396,0x4E1A,0x53F6,0x66F3,0x814B, + 0x591C,0x6DB2,0x4E00,0x58F9,0x533B,0x63D6,0x94F1,0x4F9D, + 0x4F0A,0x8863,0x9890,0x5937,0x9057,0x79FB,0x4EEA,0x80F0, + 0x7591,0x6C82,0x5B9C,0x59E8,0x5F5D,0x6905,0x8681,0x501A, + 0x5DF2,0x4E59,0x77E3,0x4EE5,0x827A,0x6291,0x6613,0x9091, + 0x5C79,0x4EBF,0x5F79,0x81C6,0x9038,0x8084,0x75AB,0x4EA6, + 0x88D4,0x610F,0x6BC5,0x5FC6,0x4E49,0x76CA,0x6EA2,0x8BE3, + 0x8BAE,0x8C0A,0x8BD1,0x5F02,0x7FFC,0x7FCC,0x7ECE,0x8335, + 0x836B,0x56E0,0x6BB7,0x97F3,0x9634,0x59FB,0x541F,0x94F6, + 0x6DEB,0x5BC5,0x996E,0x5C39,0x5F15,0x9690, + }, + {0x89A2,0x89A3,0x89A4,0x89A5,0x89A6,0x89A7,0x89A8,0x89A9, + 0x89AA,0x89AB,0x89AC,0x89AD,0x89AE,0x89AF,0x89B0,0x89B1, + 0x89B2,0x89B3,0x89B4,0x89B5,0x89B6,0x89B7,0x89B8,0x89B9, + 0x89BA,0x89BB,0x89BC,0x89BD,0x89BE,0x89BF,0x89C0,0x89C3, + 0x89CD,0x89D3,0x89D4,0x89D5,0x89D7,0x89D8,0x89D9,0x89DB, + 0x89DD,0x89DF,0x89E0,0x89E1,0x89E2,0x89E4,0x89E7,0x89E8, + 0x89E9,0x89EA,0x89EC,0x89ED,0x89EE,0x89F0,0x89F1,0x89F2, + 0x89F4,0x89F5,0x89F6,0x89F7,0x89F8,0x89F9,0x89FA,0x89FB, + 0x89FC,0x89FD,0x89FE,0x89FF,0x8A01,0x8A02,0x8A03,0x8A04, + 0x8A05,0x8A06,0x8A08,0x8A09,0x8A0A,0x8A0B,0x8A0C,0x8A0D, + 0x8A0E,0x8A0F,0x8A10,0x8A11,0x8A12,0x8A13,0x8A14,0x8A15, + 0x8A16,0x8A17,0x8A18,0x8A19,0x8A1A,0x8A1B,0x8A1C,0x8A1D, + 0x5370,0x82F1,0x6A31,0x5A74,0x9E70,0x5E94,0x7F28,0x83B9, + 0x8424,0x8425,0x8367,0x8747,0x8FCE,0x8D62,0x76C8,0x5F71, + 0x9896,0x786C,0x6620,0x54DF,0x62E5,0x4F63,0x81C3,0x75C8, + 0x5EB8,0x96CD,0x8E0A,0x86F9,0x548F,0x6CF3,0x6D8C,0x6C38, + 0x607F,0x52C7,0x7528,0x5E7D,0x4F18,0x60A0,0x5FE7,0x5C24, + 0x7531,0x90AE,0x94C0,0x72B9,0x6CB9,0x6E38,0x9149,0x6709, + 0x53CB,0x53F3,0x4F51,0x91C9,0x8BF1,0x53C8,0x5E7C,0x8FC2, + 0x6DE4,0x4E8E,0x76C2,0x6986,0x865E,0x611A,0x8206,0x4F59, + 0x4FDE,0x903E,0x9C7C,0x6109,0x6E1D,0x6E14,0x9685,0x4E88, + 0x5A31,0x96E8,0x4E0E,0x5C7F,0x79B9,0x5B87,0x8BED,0x7FBD, + 0x7389,0x57DF,0x828B,0x90C1,0x5401,0x9047,0x55BB,0x5CEA, + 0x5FA1,0x6108,0x6B32,0x72F1,0x80B2,0x8A89, + }, + {0x8A1E,0x8A1F,0x8A20,0x8A21,0x8A22,0x8A23,0x8A24,0x8A25, + 0x8A26,0x8A27,0x8A28,0x8A29,0x8A2A,0x8A2B,0x8A2C,0x8A2D, + 0x8A2E,0x8A2F,0x8A30,0x8A31,0x8A32,0x8A33,0x8A34,0x8A35, + 0x8A36,0x8A37,0x8A38,0x8A39,0x8A3A,0x8A3B,0x8A3C,0x8A3D, + 0x8A3F,0x8A40,0x8A41,0x8A42,0x8A43,0x8A44,0x8A45,0x8A46, + 0x8A47,0x8A49,0x8A4A,0x8A4B,0x8A4C,0x8A4D,0x8A4E,0x8A4F, + 0x8A50,0x8A51,0x8A52,0x8A53,0x8A54,0x8A55,0x8A56,0x8A57, + 0x8A58,0x8A59,0x8A5A,0x8A5B,0x8A5C,0x8A5D,0x8A5E,0x8A5F, + 0x8A60,0x8A61,0x8A62,0x8A63,0x8A64,0x8A65,0x8A66,0x8A67, + 0x8A68,0x8A69,0x8A6A,0x8A6B,0x8A6C,0x8A6D,0x8A6E,0x8A6F, + 0x8A70,0x8A71,0x8A72,0x8A73,0x8A74,0x8A75,0x8A76,0x8A77, + 0x8A78,0x8A7A,0x8A7B,0x8A7C,0x8A7D,0x8A7E,0x8A7F,0x8A80, + 0x6D74,0x5BD3,0x88D5,0x9884,0x8C6B,0x9A6D,0x9E33,0x6E0A, + 0x51A4,0x5143,0x57A3,0x8881,0x539F,0x63F4,0x8F95,0x56ED, + 0x5458,0x5706,0x733F,0x6E90,0x7F18,0x8FDC,0x82D1,0x613F, + 0x6028,0x9662,0x66F0,0x7EA6,0x8D8A,0x8DC3,0x94A5,0x5CB3, + 0x7CA4,0x6708,0x60A6,0x9605,0x8018,0x4E91,0x90E7,0x5300, + 0x9668,0x5141,0x8FD0,0x8574,0x915D,0x6655,0x97F5,0x5B55, + 0x531D,0x7838,0x6742,0x683D,0x54C9,0x707E,0x5BB0,0x8F7D, + 0x518D,0x5728,0x54B1,0x6512,0x6682,0x8D5E,0x8D43,0x810F, + 0x846C,0x906D,0x7CDF,0x51FF,0x85FB,0x67A3,0x65E9,0x6FA1, + 0x86A4,0x8E81,0x566A,0x9020,0x7682,0x7076,0x71E5,0x8D23, + 0x62E9,0x5219,0x6CFD,0x8D3C,0x600E,0x589E,0x618E,0x66FE, + 0x8D60,0x624E,0x55B3,0x6E23,0x672D,0x8F67, + }, + {0x8A81,0x8A82,0x8A83,0x8A84,0x8A85,0x8A86,0x8A87,0x8A88, + 0x8A8B,0x8A8C,0x8A8D,0x8A8E,0x8A8F,0x8A90,0x8A91,0x8A92, + 0x8A94,0x8A95,0x8A96,0x8A97,0x8A98,0x8A99,0x8A9A,0x8A9B, + 0x8A9C,0x8A9D,0x8A9E,0x8A9F,0x8AA0,0x8AA1,0x8AA2,0x8AA3, + 0x8AA4,0x8AA5,0x8AA6,0x8AA7,0x8AA8,0x8AA9,0x8AAA,0x8AAB, + 0x8AAC,0x8AAD,0x8AAE,0x8AAF,0x8AB0,0x8AB1,0x8AB2,0x8AB3, + 0x8AB4,0x8AB5,0x8AB6,0x8AB7,0x8AB8,0x8AB9,0x8ABA,0x8ABB, + 0x8ABC,0x8ABD,0x8ABE,0x8ABF,0x8AC0,0x8AC1,0x8AC2,0x8AC3, + 0x8AC4,0x8AC5,0x8AC6,0x8AC7,0x8AC8,0x8AC9,0x8ACA,0x8ACB, + 0x8ACC,0x8ACD,0x8ACE,0x8ACF,0x8AD0,0x8AD1,0x8AD2,0x8AD3, + 0x8AD4,0x8AD5,0x8AD6,0x8AD7,0x8AD8,0x8AD9,0x8ADA,0x8ADB, + 0x8ADC,0x8ADD,0x8ADE,0x8ADF,0x8AE0,0x8AE1,0x8AE2,0x8AE3, + 0x94E1,0x95F8,0x7728,0x6805,0x69A8,0x548B,0x4E4D,0x70B8, + 0x8BC8,0x6458,0x658B,0x5B85,0x7A84,0x503A,0x5BE8,0x77BB, + 0x6BE1,0x8A79,0x7C98,0x6CBE,0x76CF,0x65A9,0x8F97,0x5D2D, + 0x5C55,0x8638,0x6808,0x5360,0x6218,0x7AD9,0x6E5B,0x7EFD, + 0x6A1F,0x7AE0,0x5F70,0x6F33,0x5F20,0x638C,0x6DA8,0x6756, + 0x4E08,0x5E10,0x8D26,0x4ED7,0x80C0,0x7634,0x969C,0x62DB, + 0x662D,0x627E,0x6CBC,0x8D75,0x7167,0x7F69,0x5146,0x8087, + 0x53EC,0x906E,0x6298,0x54F2,0x86F0,0x8F99,0x8005,0x9517, + 0x8517,0x8FD9,0x6D59,0x73CD,0x659F,0x771F,0x7504,0x7827, + 0x81FB,0x8D1E,0x9488,0x4FA6,0x6795,0x75B9,0x8BCA,0x9707, + 0x632F,0x9547,0x9635,0x84B8,0x6323,0x7741,0x5F81,0x72F0, + 0x4E89,0x6014,0x6574,0x62EF,0x6B63,0x653F, + }, + {0x8AE4,0x8AE5,0x8AE6,0x8AE7,0x8AE8,0x8AE9,0x8AEA,0x8AEB, + 0x8AEC,0x8AED,0x8AEE,0x8AEF,0x8AF0,0x8AF1,0x8AF2,0x8AF3, + 0x8AF4,0x8AF5,0x8AF6,0x8AF7,0x8AF8,0x8AF9,0x8AFA,0x8AFB, + 0x8AFC,0x8AFD,0x8AFE,0x8AFF,0x8B00,0x8B01,0x8B02,0x8B03, + 0x8B04,0x8B05,0x8B06,0x8B08,0x8B09,0x8B0A,0x8B0B,0x8B0C, + 0x8B0D,0x8B0E,0x8B0F,0x8B10,0x8B11,0x8B12,0x8B13,0x8B14, + 0x8B15,0x8B16,0x8B17,0x8B18,0x8B19,0x8B1A,0x8B1B,0x8B1C, + 0x8B1D,0x8B1E,0x8B1F,0x8B20,0x8B21,0x8B22,0x8B23,0x8B24, + 0x8B25,0x8B27,0x8B28,0x8B29,0x8B2A,0x8B2B,0x8B2C,0x8B2D, + 0x8B2E,0x8B2F,0x8B30,0x8B31,0x8B32,0x8B33,0x8B34,0x8B35, + 0x8B36,0x8B37,0x8B38,0x8B39,0x8B3A,0x8B3B,0x8B3C,0x8B3D, + 0x8B3E,0x8B3F,0x8B40,0x8B41,0x8B42,0x8B43,0x8B44,0x8B45, + 0x5E27,0x75C7,0x90D1,0x8BC1,0x829D,0x679D,0x652F,0x5431, + 0x8718,0x77E5,0x80A2,0x8102,0x6C41,0x4E4B,0x7EC7,0x804C, + 0x76F4,0x690D,0x6B96,0x6267,0x503C,0x4F84,0x5740,0x6307, + 0x6B62,0x8DBE,0x53EA,0x65E8,0x7EB8,0x5FD7,0x631A,0x63B7, + 0x81F3,0x81F4,0x7F6E,0x5E1C,0x5CD9,0x5236,0x667A,0x79E9, + 0x7A1A,0x8D28,0x7099,0x75D4,0x6EDE,0x6CBB,0x7A92,0x4E2D, + 0x76C5,0x5FE0,0x949F,0x8877,0x7EC8,0x79CD,0x80BF,0x91CD, + 0x4EF2,0x4F17,0x821F,0x5468,0x5DDE,0x6D32,0x8BCC,0x7CA5, + 0x8F74,0x8098,0x5E1A,0x5492,0x76B1,0x5B99,0x663C,0x9AA4, + 0x73E0,0x682A,0x86DB,0x6731,0x732A,0x8BF8,0x8BDB,0x9010, + 0x7AF9,0x70DB,0x716E,0x62C4,0x77A9,0x5631,0x4E3B,0x8457, + 0x67F1,0x52A9,0x86C0,0x8D2E,0x94F8,0x7B51, + }, + {0x8B46,0x8B47,0x8B48,0x8B49,0x8B4A,0x8B4B,0x8B4C,0x8B4D, + 0x8B4E,0x8B4F,0x8B50,0x8B51,0x8B52,0x8B53,0x8B54,0x8B55, + 0x8B56,0x8B57,0x8B58,0x8B59,0x8B5A,0x8B5B,0x8B5C,0x8B5D, + 0x8B5E,0x8B5F,0x8B60,0x8B61,0x8B62,0x8B63,0x8B64,0x8B65, + 0x8B67,0x8B68,0x8B69,0x8B6A,0x8B6B,0x8B6D,0x8B6E,0x8B6F, + 0x8B70,0x8B71,0x8B72,0x8B73,0x8B74,0x8B75,0x8B76,0x8B77, + 0x8B78,0x8B79,0x8B7A,0x8B7B,0x8B7C,0x8B7D,0x8B7E,0x8B7F, + 0x8B80,0x8B81,0x8B82,0x8B83,0x8B84,0x8B85,0x8B86,0x8B87, + 0x8B88,0x8B89,0x8B8A,0x8B8B,0x8B8C,0x8B8D,0x8B8E,0x8B8F, + 0x8B90,0x8B91,0x8B92,0x8B93,0x8B94,0x8B95,0x8B96,0x8B97, + 0x8B98,0x8B99,0x8B9A,0x8B9B,0x8B9C,0x8B9D,0x8B9E,0x8B9F, + 0x8BAC,0x8BB1,0x8BBB,0x8BC7,0x8BD0,0x8BEA,0x8C09,0x8C1E, + 0x4F4F,0x6CE8,0x795D,0x9A7B,0x6293,0x722A,0x62FD,0x4E13, + 0x7816,0x8F6C,0x64B0,0x8D5A,0x7BC6,0x6869,0x5E84,0x88C5, + 0x5986,0x649E,0x58EE,0x72B6,0x690E,0x9525,0x8FFD,0x8D58, + 0x5760,0x7F00,0x8C06,0x51C6,0x6349,0x62D9,0x5353,0x684C, + 0x7422,0x8301,0x914C,0x5544,0x7740,0x707C,0x6D4A,0x5179, + 0x54A8,0x8D44,0x59FF,0x6ECB,0x6DC4,0x5B5C,0x7D2B,0x4ED4, + 0x7C7D,0x6ED3,0x5B50,0x81EA,0x6E0D,0x5B57,0x9B03,0x68D5, + 0x8E2A,0x5B97,0x7EFC,0x603B,0x7EB5,0x90B9,0x8D70,0x594F, + 0x63CD,0x79DF,0x8DB3,0x5352,0x65CF,0x7956,0x8BC5,0x963B, + 0x7EC4,0x94BB,0x7E82,0x5634,0x9189,0x6700,0x7F6A,0x5C0A, + 0x9075,0x6628,0x5DE6,0x4F50,0x67DE,0x505A,0x4F5C,0x5750, + 0x5EA7,0xE810,0xE811,0xE812,0xE813,0xE814, + }, + {0x8C38,0x8C39,0x8C3A,0x8C3B,0x8C3C,0x8C3D,0x8C3E,0x8C3F, + 0x8C40,0x8C42,0x8C43,0x8C44,0x8C45,0x8C48,0x8C4A,0x8C4B, + 0x8C4D,0x8C4E,0x8C4F,0x8C50,0x8C51,0x8C52,0x8C53,0x8C54, + 0x8C56,0x8C57,0x8C58,0x8C59,0x8C5B,0x8C5C,0x8C5D,0x8C5E, + 0x8C5F,0x8C60,0x8C63,0x8C64,0x8C65,0x8C66,0x8C67,0x8C68, + 0x8C69,0x8C6C,0x8C6D,0x8C6E,0x8C6F,0x8C70,0x8C71,0x8C72, + 0x8C74,0x8C75,0x8C76,0x8C77,0x8C7B,0x8C7C,0x8C7D,0x8C7E, + 0x8C7F,0x8C80,0x8C81,0x8C83,0x8C84,0x8C86,0x8C87,0x8C88, + 0x8C8B,0x8C8D,0x8C8E,0x8C8F,0x8C90,0x8C91,0x8C92,0x8C93, + 0x8C95,0x8C96,0x8C97,0x8C99,0x8C9A,0x8C9B,0x8C9C,0x8C9D, + 0x8C9E,0x8C9F,0x8CA0,0x8CA1,0x8CA2,0x8CA3,0x8CA4,0x8CA5, + 0x8CA6,0x8CA7,0x8CA8,0x8CA9,0x8CAA,0x8CAB,0x8CAC,0x8CAD, + 0x4E8D,0x4E0C,0x5140,0x4E10,0x5EFF,0x5345,0x4E15,0x4E98, + 0x4E1E,0x9B32,0x5B6C,0x5669,0x4E28,0x79BA,0x4E3F,0x5315, + 0x4E47,0x592D,0x723B,0x536E,0x6C10,0x56DF,0x80E4,0x9997, + 0x6BD3,0x777E,0x9F17,0x4E36,0x4E9F,0x9F10,0x4E5C,0x4E69, + 0x4E93,0x8288,0x5B5B,0x556C,0x560F,0x4EC4,0x538D,0x539D, + 0x53A3,0x53A5,0x53AE,0x9765,0x8D5D,0x531A,0x53F5,0x5326, + 0x532E,0x533E,0x8D5C,0x5366,0x5363,0x5202,0x5208,0x520E, + 0x522D,0x5233,0x523F,0x5240,0x524C,0x525E,0x5261,0x525C, + 0x84AF,0x527D,0x5282,0x5281,0x5290,0x5293,0x5182,0x7F54, + 0x4EBB,0x4EC3,0x4EC9,0x4EC2,0x4EE8,0x4EE1,0x4EEB,0x4EDE, + 0x4F1B,0x4EF3,0x4F22,0x4F64,0x4EF5,0x4F25,0x4F27,0x4F09, + 0x4F2B,0x4F5E,0x4F67,0x6538,0x4F5A,0x4F5D, + }, + {0x8CAE,0x8CAF,0x8CB0,0x8CB1,0x8CB2,0x8CB3,0x8CB4,0x8CB5, + 0x8CB6,0x8CB7,0x8CB8,0x8CB9,0x8CBA,0x8CBB,0x8CBC,0x8CBD, + 0x8CBE,0x8CBF,0x8CC0,0x8CC1,0x8CC2,0x8CC3,0x8CC4,0x8CC5, + 0x8CC6,0x8CC7,0x8CC8,0x8CC9,0x8CCA,0x8CCB,0x8CCC,0x8CCD, + 0x8CCE,0x8CCF,0x8CD0,0x8CD1,0x8CD2,0x8CD3,0x8CD4,0x8CD5, + 0x8CD6,0x8CD7,0x8CD8,0x8CD9,0x8CDA,0x8CDB,0x8CDC,0x8CDD, + 0x8CDE,0x8CDF,0x8CE0,0x8CE1,0x8CE2,0x8CE3,0x8CE4,0x8CE5, + 0x8CE6,0x8CE7,0x8CE8,0x8CE9,0x8CEA,0x8CEB,0x8CEC,0x8CED, + 0x8CEE,0x8CEF,0x8CF0,0x8CF1,0x8CF2,0x8CF3,0x8CF4,0x8CF5, + 0x8CF6,0x8CF7,0x8CF8,0x8CF9,0x8CFA,0x8CFB,0x8CFC,0x8CFD, + 0x8CFE,0x8CFF,0x8D00,0x8D01,0x8D02,0x8D03,0x8D04,0x8D05, + 0x8D06,0x8D07,0x8D08,0x8D09,0x8D0A,0x8D0B,0x8D0C,0x8D0D, + 0x4F5F,0x4F57,0x4F32,0x4F3D,0x4F76,0x4F74,0x4F91,0x4F89, + 0x4F83,0x4F8F,0x4F7E,0x4F7B,0x4FAA,0x4F7C,0x4FAC,0x4F94, + 0x4FE6,0x4FE8,0x4FEA,0x4FC5,0x4FDA,0x4FE3,0x4FDC,0x4FD1, + 0x4FDF,0x4FF8,0x5029,0x504C,0x4FF3,0x502C,0x500F,0x502E, + 0x502D,0x4FFE,0x501C,0x500C,0x5025,0x5028,0x507E,0x5043, + 0x5055,0x5048,0x504E,0x506C,0x507B,0x50A5,0x50A7,0x50A9, + 0x50BA,0x50D6,0x5106,0x50ED,0x50EC,0x50E6,0x50EE,0x5107, + 0x510B,0x4EDD,0x6C3D,0x4F58,0x4F65,0x4FCE,0x9FA0,0x6C46, + 0x7C74,0x516E,0x5DFD,0x9EC9,0x9998,0x5181,0x5914,0x52F9, + 0x530D,0x8A07,0x5310,0x51EB,0x5919,0x5155,0x4EA0,0x5156, + 0x4EB3,0x886E,0x88A4,0x4EB5,0x8114,0x88D2,0x7980,0x5B34, + 0x8803,0x7FB8,0x51AB,0x51B1,0x51BD,0x51BC, + }, + {0x8D0E,0x8D0F,0x8D10,0x8D11,0x8D12,0x8D13,0x8D14,0x8D15, + 0x8D16,0x8D17,0x8D18,0x8D19,0x8D1A,0x8D1B,0x8D1C,0x8D20, + 0x8D51,0x8D52,0x8D57,0x8D5F,0x8D65,0x8D68,0x8D69,0x8D6A, + 0x8D6C,0x8D6E,0x8D6F,0x8D71,0x8D72,0x8D78,0x8D79,0x8D7A, + 0x8D7B,0x8D7C,0x8D7D,0x8D7E,0x8D7F,0x8D80,0x8D82,0x8D83, + 0x8D86,0x8D87,0x8D88,0x8D89,0x8D8C,0x8D8D,0x8D8E,0x8D8F, + 0x8D90,0x8D92,0x8D93,0x8D95,0x8D96,0x8D97,0x8D98,0x8D99, + 0x8D9A,0x8D9B,0x8D9C,0x8D9D,0x8D9E,0x8DA0,0x8DA1,0x8DA2, + 0x8DA4,0x8DA5,0x8DA6,0x8DA7,0x8DA8,0x8DA9,0x8DAA,0x8DAB, + 0x8DAC,0x8DAD,0x8DAE,0x8DAF,0x8DB0,0x8DB2,0x8DB6,0x8DB7, + 0x8DB9,0x8DBB,0x8DBD,0x8DC0,0x8DC1,0x8DC2,0x8DC5,0x8DC7, + 0x8DC8,0x8DC9,0x8DCA,0x8DCD,0x8DD0,0x8DD2,0x8DD3,0x8DD4, + 0x51C7,0x5196,0x51A2,0x51A5,0x8BA0,0x8BA6,0x8BA7,0x8BAA, + 0x8BB4,0x8BB5,0x8BB7,0x8BC2,0x8BC3,0x8BCB,0x8BCF,0x8BCE, + 0x8BD2,0x8BD3,0x8BD4,0x8BD6,0x8BD8,0x8BD9,0x8BDC,0x8BDF, + 0x8BE0,0x8BE4,0x8BE8,0x8BE9,0x8BEE,0x8BF0,0x8BF3,0x8BF6, + 0x8BF9,0x8BFC,0x8BFF,0x8C00,0x8C02,0x8C04,0x8C07,0x8C0C, + 0x8C0F,0x8C11,0x8C12,0x8C14,0x8C15,0x8C16,0x8C19,0x8C1B, + 0x8C18,0x8C1D,0x8C1F,0x8C20,0x8C21,0x8C25,0x8C27,0x8C2A, + 0x8C2B,0x8C2E,0x8C2F,0x8C32,0x8C33,0x8C35,0x8C36,0x5369, + 0x537A,0x961D,0x9622,0x9621,0x9631,0x962A,0x963D,0x963C, + 0x9642,0x9649,0x9654,0x965F,0x9667,0x966C,0x9672,0x9674, + 0x9688,0x968D,0x9697,0x96B0,0x9097,0x909B,0x909D,0x9099, + 0x90AC,0x90A1,0x90B4,0x90B3,0x90B6,0x90BA, + }, + {0x8DD5,0x8DD8,0x8DD9,0x8DDC,0x8DE0,0x8DE1,0x8DE2,0x8DE5, + 0x8DE6,0x8DE7,0x8DE9,0x8DED,0x8DEE,0x8DF0,0x8DF1,0x8DF2, + 0x8DF4,0x8DF6,0x8DFC,0x8DFE,0x8DFF,0x8E00,0x8E01,0x8E02, + 0x8E03,0x8E04,0x8E06,0x8E07,0x8E08,0x8E0B,0x8E0D,0x8E0E, + 0x8E10,0x8E11,0x8E12,0x8E13,0x8E15,0x8E16,0x8E17,0x8E18, + 0x8E19,0x8E1A,0x8E1B,0x8E1C,0x8E20,0x8E21,0x8E24,0x8E25, + 0x8E26,0x8E27,0x8E28,0x8E2B,0x8E2D,0x8E30,0x8E32,0x8E33, + 0x8E34,0x8E36,0x8E37,0x8E38,0x8E3B,0x8E3C,0x8E3E,0x8E3F, + 0x8E43,0x8E45,0x8E46,0x8E4C,0x8E4D,0x8E4E,0x8E4F,0x8E50, + 0x8E53,0x8E54,0x8E55,0x8E56,0x8E57,0x8E58,0x8E5A,0x8E5B, + 0x8E5C,0x8E5D,0x8E5E,0x8E5F,0x8E60,0x8E61,0x8E62,0x8E63, + 0x8E64,0x8E65,0x8E67,0x8E68,0x8E6A,0x8E6B,0x8E6E,0x8E71, + 0x90B8,0x90B0,0x90CF,0x90C5,0x90BE,0x90D0,0x90C4,0x90C7, + 0x90D3,0x90E6,0x90E2,0x90DC,0x90D7,0x90DB,0x90EB,0x90EF, + 0x90FE,0x9104,0x9122,0x911E,0x9123,0x9131,0x912F,0x9139, + 0x9143,0x9146,0x520D,0x5942,0x52A2,0x52AC,0x52AD,0x52BE, + 0x54FF,0x52D0,0x52D6,0x52F0,0x53DF,0x71EE,0x77CD,0x5EF4, + 0x51F5,0x51FC,0x9B2F,0x53B6,0x5F01,0x755A,0x5DEF,0x574C, + 0x57A9,0x57A1,0x587E,0x58BC,0x58C5,0x58D1,0x5729,0x572C, + 0x572A,0x5733,0x5739,0x572E,0x572F,0x575C,0x573B,0x5742, + 0x5769,0x5785,0x576B,0x5786,0x577C,0x577B,0x5768,0x576D, + 0x5776,0x5773,0x57AD,0x57A4,0x578C,0x57B2,0x57CF,0x57A7, + 0x57B4,0x5793,0x57A0,0x57D5,0x57D8,0x57DA,0x57D9,0x57D2, + 0x57B8,0x57F4,0x57EF,0x57F8,0x57E4,0x57DD, + }, + {0x8E73,0x8E75,0x8E77,0x8E78,0x8E79,0x8E7A,0x8E7B,0x8E7D, + 0x8E7E,0x8E80,0x8E82,0x8E83,0x8E84,0x8E86,0x8E88,0x8E89, + 0x8E8A,0x8E8B,0x8E8C,0x8E8D,0x8E8E,0x8E91,0x8E92,0x8E93, + 0x8E95,0x8E96,0x8E97,0x8E98,0x8E99,0x8E9A,0x8E9B,0x8E9D, + 0x8E9F,0x8EA0,0x8EA1,0x8EA2,0x8EA3,0x8EA4,0x8EA5,0x8EA6, + 0x8EA7,0x8EA8,0x8EA9,0x8EAA,0x8EAD,0x8EAE,0x8EB0,0x8EB1, + 0x8EB3,0x8EB4,0x8EB5,0x8EB6,0x8EB7,0x8EB8,0x8EB9,0x8EBB, + 0x8EBC,0x8EBD,0x8EBE,0x8EBF,0x8EC0,0x8EC1,0x8EC2,0x8EC3, + 0x8EC4,0x8EC5,0x8EC6,0x8EC7,0x8EC8,0x8EC9,0x8ECA,0x8ECB, + 0x8ECC,0x8ECD,0x8ECF,0x8ED0,0x8ED1,0x8ED2,0x8ED3,0x8ED4, + 0x8ED5,0x8ED6,0x8ED7,0x8ED8,0x8ED9,0x8EDA,0x8EDB,0x8EDC, + 0x8EDD,0x8EDE,0x8EDF,0x8EE0,0x8EE1,0x8EE2,0x8EE3,0x8EE4, + 0x580B,0x580D,0x57FD,0x57ED,0x5800,0x581E,0x5819,0x5844, + 0x5820,0x5865,0x586C,0x5881,0x5889,0x589A,0x5880,0x99A8, + 0x9F19,0x61FF,0x8279,0x827D,0x827F,0x828F,0x828A,0x82A8, + 0x8284,0x828E,0x8291,0x8297,0x8299,0x82AB,0x82B8,0x82BE, + 0x82B0,0x82C8,0x82CA,0x82E3,0x8298,0x82B7,0x82AE,0x82CB, + 0x82CC,0x82C1,0x82A9,0x82B4,0x82A1,0x82AA,0x829F,0x82C4, + 0x82CE,0x82A4,0x82E1,0x8309,0x82F7,0x82E4,0x830F,0x8307, + 0x82DC,0x82F4,0x82D2,0x82D8,0x830C,0x82FB,0x82D3,0x8311, + 0x831A,0x8306,0x8314,0x8315,0x82E0,0x82D5,0x831C,0x8351, + 0x835B,0x835C,0x8308,0x8392,0x833C,0x8334,0x8331,0x839B, + 0x835E,0x832F,0x834F,0x8347,0x8343,0x835F,0x8340,0x8317, + 0x8360,0x832D,0x833A,0x8333,0x8366,0x8365, + }, + {0x8EE5,0x8EE6,0x8EE7,0x8EE8,0x8EE9,0x8EEA,0x8EEB,0x8EEC, + 0x8EED,0x8EEE,0x8EEF,0x8EF0,0x8EF1,0x8EF2,0x8EF3,0x8EF4, + 0x8EF5,0x8EF6,0x8EF7,0x8EF8,0x8EF9,0x8EFA,0x8EFB,0x8EFC, + 0x8EFD,0x8EFE,0x8EFF,0x8F00,0x8F01,0x8F02,0x8F03,0x8F04, + 0x8F05,0x8F06,0x8F07,0x8F08,0x8F09,0x8F0A,0x8F0B,0x8F0C, + 0x8F0D,0x8F0E,0x8F0F,0x8F10,0x8F11,0x8F12,0x8F13,0x8F14, + 0x8F15,0x8F16,0x8F17,0x8F18,0x8F19,0x8F1A,0x8F1B,0x8F1C, + 0x8F1D,0x8F1E,0x8F1F,0x8F20,0x8F21,0x8F22,0x8F23,0x8F24, + 0x8F25,0x8F26,0x8F27,0x8F28,0x8F29,0x8F2A,0x8F2B,0x8F2C, + 0x8F2D,0x8F2E,0x8F2F,0x8F30,0x8F31,0x8F32,0x8F33,0x8F34, + 0x8F35,0x8F36,0x8F37,0x8F38,0x8F39,0x8F3A,0x8F3B,0x8F3C, + 0x8F3D,0x8F3E,0x8F3F,0x8F40,0x8F41,0x8F42,0x8F43,0x8F44, + 0x8368,0x831B,0x8369,0x836C,0x836A,0x836D,0x836E,0x83B0, + 0x8378,0x83B3,0x83B4,0x83A0,0x83AA,0x8393,0x839C,0x8385, + 0x837C,0x83B6,0x83A9,0x837D,0x83B8,0x837B,0x8398,0x839E, + 0x83A8,0x83BA,0x83BC,0x83C1,0x8401,0x83E5,0x83D8,0x5807, + 0x8418,0x840B,0x83DD,0x83FD,0x83D6,0x841C,0x8438,0x8411, + 0x8406,0x83D4,0x83DF,0x840F,0x8403,0x83F8,0x83F9,0x83EA, + 0x83C5,0x83C0,0x8426,0x83F0,0x83E1,0x845C,0x8451,0x845A, + 0x8459,0x8473,0x8487,0x8488,0x847A,0x8489,0x8478,0x843C, + 0x8446,0x8469,0x8476,0x848C,0x848E,0x8431,0x846D,0x84C1, + 0x84CD,0x84D0,0x84E6,0x84BD,0x84D3,0x84CA,0x84BF,0x84BA, + 0x84E0,0x84A1,0x84B9,0x84B4,0x8497,0x84E5,0x84E3,0x850C, + 0x750D,0x8538,0x84F0,0x8539,0x851F,0x853A, + }, + {0x8F45,0x8F46,0x8F47,0x8F48,0x8F49,0x8F4A,0x8F4B,0x8F4C, + 0x8F4D,0x8F4E,0x8F4F,0x8F50,0x8F51,0x8F52,0x8F53,0x8F54, + 0x8F55,0x8F56,0x8F57,0x8F58,0x8F59,0x8F5A,0x8F5B,0x8F5C, + 0x8F5D,0x8F5E,0x8F5F,0x8F60,0x8F61,0x8F62,0x8F63,0x8F64, + 0x8F65,0x8F6A,0x8F80,0x8F8C,0x8F92,0x8F9D,0x8FA0,0x8FA1, + 0x8FA2,0x8FA4,0x8FA5,0x8FA6,0x8FA7,0x8FAA,0x8FAC,0x8FAD, + 0x8FAE,0x8FAF,0x8FB2,0x8FB3,0x8FB4,0x8FB5,0x8FB7,0x8FB8, + 0x8FBA,0x8FBB,0x8FBC,0x8FBF,0x8FC0,0x8FC3,0x8FC6,0x8FC9, + 0x8FCA,0x8FCB,0x8FCC,0x8FCD,0x8FCF,0x8FD2,0x8FD6,0x8FD7, + 0x8FDA,0x8FE0,0x8FE1,0x8FE3,0x8FE7,0x8FEC,0x8FEF,0x8FF1, + 0x8FF2,0x8FF4,0x8FF5,0x8FF6,0x8FFA,0x8FFB,0x8FFC,0x8FFE, + 0x8FFF,0x9007,0x9008,0x900C,0x900E,0x9013,0x9015,0x9018, + 0x8556,0x853B,0x84FF,0x84FC,0x8559,0x8548,0x8568,0x8564, + 0x855E,0x857A,0x77A2,0x8543,0x8572,0x857B,0x85A4,0x85A8, + 0x8587,0x858F,0x8579,0x85AE,0x859C,0x8585,0x85B9,0x85B7, + 0x85B0,0x85D3,0x85C1,0x85DC,0x85FF,0x8627,0x8605,0x8629, + 0x8616,0x863C,0x5EFE,0x5F08,0x593C,0x5941,0x8037,0x5955, + 0x595A,0x5958,0x530F,0x5C22,0x5C25,0x5C2C,0x5C34,0x624C, + 0x626A,0x629F,0x62BB,0x62CA,0x62DA,0x62D7,0x62EE,0x6322, + 0x62F6,0x6339,0x634B,0x6343,0x63AD,0x63F6,0x6371,0x637A, + 0x638E,0x63B4,0x636D,0x63AC,0x638A,0x6369,0x63AE,0x63BC, + 0x63F2,0x63F8,0x63E0,0x63FF,0x63C4,0x63DE,0x63CE,0x6452, + 0x63C6,0x63BE,0x6445,0x6441,0x640B,0x641B,0x6420,0x640C, + 0x6426,0x6421,0x645E,0x6484,0x646D,0x6496, + }, + {0x9019,0x901C,0x9023,0x9024,0x9025,0x9027,0x9028,0x9029, + 0x902A,0x902B,0x902C,0x9030,0x9031,0x9032,0x9033,0x9034, + 0x9037,0x9039,0x903A,0x903D,0x903F,0x9040,0x9043,0x9045, + 0x9046,0x9048,0x9049,0x904A,0x904B,0x904C,0x904E,0x9054, + 0x9055,0x9056,0x9059,0x905A,0x905C,0x905D,0x905E,0x905F, + 0x9060,0x9061,0x9064,0x9066,0x9067,0x9069,0x906A,0x906B, + 0x906C,0x906F,0x9070,0x9071,0x9072,0x9073,0x9076,0x9077, + 0x9078,0x9079,0x907A,0x907B,0x907C,0x907E,0x9081,0x9084, + 0x9085,0x9086,0x9087,0x9089,0x908A,0x908C,0x908D,0x908E, + 0x908F,0x9090,0x9092,0x9094,0x9096,0x9098,0x909A,0x909C, + 0x909E,0x909F,0x90A0,0x90A4,0x90A5,0x90A7,0x90A8,0x90A9, + 0x90AB,0x90AD,0x90B2,0x90B7,0x90BC,0x90BD,0x90BF,0x90C0, + 0x647A,0x64B7,0x64B8,0x6499,0x64BA,0x64C0,0x64D0,0x64D7, + 0x64E4,0x64E2,0x6509,0x6525,0x652E,0x5F0B,0x5FD2,0x7519, + 0x5F11,0x535F,0x53F1,0x53FD,0x53E9,0x53E8,0x53FB,0x5412, + 0x5416,0x5406,0x544B,0x5452,0x5453,0x5454,0x5456,0x5443, + 0x5421,0x5457,0x5459,0x5423,0x5432,0x5482,0x5494,0x5477, + 0x5471,0x5464,0x549A,0x549B,0x5484,0x5476,0x5466,0x549D, + 0x54D0,0x54AD,0x54C2,0x54B4,0x54D2,0x54A7,0x54A6,0x54D3, + 0x54D4,0x5472,0x54A3,0x54D5,0x54BB,0x54BF,0x54CC,0x54D9, + 0x54DA,0x54DC,0x54A9,0x54AA,0x54A4,0x54DD,0x54CF,0x54DE, + 0x551B,0x54E7,0x5520,0x54FD,0x5514,0x54F3,0x5522,0x5523, + 0x550F,0x5511,0x5527,0x552A,0x5567,0x558F,0x55B5,0x5549, + 0x556D,0x5541,0x5555,0x553F,0x5550,0x553C, + }, + {0x90C2,0x90C3,0x90C6,0x90C8,0x90C9,0x90CB,0x90CC,0x90CD, + 0x90D2,0x90D4,0x90D5,0x90D6,0x90D8,0x90D9,0x90DA,0x90DE, + 0x90DF,0x90E0,0x90E3,0x90E4,0x90E5,0x90E9,0x90EA,0x90EC, + 0x90EE,0x90F0,0x90F1,0x90F2,0x90F3,0x90F5,0x90F6,0x90F7, + 0x90F9,0x90FA,0x90FB,0x90FC,0x90FF,0x9100,0x9101,0x9103, + 0x9105,0x9106,0x9107,0x9108,0x9109,0x910A,0x910B,0x910C, + 0x910D,0x910E,0x910F,0x9110,0x9111,0x9112,0x9113,0x9114, + 0x9115,0x9116,0x9117,0x9118,0x911A,0x911B,0x911C,0x911D, + 0x911F,0x9120,0x9121,0x9124,0x9125,0x9126,0x9127,0x9128, + 0x9129,0x912A,0x912B,0x912C,0x912D,0x912E,0x9130,0x9132, + 0x9133,0x9134,0x9135,0x9136,0x9137,0x9138,0x913A,0x913B, + 0x913C,0x913D,0x913E,0x913F,0x9140,0x9141,0x9142,0x9144, + 0x5537,0x5556,0x5575,0x5576,0x5577,0x5533,0x5530,0x555C, + 0x558B,0x55D2,0x5583,0x55B1,0x55B9,0x5588,0x5581,0x559F, + 0x557E,0x55D6,0x5591,0x557B,0x55DF,0x55BD,0x55BE,0x5594, + 0x5599,0x55EA,0x55F7,0x55C9,0x561F,0x55D1,0x55EB,0x55EC, + 0x55D4,0x55E6,0x55DD,0x55C4,0x55EF,0x55E5,0x55F2,0x55F3, + 0x55CC,0x55CD,0x55E8,0x55F5,0x55E4,0x8F94,0x561E,0x5608, + 0x560C,0x5601,0x5624,0x5623,0x55FE,0x5600,0x5627,0x562D, + 0x5658,0x5639,0x5657,0x562C,0x564D,0x5662,0x5659,0x565C, + 0x564C,0x5654,0x5686,0x5664,0x5671,0x566B,0x567B,0x567C, + 0x5685,0x5693,0x56AF,0x56D4,0x56D7,0x56DD,0x56E1,0x56F5, + 0x56EB,0x56F9,0x56FF,0x5704,0x570A,0x5709,0x571C,0x5E0F, + 0x5E19,0x5E14,0x5E11,0x5E31,0x5E3B,0x5E3C, + }, + {0x9145,0x9147,0x9148,0x9151,0x9153,0x9154,0x9155,0x9156, + 0x9158,0x9159,0x915B,0x915C,0x915F,0x9160,0x9166,0x9167, + 0x9168,0x916B,0x916D,0x9173,0x917A,0x917B,0x917C,0x9180, + 0x9181,0x9182,0x9183,0x9184,0x9186,0x9188,0x918A,0x918E, + 0x918F,0x9193,0x9194,0x9195,0x9196,0x9197,0x9198,0x9199, + 0x919C,0x919D,0x919E,0x919F,0x91A0,0x91A1,0x91A4,0x91A5, + 0x91A6,0x91A7,0x91A8,0x91A9,0x91AB,0x91AC,0x91B0,0x91B1, + 0x91B2,0x91B3,0x91B6,0x91B7,0x91B8,0x91B9,0x91BB,0x91BC, + 0x91BD,0x91BE,0x91BF,0x91C0,0x91C1,0x91C2,0x91C3,0x91C4, + 0x91C5,0x91C6,0x91C8,0x91CB,0x91D0,0x91D2,0x91D3,0x91D4, + 0x91D5,0x91D6,0x91D7,0x91D8,0x91D9,0x91DA,0x91DB,0x91DD, + 0x91DE,0x91DF,0x91E0,0x91E1,0x91E2,0x91E3,0x91E4,0x91E5, + 0x5E37,0x5E44,0x5E54,0x5E5B,0x5E5E,0x5E61,0x5C8C,0x5C7A, + 0x5C8D,0x5C90,0x5C96,0x5C88,0x5C98,0x5C99,0x5C91,0x5C9A, + 0x5C9C,0x5CB5,0x5CA2,0x5CBD,0x5CAC,0x5CAB,0x5CB1,0x5CA3, + 0x5CC1,0x5CB7,0x5CC4,0x5CD2,0x5CE4,0x5CCB,0x5CE5,0x5D02, + 0x5D03,0x5D27,0x5D26,0x5D2E,0x5D24,0x5D1E,0x5D06,0x5D1B, + 0x5D58,0x5D3E,0x5D34,0x5D3D,0x5D6C,0x5D5B,0x5D6F,0x5D5D, + 0x5D6B,0x5D4B,0x5D4A,0x5D69,0x5D74,0x5D82,0x5D99,0x5D9D, + 0x8C73,0x5DB7,0x5DC5,0x5F73,0x5F77,0x5F82,0x5F87,0x5F89, + 0x5F8C,0x5F95,0x5F99,0x5F9C,0x5FA8,0x5FAD,0x5FB5,0x5FBC, + 0x8862,0x5F61,0x72AD,0x72B0,0x72B4,0x72B7,0x72B8,0x72C3, + 0x72C1,0x72CE,0x72CD,0x72D2,0x72E8,0x72EF,0x72E9,0x72F2, + 0x72F4,0x72F7,0x7301,0x72F3,0x7303,0x72FA, + }, + {0x91E6,0x91E7,0x91E8,0x91E9,0x91EA,0x91EB,0x91EC,0x91ED, + 0x91EE,0x91EF,0x91F0,0x91F1,0x91F2,0x91F3,0x91F4,0x91F5, + 0x91F6,0x91F7,0x91F8,0x91F9,0x91FA,0x91FB,0x91FC,0x91FD, + 0x91FE,0x91FF,0x9200,0x9201,0x9202,0x9203,0x9204,0x9205, + 0x9206,0x9207,0x9208,0x9209,0x920A,0x920B,0x920C,0x920D, + 0x920E,0x920F,0x9210,0x9211,0x9212,0x9213,0x9214,0x9215, + 0x9216,0x9217,0x9218,0x9219,0x921A,0x921B,0x921C,0x921D, + 0x921E,0x921F,0x9220,0x9221,0x9222,0x9223,0x9224,0x9225, + 0x9226,0x9227,0x9228,0x9229,0x922A,0x922B,0x922C,0x922D, + 0x922E,0x922F,0x9230,0x9231,0x9232,0x9233,0x9234,0x9235, + 0x9236,0x9237,0x9238,0x9239,0x923A,0x923B,0x923C,0x923D, + 0x923E,0x923F,0x9240,0x9241,0x9242,0x9243,0x9244,0x9245, + 0x72FB,0x7317,0x7313,0x7321,0x730A,0x731E,0x731D,0x7315, + 0x7322,0x7339,0x7325,0x732C,0x7338,0x7331,0x7350,0x734D, + 0x7357,0x7360,0x736C,0x736F,0x737E,0x821B,0x5925,0x98E7, + 0x5924,0x5902,0x9963,0x9967,0x9968,0x9969,0x996A,0x996B, + 0x996C,0x9974,0x9977,0x997D,0x9980,0x9984,0x9987,0x998A, + 0x998D,0x9990,0x9991,0x9993,0x9994,0x9995,0x5E80,0x5E91, + 0x5E8B,0x5E96,0x5EA5,0x5EA0,0x5EB9,0x5EB5,0x5EBE,0x5EB3, + 0x8D53,0x5ED2,0x5ED1,0x5EDB,0x5EE8,0x5EEA,0x81BA,0x5FC4, + 0x5FC9,0x5FD6,0x5FCF,0x6003,0x5FEE,0x6004,0x5FE1,0x5FE4, + 0x5FFE,0x6005,0x6006,0x5FEA,0x5FED,0x5FF8,0x6019,0x6035, + 0x6026,0x601B,0x600F,0x600D,0x6029,0x602B,0x600A,0x603F, + 0x6021,0x6078,0x6079,0x607B,0x607A,0x6042, + }, + {0x9246,0x9247,0x9248,0x9249,0x924A,0x924B,0x924C,0x924D, + 0x924E,0x924F,0x9250,0x9251,0x9252,0x9253,0x9254,0x9255, + 0x9256,0x9257,0x9258,0x9259,0x925A,0x925B,0x925C,0x925D, + 0x925E,0x925F,0x9260,0x9261,0x9262,0x9263,0x9264,0x9265, + 0x9266,0x9267,0x9268,0x9269,0x926A,0x926B,0x926C,0x926D, + 0x926E,0x926F,0x9270,0x9271,0x9272,0x9273,0x9275,0x9276, + 0x9277,0x9278,0x9279,0x927A,0x927B,0x927C,0x927D,0x927E, + 0x927F,0x9280,0x9281,0x9282,0x9283,0x9284,0x9285,0x9286, + 0x9287,0x9288,0x9289,0x928A,0x928B,0x928C,0x928D,0x928F, + 0x9290,0x9291,0x9292,0x9293,0x9294,0x9295,0x9296,0x9297, + 0x9298,0x9299,0x929A,0x929B,0x929C,0x929D,0x929E,0x929F, + 0x92A0,0x92A1,0x92A2,0x92A3,0x92A4,0x92A5,0x92A6,0x92A7, + 0x606A,0x607D,0x6096,0x609A,0x60AD,0x609D,0x6083,0x6092, + 0x608C,0x609B,0x60EC,0x60BB,0x60B1,0x60DD,0x60D8,0x60C6, + 0x60DA,0x60B4,0x6120,0x6126,0x6115,0x6123,0x60F4,0x6100, + 0x610E,0x612B,0x614A,0x6175,0x61AC,0x6194,0x61A7,0x61B7, + 0x61D4,0x61F5,0x5FDD,0x96B3,0x95E9,0x95EB,0x95F1,0x95F3, + 0x95F5,0x95F6,0x95FC,0x95FE,0x9603,0x9604,0x9606,0x9608, + 0x960A,0x960B,0x960C,0x960D,0x960F,0x9612,0x9615,0x9616, + 0x9617,0x9619,0x961A,0x4E2C,0x723F,0x6215,0x6C35,0x6C54, + 0x6C5C,0x6C4A,0x6CA3,0x6C85,0x6C90,0x6C94,0x6C8C,0x6C68, + 0x6C69,0x6C74,0x6C76,0x6C86,0x6CA9,0x6CD0,0x6CD4,0x6CAD, + 0x6CF7,0x6CF8,0x6CF1,0x6CD7,0x6CB2,0x6CE0,0x6CD6,0x6CFA, + 0x6CEB,0x6CEE,0x6CB1,0x6CD3,0x6CEF,0x6CFE, + }, + {0x92A8,0x92A9,0x92AA,0x92AB,0x92AC,0x92AD,0x92AF,0x92B0, + 0x92B1,0x92B2,0x92B3,0x92B4,0x92B5,0x92B6,0x92B7,0x92B8, + 0x92B9,0x92BA,0x92BB,0x92BC,0x92BD,0x92BE,0x92BF,0x92C0, + 0x92C1,0x92C2,0x92C3,0x92C4,0x92C5,0x92C6,0x92C7,0x92C9, + 0x92CA,0x92CB,0x92CC,0x92CD,0x92CE,0x92CF,0x92D0,0x92D1, + 0x92D2,0x92D3,0x92D4,0x92D5,0x92D6,0x92D7,0x92D8,0x92D9, + 0x92DA,0x92DB,0x92DC,0x92DD,0x92DE,0x92DF,0x92E0,0x92E1, + 0x92E2,0x92E3,0x92E4,0x92E5,0x92E6,0x92E7,0x92E8,0x92E9, + 0x92EA,0x92EB,0x92EC,0x92ED,0x92EE,0x92EF,0x92F0,0x92F1, + 0x92F2,0x92F3,0x92F4,0x92F5,0x92F6,0x92F7,0x92F8,0x92F9, + 0x92FA,0x92FB,0x92FC,0x92FD,0x92FE,0x92FF,0x9300,0x9301, + 0x9302,0x9303,0x9304,0x9305,0x9306,0x9307,0x9308,0x9309, + 0x6D39,0x6D27,0x6D0C,0x6D43,0x6D48,0x6D07,0x6D04,0x6D19, + 0x6D0E,0x6D2B,0x6D4D,0x6D2E,0x6D35,0x6D1A,0x6D4F,0x6D52, + 0x6D54,0x6D33,0x6D91,0x6D6F,0x6D9E,0x6DA0,0x6D5E,0x6D93, + 0x6D94,0x6D5C,0x6D60,0x6D7C,0x6D63,0x6E1A,0x6DC7,0x6DC5, + 0x6DDE,0x6E0E,0x6DBF,0x6DE0,0x6E11,0x6DE6,0x6DDD,0x6DD9, + 0x6E16,0x6DAB,0x6E0C,0x6DAE,0x6E2B,0x6E6E,0x6E4E,0x6E6B, + 0x6EB2,0x6E5F,0x6E86,0x6E53,0x6E54,0x6E32,0x6E25,0x6E44, + 0x6EDF,0x6EB1,0x6E98,0x6EE0,0x6F2D,0x6EE2,0x6EA5,0x6EA7, + 0x6EBD,0x6EBB,0x6EB7,0x6ED7,0x6EB4,0x6ECF,0x6E8F,0x6EC2, + 0x6E9F,0x6F62,0x6F46,0x6F47,0x6F24,0x6F15,0x6EF9,0x6F2F, + 0x6F36,0x6F4B,0x6F74,0x6F2A,0x6F09,0x6F29,0x6F89,0x6F8D, + 0x6F8C,0x6F78,0x6F72,0x6F7C,0x6F7A,0x6FD1, + }, + {0x930A,0x930B,0x930C,0x930D,0x930E,0x930F,0x9310,0x9311, + 0x9312,0x9313,0x9314,0x9315,0x9316,0x9317,0x9318,0x9319, + 0x931A,0x931B,0x931C,0x931D,0x931E,0x931F,0x9320,0x9321, + 0x9322,0x9323,0x9324,0x9325,0x9326,0x9327,0x9328,0x9329, + 0x932A,0x932B,0x932C,0x932D,0x932E,0x932F,0x9330,0x9331, + 0x9332,0x9333,0x9334,0x9335,0x9336,0x9337,0x9338,0x9339, + 0x933A,0x933B,0x933C,0x933D,0x933F,0x9340,0x9341,0x9342, + 0x9343,0x9344,0x9345,0x9346,0x9347,0x9348,0x9349,0x934A, + 0x934B,0x934C,0x934D,0x934E,0x934F,0x9350,0x9351,0x9352, + 0x9353,0x9354,0x9355,0x9356,0x9357,0x9358,0x9359,0x935A, + 0x935B,0x935C,0x935D,0x935E,0x935F,0x9360,0x9361,0x9362, + 0x9363,0x9364,0x9365,0x9366,0x9367,0x9368,0x9369,0x936B, + 0x6FC9,0x6FA7,0x6FB9,0x6FB6,0x6FC2,0x6FE1,0x6FEE,0x6FDE, + 0x6FE0,0x6FEF,0x701A,0x7023,0x701B,0x7039,0x7035,0x704F, + 0x705E,0x5B80,0x5B84,0x5B95,0x5B93,0x5BA5,0x5BB8,0x752F, + 0x9A9E,0x6434,0x5BE4,0x5BEE,0x8930,0x5BF0,0x8E47,0x8B07, + 0x8FB6,0x8FD3,0x8FD5,0x8FE5,0x8FEE,0x8FE4,0x8FE9,0x8FE6, + 0x8FF3,0x8FE8,0x9005,0x9004,0x900B,0x9026,0x9011,0x900D, + 0x9016,0x9021,0x9035,0x9036,0x902D,0x902F,0x9044,0x9051, + 0x9052,0x9050,0x9068,0x9058,0x9062,0x905B,0x66B9,0x9074, + 0x907D,0x9082,0x9088,0x9083,0x908B,0x5F50,0x5F57,0x5F56, + 0x5F58,0x5C3B,0x54AB,0x5C50,0x5C59,0x5B71,0x5C63,0x5C66, + 0x7FBC,0x5F2A,0x5F29,0x5F2D,0x8274,0x5F3C,0x9B3B,0x5C6E, + 0x5981,0x5983,0x598D,0x59A9,0x59AA,0x59A3, + }, + {0x936C,0x936D,0x936E,0x936F,0x9370,0x9371,0x9372,0x9373, + 0x9374,0x9375,0x9376,0x9377,0x9378,0x9379,0x937A,0x937B, + 0x937C,0x937D,0x937E,0x937F,0x9380,0x9381,0x9382,0x9383, + 0x9384,0x9385,0x9386,0x9387,0x9388,0x9389,0x938A,0x938B, + 0x938C,0x938D,0x938E,0x9390,0x9391,0x9392,0x9393,0x9394, + 0x9395,0x9396,0x9397,0x9398,0x9399,0x939A,0x939B,0x939C, + 0x939D,0x939E,0x939F,0x93A0,0x93A1,0x93A2,0x93A3,0x93A4, + 0x93A5,0x93A6,0x93A7,0x93A8,0x93A9,0x93AA,0x93AB,0x93AC, + 0x93AD,0x93AE,0x93AF,0x93B0,0x93B1,0x93B2,0x93B3,0x93B4, + 0x93B5,0x93B6,0x93B7,0x93B8,0x93B9,0x93BA,0x93BB,0x93BC, + 0x93BD,0x93BE,0x93BF,0x93C0,0x93C1,0x93C2,0x93C3,0x93C4, + 0x93C5,0x93C6,0x93C7,0x93C8,0x93C9,0x93CB,0x93CC,0x93CD, + 0x5997,0x59CA,0x59AB,0x599E,0x59A4,0x59D2,0x59B2,0x59AF, + 0x59D7,0x59BE,0x5A05,0x5A06,0x59DD,0x5A08,0x59E3,0x59D8, + 0x59F9,0x5A0C,0x5A09,0x5A32,0x5A34,0x5A11,0x5A23,0x5A13, + 0x5A40,0x5A67,0x5A4A,0x5A55,0x5A3C,0x5A62,0x5A75,0x80EC, + 0x5AAA,0x5A9B,0x5A77,0x5A7A,0x5ABE,0x5AEB,0x5AB2,0x5AD2, + 0x5AD4,0x5AB8,0x5AE0,0x5AE3,0x5AF1,0x5AD6,0x5AE6,0x5AD8, + 0x5ADC,0x5B09,0x5B17,0x5B16,0x5B32,0x5B37,0x5B40,0x5C15, + 0x5C1C,0x5B5A,0x5B65,0x5B73,0x5B51,0x5B53,0x5B62,0x9A75, + 0x9A77,0x9A78,0x9A7A,0x9A7F,0x9A7D,0x9A80,0x9A81,0x9A85, + 0x9A88,0x9A8A,0x9A90,0x9A92,0x9A93,0x9A96,0x9A98,0x9A9B, + 0x9A9C,0x9A9D,0x9A9F,0x9AA0,0x9AA2,0x9AA3,0x9AA5,0x9AA7, + 0x7E9F,0x7EA1,0x7EA3,0x7EA5,0x7EA8,0x7EA9, + }, + {0x93CE,0x93CF,0x93D0,0x93D1,0x93D2,0x93D3,0x93D4,0x93D5, + 0x93D7,0x93D8,0x93D9,0x93DA,0x93DB,0x93DC,0x93DD,0x93DE, + 0x93DF,0x93E0,0x93E1,0x93E2,0x93E3,0x93E4,0x93E5,0x93E6, + 0x93E7,0x93E8,0x93E9,0x93EA,0x93EB,0x93EC,0x93ED,0x93EE, + 0x93EF,0x93F0,0x93F1,0x93F2,0x93F3,0x93F4,0x93F5,0x93F6, + 0x93F7,0x93F8,0x93F9,0x93FA,0x93FB,0x93FC,0x93FD,0x93FE, + 0x93FF,0x9400,0x9401,0x9402,0x9403,0x9404,0x9405,0x9406, + 0x9407,0x9408,0x9409,0x940A,0x940B,0x940C,0x940D,0x940E, + 0x940F,0x9410,0x9411,0x9412,0x9413,0x9414,0x9415,0x9416, + 0x9417,0x9418,0x9419,0x941A,0x941B,0x941C,0x941D,0x941E, + 0x941F,0x9420,0x9421,0x9422,0x9423,0x9424,0x9425,0x9426, + 0x9427,0x9428,0x9429,0x942A,0x942B,0x942C,0x942D,0x942E, + 0x7EAD,0x7EB0,0x7EBE,0x7EC0,0x7EC1,0x7EC2,0x7EC9,0x7ECB, + 0x7ECC,0x7ED0,0x7ED4,0x7ED7,0x7EDB,0x7EE0,0x7EE1,0x7EE8, + 0x7EEB,0x7EEE,0x7EEF,0x7EF1,0x7EF2,0x7F0D,0x7EF6,0x7EFA, + 0x7EFB,0x7EFE,0x7F01,0x7F02,0x7F03,0x7F07,0x7F08,0x7F0B, + 0x7F0C,0x7F0F,0x7F11,0x7F12,0x7F17,0x7F19,0x7F1C,0x7F1B, + 0x7F1F,0x7F21,0x7F22,0x7F23,0x7F24,0x7F25,0x7F26,0x7F27, + 0x7F2A,0x7F2B,0x7F2C,0x7F2D,0x7F2F,0x7F30,0x7F31,0x7F32, + 0x7F33,0x7F35,0x5E7A,0x757F,0x5DDB,0x753E,0x9095,0x738E, + 0x7391,0x73AE,0x73A2,0x739F,0x73CF,0x73C2,0x73D1,0x73B7, + 0x73B3,0x73C0,0x73C9,0x73C8,0x73E5,0x73D9,0x987C,0x740A, + 0x73E9,0x73E7,0x73DE,0x73BA,0x73F2,0x740F,0x742A,0x745B, + 0x7426,0x7425,0x7428,0x7430,0x742E,0x742C, + }, + {0x942F,0x9430,0x9431,0x9432,0x9433,0x9434,0x9435,0x9436, + 0x9437,0x9438,0x9439,0x943A,0x943B,0x943C,0x943D,0x943F, + 0x9440,0x9441,0x9442,0x9443,0x9444,0x9445,0x9446,0x9447, + 0x9448,0x9449,0x944A,0x944B,0x944C,0x944D,0x944E,0x944F, + 0x9450,0x9451,0x9452,0x9453,0x9454,0x9455,0x9456,0x9457, + 0x9458,0x9459,0x945A,0x945B,0x945C,0x945D,0x945E,0x945F, + 0x9460,0x9461,0x9462,0x9463,0x9464,0x9465,0x9466,0x9467, + 0x9468,0x9469,0x946A,0x946C,0x946D,0x946E,0x946F,0x9470, + 0x9471,0x9472,0x9473,0x9474,0x9475,0x9476,0x9477,0x9478, + 0x9479,0x947A,0x947B,0x947C,0x947D,0x947E,0x947F,0x9480, + 0x9481,0x9482,0x9483,0x9484,0x9491,0x9496,0x9498,0x94C7, + 0x94CF,0x94D3,0x94D4,0x94DA,0x94E6,0x94FB,0x951C,0x9520, + 0x741B,0x741A,0x7441,0x745C,0x7457,0x7455,0x7459,0x7477, + 0x746D,0x747E,0x749C,0x748E,0x7480,0x7481,0x7487,0x748B, + 0x749E,0x74A8,0x74A9,0x7490,0x74A7,0x74D2,0x74BA,0x97EA, + 0x97EB,0x97EC,0x674C,0x6753,0x675E,0x6748,0x6769,0x67A5, + 0x6787,0x676A,0x6773,0x6798,0x67A7,0x6775,0x67A8,0x679E, + 0x67AD,0x678B,0x6777,0x677C,0x67F0,0x6809,0x67D8,0x680A, + 0x67E9,0x67B0,0x680C,0x67D9,0x67B5,0x67DA,0x67B3,0x67DD, + 0x6800,0x67C3,0x67B8,0x67E2,0x680E,0x67C1,0x67FD,0x6832, + 0x6833,0x6860,0x6861,0x684E,0x6862,0x6844,0x6864,0x6883, + 0x681D,0x6855,0x6866,0x6841,0x6867,0x6840,0x683E,0x684A, + 0x6849,0x6829,0x68B5,0x688F,0x6874,0x6877,0x6893,0x686B, + 0x68C2,0x696E,0x68FC,0x691F,0x6920,0x68F9, + }, + {0x9527,0x9533,0x953D,0x9543,0x9548,0x954B,0x9555,0x955A, + 0x9560,0x956E,0x9574,0x9575,0x9577,0x9578,0x9579,0x957A, + 0x957B,0x957C,0x957D,0x957E,0x9580,0x9581,0x9582,0x9583, + 0x9584,0x9585,0x9586,0x9587,0x9588,0x9589,0x958A,0x958B, + 0x958C,0x958D,0x958E,0x958F,0x9590,0x9591,0x9592,0x9593, + 0x9594,0x9595,0x9596,0x9597,0x9598,0x9599,0x959A,0x959B, + 0x959C,0x959D,0x959E,0x959F,0x95A0,0x95A1,0x95A2,0x95A3, + 0x95A4,0x95A5,0x95A6,0x95A7,0x95A8,0x95A9,0x95AA,0x95AB, + 0x95AC,0x95AD,0x95AE,0x95AF,0x95B0,0x95B1,0x95B2,0x95B3, + 0x95B4,0x95B5,0x95B6,0x95B7,0x95B8,0x95B9,0x95BA,0x95BB, + 0x95BC,0x95BD,0x95BE,0x95BF,0x95C0,0x95C1,0x95C2,0x95C3, + 0x95C4,0x95C5,0x95C6,0x95C7,0x95C8,0x95C9,0x95CA,0x95CB, + 0x6924,0x68F0,0x690B,0x6901,0x6957,0x68E3,0x6910,0x6971, + 0x6939,0x6960,0x6942,0x695D,0x6984,0x696B,0x6980,0x6998, + 0x6978,0x6934,0x69CC,0x6987,0x6988,0x69CE,0x6989,0x6966, + 0x6963,0x6979,0x699B,0x69A7,0x69BB,0x69AB,0x69AD,0x69D4, + 0x69B1,0x69C1,0x69CA,0x69DF,0x6995,0x69E0,0x698D,0x69FF, + 0x6A2F,0x69ED,0x6A17,0x6A18,0x6A65,0x69F2,0x6A44,0x6A3E, + 0x6AA0,0x6A50,0x6A5B,0x6A35,0x6A8E,0x6A79,0x6A3D,0x6A28, + 0x6A58,0x6A7C,0x6A91,0x6A90,0x6AA9,0x6A97,0x6AAB,0x7337, + 0x7352,0x6B81,0x6B82,0x6B87,0x6B84,0x6B92,0x6B93,0x6B8D, + 0x6B9A,0x6B9B,0x6BA1,0x6BAA,0x8F6B,0x8F6D,0x8F71,0x8F72, + 0x8F73,0x8F75,0x8F76,0x8F78,0x8F77,0x8F79,0x8F7A,0x8F7C, + 0x8F7E,0x8F81,0x8F82,0x8F84,0x8F87,0x8F8B, + }, + {0x95CC,0x95CD,0x95CE,0x95CF,0x95D0,0x95D1,0x95D2,0x95D3, + 0x95D4,0x95D5,0x95D6,0x95D7,0x95D8,0x95D9,0x95DA,0x95DB, + 0x95DC,0x95DD,0x95DE,0x95DF,0x95E0,0x95E1,0x95E2,0x95E3, + 0x95E4,0x95E5,0x95E6,0x95E7,0x95EC,0x95FF,0x9607,0x9613, + 0x9618,0x961B,0x961E,0x9620,0x9623,0x9624,0x9625,0x9626, + 0x9627,0x9628,0x9629,0x962B,0x962C,0x962D,0x962F,0x9630, + 0x9637,0x9638,0x9639,0x963A,0x963E,0x9641,0x9643,0x964A, + 0x964E,0x964F,0x9651,0x9652,0x9653,0x9656,0x9657,0x9658, + 0x9659,0x965A,0x965C,0x965D,0x965E,0x9660,0x9663,0x9665, + 0x9666,0x966B,0x966D,0x966E,0x966F,0x9670,0x9671,0x9673, + 0x9678,0x9679,0x967A,0x967B,0x967C,0x967D,0x967E,0x967F, + 0x9680,0x9681,0x9682,0x9683,0x9684,0x9687,0x9689,0x968A, + 0x8F8D,0x8F8E,0x8F8F,0x8F98,0x8F9A,0x8ECE,0x620B,0x6217, + 0x621B,0x621F,0x6222,0x6221,0x6225,0x6224,0x622C,0x81E7, + 0x74EF,0x74F4,0x74FF,0x750F,0x7511,0x7513,0x6534,0x65EE, + 0x65EF,0x65F0,0x660A,0x6619,0x6772,0x6603,0x6615,0x6600, + 0x7085,0x66F7,0x661D,0x6634,0x6631,0x6636,0x6635,0x8006, + 0x665F,0x6654,0x6641,0x664F,0x6656,0x6661,0x6657,0x6677, + 0x6684,0x668C,0x66A7,0x669D,0x66BE,0x66DB,0x66DC,0x66E6, + 0x66E9,0x8D32,0x8D33,0x8D36,0x8D3B,0x8D3D,0x8D40,0x8D45, + 0x8D46,0x8D48,0x8D49,0x8D47,0x8D4D,0x8D55,0x8D59,0x89C7, + 0x89CA,0x89CB,0x89CC,0x89CE,0x89CF,0x89D0,0x89D1,0x726E, + 0x729F,0x725D,0x7266,0x726F,0x727E,0x727F,0x7284,0x728B, + 0x728D,0x728F,0x7292,0x6308,0x6332,0x63B0, + }, + {0x968C,0x968E,0x9691,0x9692,0x9693,0x9695,0x9696,0x969A, + 0x969B,0x969D,0x969E,0x969F,0x96A0,0x96A1,0x96A2,0x96A3, + 0x96A4,0x96A5,0x96A6,0x96A8,0x96A9,0x96AA,0x96AB,0x96AC, + 0x96AD,0x96AE,0x96AF,0x96B1,0x96B2,0x96B4,0x96B5,0x96B7, + 0x96B8,0x96BA,0x96BB,0x96BF,0x96C2,0x96C3,0x96C8,0x96CA, + 0x96CB,0x96D0,0x96D1,0x96D3,0x96D4,0x96D6,0x96D7,0x96D8, + 0x96D9,0x96DA,0x96DB,0x96DC,0x96DD,0x96DE,0x96DF,0x96E1, + 0x96E2,0x96E3,0x96E4,0x96E5,0x96E6,0x96E7,0x96EB,0x96EC, + 0x96ED,0x96EE,0x96F0,0x96F1,0x96F2,0x96F4,0x96F5,0x96F8, + 0x96FA,0x96FB,0x96FC,0x96FD,0x96FF,0x9702,0x9703,0x9705, + 0x970A,0x970B,0x970C,0x9710,0x9711,0x9712,0x9714,0x9715, + 0x9717,0x9718,0x9719,0x971A,0x971B,0x971D,0x971F,0x9720, + 0x643F,0x64D8,0x8004,0x6BEA,0x6BF3,0x6BFD,0x6BF5,0x6BF9, + 0x6C05,0x6C07,0x6C06,0x6C0D,0x6C15,0x6C18,0x6C19,0x6C1A, + 0x6C21,0x6C29,0x6C24,0x6C2A,0x6C32,0x6535,0x6555,0x656B, + 0x724D,0x7252,0x7256,0x7230,0x8662,0x5216,0x809F,0x809C, + 0x8093,0x80BC,0x670A,0x80BD,0x80B1,0x80AB,0x80AD,0x80B4, + 0x80B7,0x80E7,0x80E8,0x80E9,0x80EA,0x80DB,0x80C2,0x80C4, + 0x80D9,0x80CD,0x80D7,0x6710,0x80DD,0x80EB,0x80F1,0x80F4, + 0x80ED,0x810D,0x810E,0x80F2,0x80FC,0x6715,0x8112,0x8C5A, + 0x8136,0x811E,0x812C,0x8118,0x8132,0x8148,0x814C,0x8153, + 0x8174,0x8159,0x815A,0x8171,0x8160,0x8169,0x817C,0x817D, + 0x816D,0x8167,0x584D,0x5AB5,0x8188,0x8182,0x8191,0x6ED5, + 0x81A3,0x81AA,0x81CC,0x6726,0x81CA,0x81BB, + }, + {0x9721,0x9722,0x9723,0x9724,0x9725,0x9726,0x9727,0x9728, + 0x9729,0x972B,0x972C,0x972E,0x972F,0x9731,0x9733,0x9734, + 0x9735,0x9736,0x9737,0x973A,0x973B,0x973C,0x973D,0x973F, + 0x9740,0x9741,0x9742,0x9743,0x9744,0x9745,0x9746,0x9747, + 0x9748,0x9749,0x974A,0x974B,0x974C,0x974D,0x974E,0x974F, + 0x9750,0x9751,0x9754,0x9755,0x9757,0x9758,0x975A,0x975C, + 0x975D,0x975F,0x9763,0x9764,0x9766,0x9767,0x9768,0x976A, + 0x976B,0x976C,0x976D,0x976E,0x976F,0x9770,0x9771,0x9772, + 0x9775,0x9777,0x9778,0x9779,0x977A,0x977B,0x977D,0x977E, + 0x977F,0x9780,0x9781,0x9782,0x9783,0x9784,0x9786,0x9787, + 0x9788,0x9789,0x978A,0x978C,0x978E,0x978F,0x9790,0x9793, + 0x9795,0x9796,0x9797,0x9799,0x979A,0x979B,0x979C,0x979D, + 0x81C1,0x81A6,0x6B24,0x6B37,0x6B39,0x6B43,0x6B46,0x6B59, + 0x98D1,0x98D2,0x98D3,0x98D5,0x98D9,0x98DA,0x6BB3,0x5F40, + 0x6BC2,0x89F3,0x6590,0x9F51,0x6593,0x65BC,0x65C6,0x65C4, + 0x65C3,0x65CC,0x65CE,0x65D2,0x65D6,0x7080,0x709C,0x7096, + 0x709D,0x70BB,0x70C0,0x70B7,0x70AB,0x70B1,0x70E8,0x70CA, + 0x7110,0x7113,0x7116,0x712F,0x7131,0x7173,0x715C,0x7168, + 0x7145,0x7172,0x714A,0x7178,0x717A,0x7198,0x71B3,0x71B5, + 0x71A8,0x71A0,0x71E0,0x71D4,0x71E7,0x71F9,0x721D,0x7228, + 0x706C,0x7118,0x7166,0x71B9,0x623E,0x623D,0x6243,0x6248, + 0x6249,0x793B,0x7940,0x7946,0x7949,0x795B,0x795C,0x7953, + 0x795A,0x7962,0x7957,0x7960,0x796F,0x7967,0x797A,0x7985, + 0x798A,0x799A,0x79A7,0x79B3,0x5FD1,0x5FD0, + }, + {0x979E,0x979F,0x97A1,0x97A2,0x97A4,0x97A5,0x97A6,0x97A7, + 0x97A8,0x97A9,0x97AA,0x97AC,0x97AE,0x97B0,0x97B1,0x97B3, + 0x97B5,0x97B6,0x97B7,0x97B8,0x97B9,0x97BA,0x97BB,0x97BC, + 0x97BD,0x97BE,0x97BF,0x97C0,0x97C1,0x97C2,0x97C3,0x97C4, + 0x97C5,0x97C6,0x97C7,0x97C8,0x97C9,0x97CA,0x97CB,0x97CC, + 0x97CD,0x97CE,0x97CF,0x97D0,0x97D1,0x97D2,0x97D3,0x97D4, + 0x97D5,0x97D6,0x97D7,0x97D8,0x97D9,0x97DA,0x97DB,0x97DC, + 0x97DD,0x97DE,0x97DF,0x97E0,0x97E1,0x97E2,0x97E3,0x97E4, + 0x97E5,0x97E8,0x97EE,0x97EF,0x97F0,0x97F1,0x97F2,0x97F4, + 0x97F7,0x97F8,0x97F9,0x97FA,0x97FB,0x97FC,0x97FD,0x97FE, + 0x97FF,0x9800,0x9801,0x9802,0x9803,0x9804,0x9805,0x9806, + 0x9807,0x9808,0x9809,0x980A,0x980B,0x980C,0x980D,0x980E, + 0x603C,0x605D,0x605A,0x6067,0x6041,0x6059,0x6063,0x60AB, + 0x6106,0x610D,0x615D,0x61A9,0x619D,0x61CB,0x61D1,0x6206, + 0x8080,0x807F,0x6C93,0x6CF6,0x6DFC,0x77F6,0x77F8,0x7800, + 0x7809,0x7817,0x7818,0x7811,0x65AB,0x782D,0x781C,0x781D, + 0x7839,0x783A,0x783B,0x781F,0x783C,0x7825,0x782C,0x7823, + 0x7829,0x784E,0x786D,0x7856,0x7857,0x7826,0x7850,0x7847, + 0x784C,0x786A,0x789B,0x7893,0x789A,0x7887,0x789C,0x78A1, + 0x78A3,0x78B2,0x78B9,0x78A5,0x78D4,0x78D9,0x78C9,0x78EC, + 0x78F2,0x7905,0x78F4,0x7913,0x7924,0x791E,0x7934,0x9F9B, + 0x9EF9,0x9EFB,0x9EFC,0x76F1,0x7704,0x770D,0x76F9,0x7707, + 0x7708,0x771A,0x7722,0x7719,0x772D,0x7726,0x7735,0x7738, + 0x7750,0x7751,0x7747,0x7743,0x775A,0x7768, + }, + {0x980F,0x9810,0x9811,0x9812,0x9813,0x9814,0x9815,0x9816, + 0x9817,0x9818,0x9819,0x981A,0x981B,0x981C,0x981D,0x981E, + 0x981F,0x9820,0x9821,0x9822,0x9823,0x9824,0x9825,0x9826, + 0x9827,0x9828,0x9829,0x982A,0x982B,0x982C,0x982D,0x982E, + 0x982F,0x9830,0x9831,0x9832,0x9833,0x9834,0x9835,0x9836, + 0x9837,0x9838,0x9839,0x983A,0x983B,0x983C,0x983D,0x983E, + 0x983F,0x9840,0x9841,0x9842,0x9843,0x9844,0x9845,0x9846, + 0x9847,0x9848,0x9849,0x984A,0x984B,0x984C,0x984D,0x984E, + 0x984F,0x9850,0x9851,0x9852,0x9853,0x9854,0x9855,0x9856, + 0x9857,0x9858,0x9859,0x985A,0x985B,0x985C,0x985D,0x985E, + 0x985F,0x9860,0x9861,0x9862,0x9863,0x9864,0x9865,0x9866, + 0x9867,0x9868,0x9869,0x986A,0x986B,0x986C,0x986D,0x986E, + 0x7762,0x7765,0x777F,0x778D,0x777D,0x7780,0x778C,0x7791, + 0x779F,0x77A0,0x77B0,0x77B5,0x77BD,0x753A,0x7540,0x754E, + 0x754B,0x7548,0x755B,0x7572,0x7579,0x7583,0x7F58,0x7F61, + 0x7F5F,0x8A48,0x7F68,0x7F74,0x7F71,0x7F79,0x7F81,0x7F7E, + 0x76CD,0x76E5,0x8832,0x9485,0x9486,0x9487,0x948B,0x948A, + 0x948C,0x948D,0x948F,0x9490,0x9494,0x9497,0x9495,0x949A, + 0x949B,0x949C,0x94A3,0x94A4,0x94AB,0x94AA,0x94AD,0x94AC, + 0x94AF,0x94B0,0x94B2,0x94B4,0x94B6,0x94B7,0x94B8,0x94B9, + 0x94BA,0x94BC,0x94BD,0x94BF,0x94C4,0x94C8,0x94C9,0x94CA, + 0x94CB,0x94CC,0x94CD,0x94CE,0x94D0,0x94D1,0x94D2,0x94D5, + 0x94D6,0x94D7,0x94D9,0x94D8,0x94DB,0x94DE,0x94DF,0x94E0, + 0x94E2,0x94E4,0x94E5,0x94E7,0x94E8,0x94EA, + }, + {0x986F,0x9870,0x9871,0x9872,0x9873,0x9874,0x988B,0x988E, + 0x9892,0x9895,0x9899,0x98A3,0x98A8,0x98A9,0x98AA,0x98AB, + 0x98AC,0x98AD,0x98AE,0x98AF,0x98B0,0x98B1,0x98B2,0x98B3, + 0x98B4,0x98B5,0x98B6,0x98B7,0x98B8,0x98B9,0x98BA,0x98BB, + 0x98BC,0x98BD,0x98BE,0x98BF,0x98C0,0x98C1,0x98C2,0x98C3, + 0x98C4,0x98C5,0x98C6,0x98C7,0x98C8,0x98C9,0x98CA,0x98CB, + 0x98CC,0x98CD,0x98CF,0x98D0,0x98D4,0x98D6,0x98D7,0x98DB, + 0x98DC,0x98DD,0x98E0,0x98E1,0x98E2,0x98E3,0x98E4,0x98E5, + 0x98E6,0x98E9,0x98EA,0x98EB,0x98EC,0x98ED,0x98EE,0x98EF, + 0x98F0,0x98F1,0x98F2,0x98F3,0x98F4,0x98F5,0x98F6,0x98F7, + 0x98F8,0x98F9,0x98FA,0x98FB,0x98FC,0x98FD,0x98FE,0x98FF, + 0x9900,0x9901,0x9902,0x9903,0x9904,0x9905,0x9906,0x9907, + 0x94E9,0x94EB,0x94EE,0x94EF,0x94F3,0x94F4,0x94F5,0x94F7, + 0x94F9,0x94FC,0x94FD,0x94FF,0x9503,0x9502,0x9506,0x9507, + 0x9509,0x950A,0x950D,0x950E,0x950F,0x9512,0x9513,0x9514, + 0x9515,0x9516,0x9518,0x951B,0x951D,0x951E,0x951F,0x9522, + 0x952A,0x952B,0x9529,0x952C,0x9531,0x9532,0x9534,0x9536, + 0x9537,0x9538,0x953C,0x953E,0x953F,0x9542,0x9535,0x9544, + 0x9545,0x9546,0x9549,0x954C,0x954E,0x954F,0x9552,0x9553, + 0x9554,0x9556,0x9557,0x9558,0x9559,0x955B,0x955E,0x955F, + 0x955D,0x9561,0x9562,0x9564,0x9565,0x9566,0x9567,0x9568, + 0x9569,0x956A,0x956B,0x956C,0x956F,0x9571,0x9572,0x9573, + 0x953A,0x77E7,0x77EC,0x96C9,0x79D5,0x79ED,0x79E3,0x79EB, + 0x7A06,0x5D47,0x7A03,0x7A02,0x7A1E,0x7A14, + }, + {0x9908,0x9909,0x990A,0x990B,0x990C,0x990E,0x990F,0x9911, + 0x9912,0x9913,0x9914,0x9915,0x9916,0x9917,0x9918,0x9919, + 0x991A,0x991B,0x991C,0x991D,0x991E,0x991F,0x9920,0x9921, + 0x9922,0x9923,0x9924,0x9925,0x9926,0x9927,0x9928,0x9929, + 0x992A,0x992B,0x992C,0x992D,0x992F,0x9930,0x9931,0x9932, + 0x9933,0x9934,0x9935,0x9936,0x9937,0x9938,0x9939,0x993A, + 0x993B,0x993C,0x993D,0x993E,0x993F,0x9940,0x9941,0x9942, + 0x9943,0x9944,0x9945,0x9946,0x9947,0x9948,0x9949,0x994A, + 0x994B,0x994C,0x994D,0x994E,0x994F,0x9950,0x9951,0x9952, + 0x9953,0x9956,0x9957,0x9958,0x9959,0x995A,0x995B,0x995C, + 0x995D,0x995E,0x995F,0x9960,0x9961,0x9962,0x9964,0x9966, + 0x9973,0x9978,0x9979,0x997B,0x997E,0x9982,0x9983,0x9989, + 0x7A39,0x7A37,0x7A51,0x9ECF,0x99A5,0x7A70,0x7688,0x768E, + 0x7693,0x7699,0x76A4,0x74DE,0x74E0,0x752C,0x9E20,0x9E22, + 0x9E28,0x9E29,0x9E2A,0x9E2B,0x9E2C,0x9E32,0x9E31,0x9E36, + 0x9E38,0x9E37,0x9E39,0x9E3A,0x9E3E,0x9E41,0x9E42,0x9E44, + 0x9E46,0x9E47,0x9E48,0x9E49,0x9E4B,0x9E4C,0x9E4E,0x9E51, + 0x9E55,0x9E57,0x9E5A,0x9E5B,0x9E5C,0x9E5E,0x9E63,0x9E66, + 0x9E67,0x9E68,0x9E69,0x9E6A,0x9E6B,0x9E6C,0x9E71,0x9E6D, + 0x9E73,0x7592,0x7594,0x7596,0x75A0,0x759D,0x75AC,0x75A3, + 0x75B3,0x75B4,0x75B8,0x75C4,0x75B1,0x75B0,0x75C3,0x75C2, + 0x75D6,0x75CD,0x75E3,0x75E8,0x75E6,0x75E4,0x75EB,0x75E7, + 0x7603,0x75F1,0x75FC,0x75FF,0x7610,0x7600,0x7605,0x760C, + 0x7617,0x760A,0x7625,0x7618,0x7615,0x7619, + }, + {0x998C,0x998E,0x999A,0x999B,0x999C,0x999D,0x999E,0x999F, + 0x99A0,0x99A1,0x99A2,0x99A3,0x99A4,0x99A6,0x99A7,0x99A9, + 0x99AA,0x99AB,0x99AC,0x99AD,0x99AE,0x99AF,0x99B0,0x99B1, + 0x99B2,0x99B3,0x99B4,0x99B5,0x99B6,0x99B7,0x99B8,0x99B9, + 0x99BA,0x99BB,0x99BC,0x99BD,0x99BE,0x99BF,0x99C0,0x99C1, + 0x99C2,0x99C3,0x99C4,0x99C5,0x99C6,0x99C7,0x99C8,0x99C9, + 0x99CA,0x99CB,0x99CC,0x99CD,0x99CE,0x99CF,0x99D0,0x99D1, + 0x99D2,0x99D3,0x99D4,0x99D5,0x99D6,0x99D7,0x99D8,0x99D9, + 0x99DA,0x99DB,0x99DC,0x99DD,0x99DE,0x99DF,0x99E0,0x99E1, + 0x99E2,0x99E3,0x99E4,0x99E5,0x99E6,0x99E7,0x99E8,0x99E9, + 0x99EA,0x99EB,0x99EC,0x99ED,0x99EE,0x99EF,0x99F0,0x99F1, + 0x99F2,0x99F3,0x99F4,0x99F5,0x99F6,0x99F7,0x99F8,0x99F9, + 0x761B,0x763C,0x7622,0x7620,0x7640,0x762D,0x7630,0x763F, + 0x7635,0x7643,0x763E,0x7633,0x764D,0x765E,0x7654,0x765C, + 0x7656,0x766B,0x766F,0x7FCA,0x7AE6,0x7A78,0x7A79,0x7A80, + 0x7A86,0x7A88,0x7A95,0x7AA6,0x7AA0,0x7AAC,0x7AA8,0x7AAD, + 0x7AB3,0x8864,0x8869,0x8872,0x887D,0x887F,0x8882,0x88A2, + 0x88C6,0x88B7,0x88BC,0x88C9,0x88E2,0x88CE,0x88E3,0x88E5, + 0x88F1,0x891A,0x88FC,0x88E8,0x88FE,0x88F0,0x8921,0x8919, + 0x8913,0x891B,0x890A,0x8934,0x892B,0x8936,0x8941,0x8966, + 0x897B,0x758B,0x80E5,0x76B2,0x76B4,0x77DC,0x8012,0x8014, + 0x8016,0x801C,0x8020,0x8022,0x8025,0x8026,0x8027,0x8029, + 0x8028,0x8031,0x800B,0x8035,0x8043,0x8046,0x804D,0x8052, + 0x8069,0x8071,0x8983,0x9878,0x9880,0x9883, + }, + {0x99FA,0x99FB,0x99FC,0x99FD,0x99FE,0x99FF,0x9A00,0x9A01, + 0x9A02,0x9A03,0x9A04,0x9A05,0x9A06,0x9A07,0x9A08,0x9A09, + 0x9A0A,0x9A0B,0x9A0C,0x9A0D,0x9A0E,0x9A0F,0x9A10,0x9A11, + 0x9A12,0x9A13,0x9A14,0x9A15,0x9A16,0x9A17,0x9A18,0x9A19, + 0x9A1A,0x9A1B,0x9A1C,0x9A1D,0x9A1E,0x9A1F,0x9A20,0x9A21, + 0x9A22,0x9A23,0x9A24,0x9A25,0x9A26,0x9A27,0x9A28,0x9A29, + 0x9A2A,0x9A2B,0x9A2C,0x9A2D,0x9A2E,0x9A2F,0x9A30,0x9A31, + 0x9A32,0x9A33,0x9A34,0x9A35,0x9A36,0x9A37,0x9A38,0x9A39, + 0x9A3A,0x9A3B,0x9A3C,0x9A3D,0x9A3E,0x9A3F,0x9A40,0x9A41, + 0x9A42,0x9A43,0x9A44,0x9A45,0x9A46,0x9A47,0x9A48,0x9A49, + 0x9A4A,0x9A4B,0x9A4C,0x9A4D,0x9A4E,0x9A4F,0x9A50,0x9A51, + 0x9A52,0x9A53,0x9A54,0x9A55,0x9A56,0x9A57,0x9A58,0x9A59, + 0x9889,0x988C,0x988D,0x988F,0x9894,0x989A,0x989B,0x989E, + 0x989F,0x98A1,0x98A2,0x98A5,0x98A6,0x864D,0x8654,0x866C, + 0x866E,0x867F,0x867A,0x867C,0x867B,0x86A8,0x868D,0x868B, + 0x86AC,0x869D,0x86A7,0x86A3,0x86AA,0x8693,0x86A9,0x86B6, + 0x86C4,0x86B5,0x86CE,0x86B0,0x86BA,0x86B1,0x86AF,0x86C9, + 0x86CF,0x86B4,0x86E9,0x86F1,0x86F2,0x86ED,0x86F3,0x86D0, + 0x8713,0x86DE,0x86F4,0x86DF,0x86D8,0x86D1,0x8703,0x8707, + 0x86F8,0x8708,0x870A,0x870D,0x8709,0x8723,0x873B,0x871E, + 0x8725,0x872E,0x871A,0x873E,0x8748,0x8734,0x8731,0x8729, + 0x8737,0x873F,0x8782,0x8722,0x877D,0x877E,0x877B,0x8760, + 0x8770,0x874C,0x876E,0x878B,0x8753,0x8763,0x877C,0x8764, + 0x8759,0x8765,0x8793,0x87AF,0x87A8,0x87D2, + }, + {0x9A5A,0x9A5B,0x9A5C,0x9A5D,0x9A5E,0x9A5F,0x9A60,0x9A61, + 0x9A62,0x9A63,0x9A64,0x9A65,0x9A66,0x9A67,0x9A68,0x9A69, + 0x9A6A,0x9A6B,0x9A72,0x9A83,0x9A89,0x9A8D,0x9A8E,0x9A94, + 0x9A95,0x9A99,0x9AA6,0x9AA9,0x9AAA,0x9AAB,0x9AAC,0x9AAD, + 0x9AAE,0x9AAF,0x9AB2,0x9AB3,0x9AB4,0x9AB5,0x9AB9,0x9ABB, + 0x9ABD,0x9ABE,0x9ABF,0x9AC3,0x9AC4,0x9AC6,0x9AC7,0x9AC8, + 0x9AC9,0x9ACA,0x9ACD,0x9ACE,0x9ACF,0x9AD0,0x9AD2,0x9AD4, + 0x9AD5,0x9AD6,0x9AD7,0x9AD9,0x9ADA,0x9ADB,0x9ADC,0x9ADD, + 0x9ADE,0x9AE0,0x9AE2,0x9AE3,0x9AE4,0x9AE5,0x9AE7,0x9AE8, + 0x9AE9,0x9AEA,0x9AEC,0x9AEE,0x9AF0,0x9AF1,0x9AF2,0x9AF3, + 0x9AF4,0x9AF5,0x9AF6,0x9AF7,0x9AF8,0x9AFA,0x9AFC,0x9AFD, + 0x9AFE,0x9AFF,0x9B00,0x9B01,0x9B02,0x9B04,0x9B05,0x9B06, + 0x87C6,0x8788,0x8785,0x87AD,0x8797,0x8783,0x87AB,0x87E5, + 0x87AC,0x87B5,0x87B3,0x87CB,0x87D3,0x87BD,0x87D1,0x87C0, + 0x87CA,0x87DB,0x87EA,0x87E0,0x87EE,0x8816,0x8813,0x87FE, + 0x880A,0x881B,0x8821,0x8839,0x883C,0x7F36,0x7F42,0x7F44, + 0x7F45,0x8210,0x7AFA,0x7AFD,0x7B08,0x7B03,0x7B04,0x7B15, + 0x7B0A,0x7B2B,0x7B0F,0x7B47,0x7B38,0x7B2A,0x7B19,0x7B2E, + 0x7B31,0x7B20,0x7B25,0x7B24,0x7B33,0x7B3E,0x7B1E,0x7B58, + 0x7B5A,0x7B45,0x7B75,0x7B4C,0x7B5D,0x7B60,0x7B6E,0x7B7B, + 0x7B62,0x7B72,0x7B71,0x7B90,0x7BA6,0x7BA7,0x7BB8,0x7BAC, + 0x7B9D,0x7BA8,0x7B85,0x7BAA,0x7B9C,0x7BA2,0x7BAB,0x7BB4, + 0x7BD1,0x7BC1,0x7BCC,0x7BDD,0x7BDA,0x7BE5,0x7BE6,0x7BEA, + 0x7C0C,0x7BFE,0x7BFC,0x7C0F,0x7C16,0x7C0B, + }, + {0x9B07,0x9B09,0x9B0A,0x9B0B,0x9B0C,0x9B0D,0x9B0E,0x9B10, + 0x9B11,0x9B12,0x9B14,0x9B15,0x9B16,0x9B17,0x9B18,0x9B19, + 0x9B1A,0x9B1B,0x9B1C,0x9B1D,0x9B1E,0x9B20,0x9B21,0x9B22, + 0x9B24,0x9B25,0x9B26,0x9B27,0x9B28,0x9B29,0x9B2A,0x9B2B, + 0x9B2C,0x9B2D,0x9B2E,0x9B30,0x9B31,0x9B33,0x9B34,0x9B35, + 0x9B36,0x9B37,0x9B38,0x9B39,0x9B3A,0x9B3D,0x9B3E,0x9B3F, + 0x9B40,0x9B46,0x9B4A,0x9B4B,0x9B4C,0x9B4E,0x9B50,0x9B52, + 0x9B53,0x9B55,0x9B56,0x9B57,0x9B58,0x9B59,0x9B5A,0x9B5B, + 0x9B5C,0x9B5D,0x9B5E,0x9B5F,0x9B60,0x9B61,0x9B62,0x9B63, + 0x9B64,0x9B65,0x9B66,0x9B67,0x9B68,0x9B69,0x9B6A,0x9B6B, + 0x9B6C,0x9B6D,0x9B6E,0x9B6F,0x9B70,0x9B71,0x9B72,0x9B73, + 0x9B74,0x9B75,0x9B76,0x9B77,0x9B78,0x9B79,0x9B7A,0x9B7B, + 0x7C1F,0x7C2A,0x7C26,0x7C38,0x7C41,0x7C40,0x81FE,0x8201, + 0x8202,0x8204,0x81EC,0x8844,0x8221,0x8222,0x8223,0x822D, + 0x822F,0x8228,0x822B,0x8238,0x823B,0x8233,0x8234,0x823E, + 0x8244,0x8249,0x824B,0x824F,0x825A,0x825F,0x8268,0x887E, + 0x8885,0x8888,0x88D8,0x88DF,0x895E,0x7F9D,0x7F9F,0x7FA7, + 0x7FAF,0x7FB0,0x7FB2,0x7C7C,0x6549,0x7C91,0x7C9D,0x7C9C, + 0x7C9E,0x7CA2,0x7CB2,0x7CBC,0x7CBD,0x7CC1,0x7CC7,0x7CCC, + 0x7CCD,0x7CC8,0x7CC5,0x7CD7,0x7CE8,0x826E,0x66A8,0x7FBF, + 0x7FCE,0x7FD5,0x7FE5,0x7FE1,0x7FE6,0x7FE9,0x7FEE,0x7FF3, + 0x7CF8,0x7D77,0x7DA6,0x7DAE,0x7E47,0x7E9B,0x9EB8,0x9EB4, + 0x8D73,0x8D84,0x8D94,0x8D91,0x8DB1,0x8D67,0x8D6D,0x8C47, + 0x8C49,0x914A,0x9150,0x914E,0x914F,0x9164, + }, + {0x9B7C,0x9B7D,0x9B7E,0x9B7F,0x9B80,0x9B81,0x9B82,0x9B83, + 0x9B84,0x9B85,0x9B86,0x9B87,0x9B88,0x9B89,0x9B8A,0x9B8B, + 0x9B8C,0x9B8D,0x9B8E,0x9B8F,0x9B90,0x9B91,0x9B92,0x9B93, + 0x9B94,0x9B95,0x9B96,0x9B97,0x9B98,0x9B99,0x9B9A,0x9B9B, + 0x9B9C,0x9B9D,0x9B9E,0x9B9F,0x9BA0,0x9BA1,0x9BA2,0x9BA3, + 0x9BA4,0x9BA5,0x9BA6,0x9BA7,0x9BA8,0x9BA9,0x9BAA,0x9BAB, + 0x9BAC,0x9BAD,0x9BAE,0x9BAF,0x9BB0,0x9BB1,0x9BB2,0x9BB3, + 0x9BB4,0x9BB5,0x9BB6,0x9BB7,0x9BB8,0x9BB9,0x9BBA,0x9BBB, + 0x9BBC,0x9BBD,0x9BBE,0x9BBF,0x9BC0,0x9BC1,0x9BC2,0x9BC3, + 0x9BC4,0x9BC5,0x9BC6,0x9BC7,0x9BC8,0x9BC9,0x9BCA,0x9BCB, + 0x9BCC,0x9BCD,0x9BCE,0x9BCF,0x9BD0,0x9BD1,0x9BD2,0x9BD3, + 0x9BD4,0x9BD5,0x9BD6,0x9BD7,0x9BD8,0x9BD9,0x9BDA,0x9BDB, + 0x9162,0x9161,0x9170,0x9169,0x916F,0x917D,0x917E,0x9172, + 0x9174,0x9179,0x918C,0x9185,0x9190,0x918D,0x9191,0x91A2, + 0x91A3,0x91AA,0x91AD,0x91AE,0x91AF,0x91B5,0x91B4,0x91BA, + 0x8C55,0x9E7E,0x8DB8,0x8DEB,0x8E05,0x8E59,0x8E69,0x8DB5, + 0x8DBF,0x8DBC,0x8DBA,0x8DC4,0x8DD6,0x8DD7,0x8DDA,0x8DDE, + 0x8DCE,0x8DCF,0x8DDB,0x8DC6,0x8DEC,0x8DF7,0x8DF8,0x8DE3, + 0x8DF9,0x8DFB,0x8DE4,0x8E09,0x8DFD,0x8E14,0x8E1D,0x8E1F, + 0x8E2C,0x8E2E,0x8E23,0x8E2F,0x8E3A,0x8E40,0x8E39,0x8E35, + 0x8E3D,0x8E31,0x8E49,0x8E41,0x8E42,0x8E51,0x8E52,0x8E4A, + 0x8E70,0x8E76,0x8E7C,0x8E6F,0x8E74,0x8E85,0x8E8F,0x8E94, + 0x8E90,0x8E9C,0x8E9E,0x8C78,0x8C82,0x8C8A,0x8C85,0x8C98, + 0x8C94,0x659B,0x89D6,0x89DE,0x89DA,0x89DC, + }, + {0x9BDC,0x9BDD,0x9BDE,0x9BDF,0x9BE0,0x9BE1,0x9BE2,0x9BE3, + 0x9BE4,0x9BE5,0x9BE6,0x9BE7,0x9BE8,0x9BE9,0x9BEA,0x9BEB, + 0x9BEC,0x9BED,0x9BEE,0x9BEF,0x9BF0,0x9BF1,0x9BF2,0x9BF3, + 0x9BF4,0x9BF5,0x9BF6,0x9BF7,0x9BF8,0x9BF9,0x9BFA,0x9BFB, + 0x9BFC,0x9BFD,0x9BFE,0x9BFF,0x9C00,0x9C01,0x9C02,0x9C03, + 0x9C04,0x9C05,0x9C06,0x9C07,0x9C08,0x9C09,0x9C0A,0x9C0B, + 0x9C0C,0x9C0D,0x9C0E,0x9C0F,0x9C10,0x9C11,0x9C12,0x9C13, + 0x9C14,0x9C15,0x9C16,0x9C17,0x9C18,0x9C19,0x9C1A,0x9C1B, + 0x9C1C,0x9C1D,0x9C1E,0x9C1F,0x9C20,0x9C21,0x9C22,0x9C23, + 0x9C24,0x9C25,0x9C26,0x9C27,0x9C28,0x9C29,0x9C2A,0x9C2B, + 0x9C2C,0x9C2D,0x9C2E,0x9C2F,0x9C30,0x9C31,0x9C32,0x9C33, + 0x9C34,0x9C35,0x9C36,0x9C37,0x9C38,0x9C39,0x9C3A,0x9C3B, + 0x89E5,0x89EB,0x89EF,0x8A3E,0x8B26,0x9753,0x96E9,0x96F3, + 0x96EF,0x9706,0x9701,0x9708,0x970F,0x970E,0x972A,0x972D, + 0x9730,0x973E,0x9F80,0x9F83,0x9F85,0x9F86,0x9F87,0x9F88, + 0x9F89,0x9F8A,0x9F8C,0x9EFE,0x9F0B,0x9F0D,0x96B9,0x96BC, + 0x96BD,0x96CE,0x96D2,0x77BF,0x96E0,0x928E,0x92AE,0x92C8, + 0x933E,0x936A,0x93CA,0x938F,0x943E,0x946B,0x9C7F,0x9C82, + 0x9C85,0x9C86,0x9C87,0x9C88,0x7A23,0x9C8B,0x9C8E,0x9C90, + 0x9C91,0x9C92,0x9C94,0x9C95,0x9C9A,0x9C9B,0x9C9E,0x9C9F, + 0x9CA0,0x9CA1,0x9CA2,0x9CA3,0x9CA5,0x9CA6,0x9CA7,0x9CA8, + 0x9CA9,0x9CAB,0x9CAD,0x9CAE,0x9CB0,0x9CB1,0x9CB2,0x9CB3, + 0x9CB4,0x9CB5,0x9CB6,0x9CB7,0x9CBA,0x9CBB,0x9CBC,0x9CBD, + 0x9CC4,0x9CC5,0x9CC6,0x9CC7,0x9CCA,0x9CCB, + }, + {0x9C3C,0x9C3D,0x9C3E,0x9C3F,0x9C40,0x9C41,0x9C42,0x9C43, + 0x9C44,0x9C45,0x9C46,0x9C47,0x9C48,0x9C49,0x9C4A,0x9C4B, + 0x9C4C,0x9C4D,0x9C4E,0x9C4F,0x9C50,0x9C51,0x9C52,0x9C53, + 0x9C54,0x9C55,0x9C56,0x9C57,0x9C58,0x9C59,0x9C5A,0x9C5B, + 0x9C5C,0x9C5D,0x9C5E,0x9C5F,0x9C60,0x9C61,0x9C62,0x9C63, + 0x9C64,0x9C65,0x9C66,0x9C67,0x9C68,0x9C69,0x9C6A,0x9C6B, + 0x9C6C,0x9C6D,0x9C6E,0x9C6F,0x9C70,0x9C71,0x9C72,0x9C73, + 0x9C74,0x9C75,0x9C76,0x9C77,0x9C78,0x9C79,0x9C7A,0x9C7B, + 0x9C7D,0x9C7E,0x9C80,0x9C83,0x9C84,0x9C89,0x9C8A,0x9C8C, + 0x9C8F,0x9C93,0x9C96,0x9C97,0x9C98,0x9C99,0x9C9D,0x9CAA, + 0x9CAC,0x9CAF,0x9CB9,0x9CBE,0x9CBF,0x9CC0,0x9CC1,0x9CC2, + 0x9CC8,0x9CC9,0x9CD1,0x9CD2,0x9CDA,0x9CDB,0x9CE0,0x9CE1, + 0x9CCC,0x9CCD,0x9CCE,0x9CCF,0x9CD0,0x9CD3,0x9CD4,0x9CD5, + 0x9CD7,0x9CD8,0x9CD9,0x9CDC,0x9CDD,0x9CDF,0x9CE2,0x977C, + 0x9785,0x9791,0x9792,0x9794,0x97AF,0x97AB,0x97A3,0x97B2, + 0x97B4,0x9AB1,0x9AB0,0x9AB7,0x9E58,0x9AB6,0x9ABA,0x9ABC, + 0x9AC1,0x9AC0,0x9AC5,0x9AC2,0x9ACB,0x9ACC,0x9AD1,0x9B45, + 0x9B43,0x9B47,0x9B49,0x9B48,0x9B4D,0x9B51,0x98E8,0x990D, + 0x992E,0x9955,0x9954,0x9ADF,0x9AE1,0x9AE6,0x9AEF,0x9AEB, + 0x9AFB,0x9AED,0x9AF9,0x9B08,0x9B0F,0x9B13,0x9B1F,0x9B23, + 0x9EBD,0x9EBE,0x7E3B,0x9E82,0x9E87,0x9E88,0x9E8B,0x9E92, + 0x93D6,0x9E9D,0x9E9F,0x9EDB,0x9EDC,0x9EDD,0x9EE0,0x9EDF, + 0x9EE2,0x9EE9,0x9EE7,0x9EE5,0x9EEA,0x9EEF,0x9F22,0x9F2C, + 0x9F2F,0x9F39,0x9F37,0x9F3D,0x9F3E,0x9F44, + }, + {0x9CE3,0x9CE4,0x9CE5,0x9CE6,0x9CE7,0x9CE8,0x9CE9,0x9CEA, + 0x9CEB,0x9CEC,0x9CED,0x9CEE,0x9CEF,0x9CF0,0x9CF1,0x9CF2, + 0x9CF3,0x9CF4,0x9CF5,0x9CF6,0x9CF7,0x9CF8,0x9CF9,0x9CFA, + 0x9CFB,0x9CFC,0x9CFD,0x9CFE,0x9CFF,0x9D00,0x9D01,0x9D02, + 0x9D03,0x9D04,0x9D05,0x9D06,0x9D07,0x9D08,0x9D09,0x9D0A, + 0x9D0B,0x9D0C,0x9D0D,0x9D0E,0x9D0F,0x9D10,0x9D11,0x9D12, + 0x9D13,0x9D14,0x9D15,0x9D16,0x9D17,0x9D18,0x9D19,0x9D1A, + 0x9D1B,0x9D1C,0x9D1D,0x9D1E,0x9D1F,0x9D20,0x9D21,0x9D22, + 0x9D23,0x9D24,0x9D25,0x9D26,0x9D27,0x9D28,0x9D29,0x9D2A, + 0x9D2B,0x9D2C,0x9D2D,0x9D2E,0x9D2F,0x9D30,0x9D31,0x9D32, + 0x9D33,0x9D34,0x9D35,0x9D36,0x9D37,0x9D38,0x9D39,0x9D3A, + 0x9D3B,0x9D3C,0x9D3D,0x9D3E,0x9D3F,0x9D40,0x9D41,0x9D42, + 0xE234,0xE235,0xE236,0xE237,0xE238,0xE239,0xE23A,0xE23B, + 0xE23C,0xE23D,0xE23E,0xE23F,0xE240,0xE241,0xE242,0xE243, + 0xE244,0xE245,0xE246,0xE247,0xE248,0xE249,0xE24A,0xE24B, + 0xE24C,0xE24D,0xE24E,0xE24F,0xE250,0xE251,0xE252,0xE253, + 0xE254,0xE255,0xE256,0xE257,0xE258,0xE259,0xE25A,0xE25B, + 0xE25C,0xE25D,0xE25E,0xE25F,0xE260,0xE261,0xE262,0xE263, + 0xE264,0xE265,0xE266,0xE267,0xE268,0xE269,0xE26A,0xE26B, + 0xE26C,0xE26D,0xE26E,0xE26F,0xE270,0xE271,0xE272,0xE273, + 0xE274,0xE275,0xE276,0xE277,0xE278,0xE279,0xE27A,0xE27B, + 0xE27C,0xE27D,0xE27E,0xE27F,0xE280,0xE281,0xE282,0xE283, + 0xE284,0xE285,0xE286,0xE287,0xE288,0xE289,0xE28A,0xE28B, + 0xE28C,0xE28D,0xE28E,0xE28F,0xE290,0xE291, + }, + {0x9D43,0x9D44,0x9D45,0x9D46,0x9D47,0x9D48,0x9D49,0x9D4A, + 0x9D4B,0x9D4C,0x9D4D,0x9D4E,0x9D4F,0x9D50,0x9D51,0x9D52, + 0x9D53,0x9D54,0x9D55,0x9D56,0x9D57,0x9D58,0x9D59,0x9D5A, + 0x9D5B,0x9D5C,0x9D5D,0x9D5E,0x9D5F,0x9D60,0x9D61,0x9D62, + 0x9D63,0x9D64,0x9D65,0x9D66,0x9D67,0x9D68,0x9D69,0x9D6A, + 0x9D6B,0x9D6C,0x9D6D,0x9D6E,0x9D6F,0x9D70,0x9D71,0x9D72, + 0x9D73,0x9D74,0x9D75,0x9D76,0x9D77,0x9D78,0x9D79,0x9D7A, + 0x9D7B,0x9D7C,0x9D7D,0x9D7E,0x9D7F,0x9D80,0x9D81,0x9D82, + 0x9D83,0x9D84,0x9D85,0x9D86,0x9D87,0x9D88,0x9D89,0x9D8A, + 0x9D8B,0x9D8C,0x9D8D,0x9D8E,0x9D8F,0x9D90,0x9D91,0x9D92, + 0x9D93,0x9D94,0x9D95,0x9D96,0x9D97,0x9D98,0x9D99,0x9D9A, + 0x9D9B,0x9D9C,0x9D9D,0x9D9E,0x9D9F,0x9DA0,0x9DA1,0x9DA2, + 0xE292,0xE293,0xE294,0xE295,0xE296,0xE297,0xE298,0xE299, + 0xE29A,0xE29B,0xE29C,0xE29D,0xE29E,0xE29F,0xE2A0,0xE2A1, + 0xE2A2,0xE2A3,0xE2A4,0xE2A5,0xE2A6,0xE2A7,0xE2A8,0xE2A9, + 0xE2AA,0xE2AB,0xE2AC,0xE2AD,0xE2AE,0xE2AF,0xE2B0,0xE2B1, + 0xE2B2,0xE2B3,0xE2B4,0xE2B5,0xE2B6,0xE2B7,0xE2B8,0xE2B9, + 0xE2BA,0xE2BB,0xE2BC,0xE2BD,0xE2BE,0xE2BF,0xE2C0,0xE2C1, + 0xE2C2,0xE2C3,0xE2C4,0xE2C5,0xE2C6,0xE2C7,0xE2C8,0xE2C9, + 0xE2CA,0xE2CB,0xE2CC,0xE2CD,0xE2CE,0xE2CF,0xE2D0,0xE2D1, + 0xE2D2,0xE2D3,0xE2D4,0xE2D5,0xE2D6,0xE2D7,0xE2D8,0xE2D9, + 0xE2DA,0xE2DB,0xE2DC,0xE2DD,0xE2DE,0xE2DF,0xE2E0,0xE2E1, + 0xE2E2,0xE2E3,0xE2E4,0xE2E5,0xE2E6,0xE2E7,0xE2E8,0xE2E9, + 0xE2EA,0xE2EB,0xE2EC,0xE2ED,0xE2EE,0xE2EF, + }, + {0x9DA3,0x9DA4,0x9DA5,0x9DA6,0x9DA7,0x9DA8,0x9DA9,0x9DAA, + 0x9DAB,0x9DAC,0x9DAD,0x9DAE,0x9DAF,0x9DB0,0x9DB1,0x9DB2, + 0x9DB3,0x9DB4,0x9DB5,0x9DB6,0x9DB7,0x9DB8,0x9DB9,0x9DBA, + 0x9DBB,0x9DBC,0x9DBD,0x9DBE,0x9DBF,0x9DC0,0x9DC1,0x9DC2, + 0x9DC3,0x9DC4,0x9DC5,0x9DC6,0x9DC7,0x9DC8,0x9DC9,0x9DCA, + 0x9DCB,0x9DCC,0x9DCD,0x9DCE,0x9DCF,0x9DD0,0x9DD1,0x9DD2, + 0x9DD3,0x9DD4,0x9DD5,0x9DD6,0x9DD7,0x9DD8,0x9DD9,0x9DDA, + 0x9DDB,0x9DDC,0x9DDD,0x9DDE,0x9DDF,0x9DE0,0x9DE1,0x9DE2, + 0x9DE3,0x9DE4,0x9DE5,0x9DE6,0x9DE7,0x9DE8,0x9DE9,0x9DEA, + 0x9DEB,0x9DEC,0x9DED,0x9DEE,0x9DEF,0x9DF0,0x9DF1,0x9DF2, + 0x9DF3,0x9DF4,0x9DF5,0x9DF6,0x9DF7,0x9DF8,0x9DF9,0x9DFA, + 0x9DFB,0x9DFC,0x9DFD,0x9DFE,0x9DFF,0x9E00,0x9E01,0x9E02, + 0xE2F0,0xE2F1,0xE2F2,0xE2F3,0xE2F4,0xE2F5,0xE2F6,0xE2F7, + 0xE2F8,0xE2F9,0xE2FA,0xE2FB,0xE2FC,0xE2FD,0xE2FE,0xE2FF, + 0xE300,0xE301,0xE302,0xE303,0xE304,0xE305,0xE306,0xE307, + 0xE308,0xE309,0xE30A,0xE30B,0xE30C,0xE30D,0xE30E,0xE30F, + 0xE310,0xE311,0xE312,0xE313,0xE314,0xE315,0xE316,0xE317, + 0xE318,0xE319,0xE31A,0xE31B,0xE31C,0xE31D,0xE31E,0xE31F, + 0xE320,0xE321,0xE322,0xE323,0xE324,0xE325,0xE326,0xE327, + 0xE328,0xE329,0xE32A,0xE32B,0xE32C,0xE32D,0xE32E,0xE32F, + 0xE330,0xE331,0xE332,0xE333,0xE334,0xE335,0xE336,0xE337, + 0xE338,0xE339,0xE33A,0xE33B,0xE33C,0xE33D,0xE33E,0xE33F, + 0xE340,0xE341,0xE342,0xE343,0xE344,0xE345,0xE346,0xE347, + 0xE348,0xE349,0xE34A,0xE34B,0xE34C,0xE34D, + }, + {0x9E03,0x9E04,0x9E05,0x9E06,0x9E07,0x9E08,0x9E09,0x9E0A, + 0x9E0B,0x9E0C,0x9E0D,0x9E0E,0x9E0F,0x9E10,0x9E11,0x9E12, + 0x9E13,0x9E14,0x9E15,0x9E16,0x9E17,0x9E18,0x9E19,0x9E1A, + 0x9E1B,0x9E1C,0x9E1D,0x9E1E,0x9E24,0x9E27,0x9E2E,0x9E30, + 0x9E34,0x9E3B,0x9E3C,0x9E40,0x9E4D,0x9E50,0x9E52,0x9E53, + 0x9E54,0x9E56,0x9E59,0x9E5D,0x9E5F,0x9E60,0x9E61,0x9E62, + 0x9E65,0x9E6E,0x9E6F,0x9E72,0x9E74,0x9E75,0x9E76,0x9E77, + 0x9E78,0x9E79,0x9E7A,0x9E7B,0x9E7C,0x9E7D,0x9E80,0x9E81, + 0x9E83,0x9E84,0x9E85,0x9E86,0x9E89,0x9E8A,0x9E8C,0x9E8D, + 0x9E8E,0x9E8F,0x9E90,0x9E91,0x9E94,0x9E95,0x9E96,0x9E97, + 0x9E98,0x9E99,0x9E9A,0x9E9B,0x9E9C,0x9E9E,0x9EA0,0x9EA1, + 0x9EA2,0x9EA3,0x9EA4,0x9EA5,0x9EA7,0x9EA8,0x9EA9,0x9EAA, + 0xE34E,0xE34F,0xE350,0xE351,0xE352,0xE353,0xE354,0xE355, + 0xE356,0xE357,0xE358,0xE359,0xE35A,0xE35B,0xE35C,0xE35D, + 0xE35E,0xE35F,0xE360,0xE361,0xE362,0xE363,0xE364,0xE365, + 0xE366,0xE367,0xE368,0xE369,0xE36A,0xE36B,0xE36C,0xE36D, + 0xE36E,0xE36F,0xE370,0xE371,0xE372,0xE373,0xE374,0xE375, + 0xE376,0xE377,0xE378,0xE379,0xE37A,0xE37B,0xE37C,0xE37D, + 0xE37E,0xE37F,0xE380,0xE381,0xE382,0xE383,0xE384,0xE385, + 0xE386,0xE387,0xE388,0xE389,0xE38A,0xE38B,0xE38C,0xE38D, + 0xE38E,0xE38F,0xE390,0xE391,0xE392,0xE393,0xE394,0xE395, + 0xE396,0xE397,0xE398,0xE399,0xE39A,0xE39B,0xE39C,0xE39D, + 0xE39E,0xE39F,0xE3A0,0xE3A1,0xE3A2,0xE3A3,0xE3A4,0xE3A5, + 0xE3A6,0xE3A7,0xE3A8,0xE3A9,0xE3AA,0xE3AB, + }, + {0x9EAB,0x9EAC,0x9EAD,0x9EAE,0x9EAF,0x9EB0,0x9EB1,0x9EB2, + 0x9EB3,0x9EB5,0x9EB6,0x9EB7,0x9EB9,0x9EBA,0x9EBC,0x9EBF, + 0x9EC0,0x9EC1,0x9EC2,0x9EC3,0x9EC5,0x9EC6,0x9EC7,0x9EC8, + 0x9ECA,0x9ECB,0x9ECC,0x9ED0,0x9ED2,0x9ED3,0x9ED5,0x9ED6, + 0x9ED7,0x9ED9,0x9EDA,0x9EDE,0x9EE1,0x9EE3,0x9EE4,0x9EE6, + 0x9EE8,0x9EEB,0x9EEC,0x9EED,0x9EEE,0x9EF0,0x9EF1,0x9EF2, + 0x9EF3,0x9EF4,0x9EF5,0x9EF6,0x9EF7,0x9EF8,0x9EFA,0x9EFD, + 0x9EFF,0x9F00,0x9F01,0x9F02,0x9F03,0x9F04,0x9F05,0x9F06, + 0x9F07,0x9F08,0x9F09,0x9F0A,0x9F0C,0x9F0F,0x9F11,0x9F12, + 0x9F14,0x9F15,0x9F16,0x9F18,0x9F1A,0x9F1B,0x9F1C,0x9F1D, + 0x9F1E,0x9F1F,0x9F21,0x9F23,0x9F24,0x9F25,0x9F26,0x9F27, + 0x9F28,0x9F29,0x9F2A,0x9F2B,0x9F2D,0x9F2E,0x9F30,0x9F31, + 0xE3AC,0xE3AD,0xE3AE,0xE3AF,0xE3B0,0xE3B1,0xE3B2,0xE3B3, + 0xE3B4,0xE3B5,0xE3B6,0xE3B7,0xE3B8,0xE3B9,0xE3BA,0xE3BB, + 0xE3BC,0xE3BD,0xE3BE,0xE3BF,0xE3C0,0xE3C1,0xE3C2,0xE3C3, + 0xE3C4,0xE3C5,0xE3C6,0xE3C7,0xE3C8,0xE3C9,0xE3CA,0xE3CB, + 0xE3CC,0xE3CD,0xE3CE,0xE3CF,0xE3D0,0xE3D1,0xE3D2,0xE3D3, + 0xE3D4,0xE3D5,0xE3D6,0xE3D7,0xE3D8,0xE3D9,0xE3DA,0xE3DB, + 0xE3DC,0xE3DD,0xE3DE,0xE3DF,0xE3E0,0xE3E1,0xE3E2,0xE3E3, + 0xE3E4,0xE3E5,0xE3E6,0xE3E7,0xE3E8,0xE3E9,0xE3EA,0xE3EB, + 0xE3EC,0xE3ED,0xE3EE,0xE3EF,0xE3F0,0xE3F1,0xE3F2,0xE3F3, + 0xE3F4,0xE3F5,0xE3F6,0xE3F7,0xE3F8,0xE3F9,0xE3FA,0xE3FB, + 0xE3FC,0xE3FD,0xE3FE,0xE3FF,0xE400,0xE401,0xE402,0xE403, + 0xE404,0xE405,0xE406,0xE407,0xE408,0xE409, + }, + {0x9F32,0x9F33,0x9F34,0x9F35,0x9F36,0x9F38,0x9F3A,0x9F3C, + 0x9F3F,0x9F40,0x9F41,0x9F42,0x9F43,0x9F45,0x9F46,0x9F47, + 0x9F48,0x9F49,0x9F4A,0x9F4B,0x9F4C,0x9F4D,0x9F4E,0x9F4F, + 0x9F52,0x9F53,0x9F54,0x9F55,0x9F56,0x9F57,0x9F58,0x9F59, + 0x9F5A,0x9F5B,0x9F5C,0x9F5D,0x9F5E,0x9F5F,0x9F60,0x9F61, + 0x9F62,0x9F63,0x9F64,0x9F65,0x9F66,0x9F67,0x9F68,0x9F69, + 0x9F6A,0x9F6B,0x9F6C,0x9F6D,0x9F6E,0x9F6F,0x9F70,0x9F71, + 0x9F72,0x9F73,0x9F74,0x9F75,0x9F76,0x9F77,0x9F78,0x9F79, + 0x9F7A,0x9F7B,0x9F7C,0x9F7D,0x9F7E,0x9F81,0x9F82,0x9F8D, + 0x9F8E,0x9F8F,0x9F90,0x9F91,0x9F92,0x9F93,0x9F94,0x9F95, + 0x9F96,0x9F97,0x9F98,0x9F9C,0x9F9D,0x9F9E,0x9FA1,0x9FA2, + 0x9FA3,0x9FA4,0x9FA5,0xF92C,0xF979,0xF995,0xF9E7,0xF9F1, + 0xE40A,0xE40B,0xE40C,0xE40D,0xE40E,0xE40F,0xE410,0xE411, + 0xE412,0xE413,0xE414,0xE415,0xE416,0xE417,0xE418,0xE419, + 0xE41A,0xE41B,0xE41C,0xE41D,0xE41E,0xE41F,0xE420,0xE421, + 0xE422,0xE423,0xE424,0xE425,0xE426,0xE427,0xE428,0xE429, + 0xE42A,0xE42B,0xE42C,0xE42D,0xE42E,0xE42F,0xE430,0xE431, + 0xE432,0xE433,0xE434,0xE435,0xE436,0xE437,0xE438,0xE439, + 0xE43A,0xE43B,0xE43C,0xE43D,0xE43E,0xE43F,0xE440,0xE441, + 0xE442,0xE443,0xE444,0xE445,0xE446,0xE447,0xE448,0xE449, + 0xE44A,0xE44B,0xE44C,0xE44D,0xE44E,0xE44F,0xE450,0xE451, + 0xE452,0xE453,0xE454,0xE455,0xE456,0xE457,0xE458,0xE459, + 0xE45A,0xE45B,0xE45C,0xE45D,0xE45E,0xE45F,0xE460,0xE461, + 0xE462,0xE463,0xE464,0xE465,0xE466,0xE467, + }, + {0xFA0C,0xFA0D,0xFA0E,0xFA0F,0xFA11,0xFA13,0xFA14,0xFA18, + 0xFA1F,0xFA20,0xFA21,0xFA23,0xFA24,0xFA27,0xFA28,0xFA29, + 0x2E81,0xE816,0xE817,0xE818,0x2E84,0x3473,0x3447,0x2E88, + 0x2E8B,0xE81E,0x359E,0x361A,0x360E,0x2E8C,0x2E97,0x396E, + 0x3918,0xE826,0x39CF,0x39DF,0x3A73,0x39D0,0xE82B,0xE82C, + 0x3B4E,0x3C6E,0x3CE0,0x2EA7,0xE831,0xE832,0x2EAA,0x4056, + 0x415F,0x2EAE,0x4337,0x2EB3,0x2EB6,0x2EB7,0xE83B,0x43B1, + 0x43AC,0x2EBB,0x43DD,0x44D6,0x4661,0x464C,0xE843,0x4723, + 0x4729,0x477C,0x478D,0x2ECA,0x4947,0x497A,0x497D,0x4982, + 0x4983,0x4985,0x4986,0x499F,0x499B,0x49B7,0x49B6,0xE854, + 0xE855,0x4CA3,0x4C9F,0x4CA0,0x4CA1,0x4C77,0x4CA2,0x4D13, + 0x4D14,0x4D15,0x4D16,0x4D17,0x4D18,0x4D19,0x4DAE,0xE864, + 0xE468,0xE469,0xE46A,0xE46B,0xE46C,0xE46D,0xE46E,0xE46F, + 0xE470,0xE471,0xE472,0xE473,0xE474,0xE475,0xE476,0xE477, + 0xE478,0xE479,0xE47A,0xE47B,0xE47C,0xE47D,0xE47E,0xE47F, + 0xE480,0xE481,0xE482,0xE483,0xE484,0xE485,0xE486,0xE487, + 0xE488,0xE489,0xE48A,0xE48B,0xE48C,0xE48D,0xE48E,0xE48F, + 0xE490,0xE491,0xE492,0xE493,0xE494,0xE495,0xE496,0xE497, + 0xE498,0xE499,0xE49A,0xE49B,0xE49C,0xE49D,0xE49E,0xE49F, + 0xE4A0,0xE4A1,0xE4A2,0xE4A3,0xE4A4,0xE4A5,0xE4A6,0xE4A7, + 0xE4A8,0xE4A9,0xE4AA,0xE4AB,0xE4AC,0xE4AD,0xE4AE,0xE4AF, + 0xE4B0,0xE4B1,0xE4B2,0xE4B3,0xE4B4,0xE4B5,0xE4B6,0xE4B7, + 0xE4B8,0xE4B9,0xE4BA,0xE4BB,0xE4BC,0xE4BD,0xE4BE,0xE4BF, + 0xE4C0,0xE4C1,0xE4C2,0xE4C3,0xE4C4,0xE4C5, + } +}; + +#endif /* RD_GB18030_TABLE_H */ diff --git a/patch_v2/reader_app/core/rdenc.c b/patch_v2/reader_app/core/rdenc.c new file mode 100644 index 0000000..6ab554d --- /dev/null +++ b/patch_v2/reader_app/core/rdenc.c @@ -0,0 +1,274 @@ +/* rdenc.c — 文本编码检测 + GB18030→UTF-8 + UTF-8 工具(实现见 rdenc.h)。 */ +#include "rdenc.h" +#include "gb18030_table.h" +#include +#include + +/* ================= UTF-8 严格校验 ================= */ +int rd_utf8_validate(const uint8_t *buf, size_t len) +{ + size_t i = 0; + while (i < len) { + uint8_t b = buf[i]; + if (b < 0x80) { i++; continue; } + unsigned n, lo, hi; + if ((b & 0xE0) == 0xC0) { n = 2; lo = 0x80; hi = 0xBF; } + else if ((b & 0xF0) == 0xE0) { n = 3; lo = 0x80; hi = 0xBF; } + else if ((b & 0xF8) == 0xF0) { n = 4; lo = 0x80; hi = 0xBF; } + else return 0; + /* 拒绝 overlong / 代理码 / 超 0x10FFFF */ + if (n == 2 && (b & 0xFE) == 0xC0) return 0; /* C0/C1 overlong */ + if (n == 3 && b == 0xE0) lo = 0xA0; /* 防 overlong < U+0800 */ + if (n == 3 && b == 0xED) hi = 0x9F; /* 防代理 U+D800..DFFF */ + if (n == 4 && b == 0xF0) lo = 0x90; /* 防 overlong < U+10000 */ + if (n == 4 && b == 0xF4) hi = 0x8F; /* 防 > U+10FFFF */ + if (i + n > len) return 0; + for (unsigned k = 1; k < n; k++) { + uint8_t c = buf[i + k]; + uint8_t cl = (k == 1) ? (uint8_t)lo : 0x80; + uint8_t ch = (k == 1) ? (uint8_t)hi : 0xBF; + if (c < cl || c > ch) return 0; + } + i += n; + } + return 1; +} + +/* ================= GB18030 双字节 → UTF-8 ================= */ +static inline int gb_trail_ok(unsigned b) +{ + return (b >= 0x40 && b <= 0x7E) || (b >= 0x80 && b <= 0xFE); +} +static inline int gb_col(unsigned b) +{ + /* 列 = b - 0x40 - (b >= 0x80);b 已在合法范围(不含 0x7F) */ + return (int)b - 0x40 - (b >= 0x80); +} +/* 1-3 字节 UTF-8 编码,返回字节数。cp 为 BMP(≤0xFFFF)。 */ +static int enc_utf8(uint32_t cp, uint8_t *o) +{ + if (cp <= 0x7F) { o[0] = (uint8_t)cp; return 1; } + if (cp <= 0x7FF) { + o[0] = (uint8_t)(0xC0 | (cp >> 6)); + o[1] = (uint8_t)(0x80 | (cp & 0x3F)); + return 2; + } + o[0] = (uint8_t)(0xE0 | (cp >> 12)); + o[1] = (uint8_t)(0x80 | ((cp >> 6) & 0x3F)); + o[2] = (uint8_t)(0x80 | (cp & 0x3F)); + return 3; +} +int rd_cp_to_utf8(uint32_t cp, uint8_t out[4]) +{ + if (cp <= 0x7F) { out[0] = (uint8_t)cp; return 1; } + if (cp <= 0x7FF) { + out[0] = (uint8_t)(0xC0 | (cp >> 6)); + out[1] = (uint8_t)(0x80 | (cp & 0x3F)); + return 2; + } + if (cp <= 0xFFFF) { + out[0] = (uint8_t)(0xE0 | (cp >> 12)); + out[1] = (uint8_t)(0x80 | ((cp >> 6) & 0x3F)); + out[2] = (uint8_t)(0x80 | (cp & 0x3F)); + return 3; + } + out[0] = (uint8_t)(0xF0 | (cp >> 18)); + out[1] = (uint8_t)(0x80 | ((cp >> 12) & 0x3F)); + out[2] = (uint8_t)(0x80 | ((cp >> 6) & 0x3F)); + out[3] = (uint8_t)(0x80 | (cp & 0x3F)); + return 4; +} + +int rd_gb18030_to_utf8(const uint8_t *in, size_t inlen, uint8_t *out, size_t outcap, size_t *outlen) +{ + if (!in || !outlen) return RD_ENC_ERR_INVAL; + if (!out && outcap) return RD_ENC_ERR_INVAL; + size_t o = 0; + size_t i = 0; + while (i < inlen) { + uint8_t b = in[i]; + if (b < 0x80) { + if (o + 1 > outcap) { *outlen = o + 1; return RD_ENC_ERR_BUFSZ; } + out[o++] = b; i++; continue; + } + if (b >= 0x81 && b <= 0xFE && i + 1 < inlen) { + uint8_t t = in[i + 1]; + if (gb_trail_ok(t)) { + uint32_t cp = gb_2byte[b - RD_GB_LEAD0][gb_col(t)]; + uint8_t tmp[4]; + int n; + if (cp == 0) { cp = 0xFFFD; } + n = enc_utf8(cp, tmp); + if (o + (size_t)n > outcap) { *outlen = o + (size_t)n; return RD_ENC_ERR_BUFSZ; } + memcpy(out + o, tmp, (size_t)n); o += (size_t)n; + i += 2; continue; + } + if (t >= 0x30 && t <= 0x39) { /* 4 字节扩展段 → 跳 4 字节 + U+FFFD */ + if (i + 4 > inlen) { /* 残缺:只跳可用部分 */ + uint8_t tmp[4]; int n = enc_utf8(0xFFFD, tmp); + if (o + (size_t)n > outcap) { *outlen = o + (size_t)n; return RD_ENC_ERR_BUFSZ; } + memcpy(out + o, tmp, (size_t)n); o += (size_t)n; + i = inlen; break; + } + uint8_t tmp[4]; int n = enc_utf8(0xFFFD, tmp); + if (o + (size_t)n > outcap) { *outlen = o + (size_t)n; return RD_ENC_ERR_BUFSZ; } + memcpy(out + o, tmp, (size_t)n); o += (size_t)n; + i += 4; continue; + } + } + /* 非法首字节 / 尾字节不成对 → U+FFFD */ + { + uint8_t tmp[4]; int n = enc_utf8(0xFFFD, tmp); + if (o + (size_t)n > outcap) { *outlen = o + (size_t)n; return RD_ENC_ERR_BUFSZ; } + memcpy(out + o, tmp, (size_t)n); o += (size_t)n; + i++; continue; + } + } + *outlen = o; + return RD_ENC_OK; +} + +/* ================= 编码检测 ================= */ +static inline int gb_trail_q(unsigned b) +{ + return (b >= 0x40 && b <= 0x7E) || (b >= 0x80 && b <= 0xFE); +} +static inline int big5_trail_q(unsigned b) +{ + return (b >= 0x40 && b <= 0x7E) || (b >= 0xA1 && b <= 0xFE); +} + +rd_enc_t rd_enc_detect(const uint8_t *buf, size_t len, rd_enc_stats *st) +{ + if (st) { st->gb_pairs = st->big5_pairs = st->stray = 0; } + if (!buf || len == 0) return RD_ENC_ASCII; + + /* 1) BOM */ + if (len >= 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF) return RD_ENC_UTF8; + if (len >= 2 && buf[0] == 0xFF && buf[1] == 0xFE) return RD_ENC_UTF16LE; + if (len >= 2 && buf[0] == 0xFE && buf[1] == 0xFF) return RD_ENC_UTF16BE; + + /* 2) 严格 UTF-8 */ + if (rd_utf8_validate(buf, len)) { + /* 纯 ASCII 判 ASCII(信息性;UTF-8 子集) */ + int ascii = 1; + for (size_t i = 0; i < len; i++) if (buf[i] >= 0x80) { ascii = 0; break; } + return ascii ? RD_ENC_ASCII : RD_ENC_UTF8; + } + + /* 3) 双字节区段统计(GB18030 兼容 GBK;Big5 尾字节不同)。 + * GB 有效 = 码表 gb_2byte 查到非 0(GBK/GB18030 已映射码位); + * Big5 专属 = 结构上 Big5 合法、但对 GB 码表无效(Big5 独有码位)。 + * 二者比较更可靠(结构上每个 GBK 双字节对也是合法 Big5 结构,无法区分)。 */ + long gb = 0, big5 = 0, stray = 0; + for (size_t i = 0; i < len; ) { + uint8_t b = buf[i]; + if (b < 0x80) { i++; continue; } + if (b >= 0x81 && b <= 0xFE && i + 1 < len) { + uint8_t t = buf[i + 1]; + int gb_ok = gb_trail_q(t) && + gb_2byte[b - RD_GB_LEAD0][gb_col(t)] != 0; + int b5_ok = big5_trail_q(t); + if (gb_ok) gb++; + if (b5_ok && !gb_ok) big5++; /* Big5 专属:GB 码表无效 */ + i += 2; continue; + } + stray++; i++; + } + if (st) { st->gb_pairs = gb; st->big5_pairs = big5; st->stray = stray; } + + /* 阈值(经验值):双字节对太少 → 乱码/不确定 → 兜底 GB18030(最常见中文编码)。 + * 注(READER_ENGINE_NOTES §3.5 风险):Big5 与 GB18030 双字节区大量重叠,码表有效性 + * 无法可靠区分(简体 GB2312 文本 trail 0xA1-0xFE 恰是 Big5 trail 区)。R1 双字节一律 + * 按 GB18030 兜底;Big5 经此检测也按 GB18030 试(v1 不转),真实区分需用户手动切编码 + * (列 R2)。 */ + if (gb + big5 < (long)(len / 5)) return RD_ENC_GB18030; + return RD_ENC_GB18030; +} + +/* ================= UTF-16 → UTF-8(简易,BOM 已对齐) ================= */ +static int utf16_to_utf8(rd_enc_t enc, const uint8_t *in, size_t inlen, + uint8_t *out, size_t outcap, size_t *outlen) +{ + int be = (enc == RD_ENC_UTF16BE); + /* 跳过 BOM(2 字节) */ + size_t i = 0; + if (inlen >= 2 && ((be && in[0] == 0xFE && in[1] == 0xFF) || + (!be && in[0] == 0xFF && in[1] == 0xFE))) i = 2; + size_t o = 0; + while (i + 1 < inlen) { + uint32_t u = be ? (((uint32_t)in[i] << 8) | in[i + 1]) + : (((uint32_t)in[i + 1] << 8) | in[i]); + i += 2; + uint32_t cp = u; + if (u >= 0xD800 && u <= 0xDBFF) { /* 高代理 */ + if (i + 1 < inlen) { + uint32_t u2 = be ? (((uint32_t)in[i] << 8) | in[i + 1]) + : (((uint32_t)in[i + 1] << 8) | in[i]); + if (u2 >= 0xDC00 && u2 <= 0xDFFF) { + cp = 0x10000 + ((u - 0xD800) << 10) + (u2 - 0xDC00); + i += 2; + } else cp = 0xFFFD; + } else cp = 0xFFFD; + } else if (u >= 0xDC00 && u <= 0xDFFF) cp = 0xFFFD; /* 孤立低代理 */ + uint8_t tmp[4]; + int n = rd_cp_to_utf8(cp, tmp); + if (o + (size_t)n > outcap) { *outlen = o + (size_t)n; return RD_ENC_ERR_BUFSZ; } + memcpy(out + o, tmp, (size_t)n); o += (size_t)n; + } + *outlen = o; + return RD_ENC_OK; +} + +int rd_to_utf8(rd_enc_t enc, const uint8_t *in, size_t inlen, uint8_t *out, size_t outcap, size_t *outlen) +{ + if (enc == RD_ENC_UTF16LE || enc == RD_ENC_UTF16BE) return utf16_to_utf8(enc, in, inlen, out, outcap, outlen); + if (enc == RD_ENC_UTF8 || enc == RD_ENC_ASCII) { + /* 去 UTF-8 BOM(若有) */ + size_t off = 0; + if (inlen >= 3 && in[0] == 0xEF && in[1] == 0xBB && in[2] == 0xBF) off = 3; + if (inlen - off > outcap) { *outlen = inlen - off; return RD_ENC_ERR_BUFSZ; } + memcpy(out, in + off, inlen - off); *outlen = inlen - off; + return RD_ENC_OK; + } + /* GB18030 / Big5(v1 按 GB18030 试) */ + return rd_gb18030_to_utf8(in, inlen, out, outcap, outlen); +} + +/* ================= UTF-8 → 码点数组 ================= */ +int rd_utf8_to_cp(const uint8_t *utf8, size_t len, uint32_t **cps, size_t *n) +{ + if (!utf8 || !cps || !n) return RD_UTF8_ERR_INVAL; + *cps = NULL; *n = 0; + /* 上界:每个输入字节至多一个码点(单字节 ASCII / 非法的每字节一个 U+FFFD)。 */ + uint32_t *arr = (uint32_t *)malloc((len ? len : 1) * sizeof(uint32_t)); + if (!arr) return RD_UTF8_ERR_NOMEM; + size_t cnt = 0, i = 0; + while (i < len) { + uint8_t b = utf8[i]; + if (b < 0x80) { arr[cnt++] = b; i++; continue; } + unsigned q, lo, hi; + if ((b & 0xE0) == 0xC0) { q = 2; lo = 0x80; hi = 0xBF; } + else if ((b & 0xF0) == 0xE0) { q = 3; lo = 0x80; hi = 0xBF; } + else if ((b & 0xF8) == 0xF0) { q = 4; lo = 0x80; hi = 0xBF; } + else { arr[cnt++] = 0xFFFD; i++; continue; } + if (q == 2 && (b & 0xFE) == 0xC0) { arr[cnt++] = 0xFFFD; i++; continue; } + if (q == 3 && b == 0xE0) lo = 0xA0; + if (q == 3 && b == 0xED) hi = 0x9F; + if (q == 4 && b == 0xF0) lo = 0x90; + if (q == 4 && b == 0xF4) hi = 0x8F; + if (i + q > len) { arr[cnt++] = 0xFFFD; i++; continue; } + uint32_t cp = b & (0xFF >> (q + 1)); + int bad = 0; + for (unsigned k = 1; k < q; k++) { + uint8_t c = utf8[i + k]; + uint8_t cl = (k == 1) ? (uint8_t)lo : 0x80, ch = (k == 1) ? (uint8_t)hi : 0xBF; + if (c < cl || c > ch) { bad = 1; break; } + cp = (cp << 6) | (c & 0x3F); + } + if (bad) { arr[cnt++] = 0xFFFD; i++; continue; } + arr[cnt++] = cp; i += q; + } + *cps = arr; *n = cnt; + return RD_ENC_OK; +} diff --git a/patch_v2/reader_app/core/rdenc.h b/patch_v2/reader_app/core/rdenc.h new file mode 100644 index 0000000..53dffa3 --- /dev/null +++ b/patch_v2/reader_app/core/rdenc.h @@ -0,0 +1,68 @@ +/* rdenc.h — 阅读器文本编码检测 + GB18030→UTF-8 解码 + UTF-8 工具(纯 C,宿主可测)。 + * + * 对齐 devdocs/plan/READER_ENGINE_NOTES.md §3(zLibrary 轻量化:BOM + 严格 UTF-8 + 双字节区段统计, + * 不抄 N-gram 马尔可夫): + * - BOM 优先:FE FF=UTF-16BE、FF FE=UTF-16LE、EF BB BF=UTF-8; + * - 无 BOM → 严格 UTF-8 校验(合法即 UTF-8;ASCII 属 UTF-8 子集); + * - 非 UTF-8 → GB18030(GBK 超集) / Big5 双字节区段统计(阈值经验值,见 READER_ENGINE_NOTES §3.3); + * - **R1 只做 GB18030→UTF-8 双字节映射**(uint16[126][190] 码表),4 字节扩展段 → U+FFFD; + * Big5 检测出来也按 GB18030 试(v1 不转 Big5,正文会乱但可读,注明)。 + * + * 无 SDK 依赖;`#include "gb18030_table.h"`(生成物,见 tools/gen_gb18030_table.py)。 + */ +#ifndef RDENC_H +#define RDENC_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum { + RD_ENC_ASCII = 0, /* 纯 7-bit,无非法字节(UTF-8 子集) */ + RD_ENC_UTF8, + RD_ENC_UTF16LE, + RD_ENC_UTF16BE, + RD_ENC_GB18030, /* GBK 超集(解码器按 2 字节码表) */ + RD_ENC_BIG5, /* v1 检测但按 GB18030 解码 */ +} rd_enc_t; + +/* 检测统计(诊断 + 阈值用;值可为 0)。 */ +typedef struct rd_enc_stats { + long gb_pairs; /* 合法 GB18030/GBK 双字节对计数 */ + long big5_pairs; /* 合法 Big5 双字节对计数 */ + long stray; /* 0x80..0xFF 中无法成对的散落字节 */ +} rd_enc_stats; + +/* 编码检测:对 buf[0..len)(建议前 64KB)返回最可能编码,并填 st(可 NULL)。 */ +rd_enc_t rd_enc_detect(const uint8_t *buf, size_t len, rd_enc_stats *st); + +/* 严格 UTF-8 校验:结构非法即返回 0;合法返回 1(允许含 NUL?不,遇 NUL 提前停)。 */ +int rd_utf8_validate(const uint8_t *buf, size_t len); + +/* GB18030(GBK) 双字节 → UTF-8。成功 0;输出不足 RD_ENC_ERR_BUFSZ 且 *outlen=所需;非法字节→U+FFFD。 + * 4 字节扩展段(lead+0x30..0x39 开头)→ 跳过该 4 字节并输出一个 U+FFFD。 */ +#define RD_ENC_OK 0 +#define RD_ENC_ERR_INVAL -1 /* 参数非法 */ +#define RD_ENC_ERR_BUFSZ -2 /* out 不足;*outlen 已填所需 */ +int rd_gb18030_to_utf8(const uint8_t *in, size_t inlen, uint8_t *out, size_t outcap, size_t *outlen); + +/* UTF-8 → 码点数组(布局用;malloc 分配 *cps,调用方 free)。成功 0。 *n = 码点数。 + * 非法序列按一个 U+FFFD 收(宽松);len 为输入字节长。 */ +#define RD_UTF8_ERR_INVAL -1 +#define RD_UTF8_ERR_NOMEM -2 +int rd_utf8_to_cp(const uint8_t *utf8, size_t len, uint32_t **cps, size_t *n); + +/* 码点 → UTF-8(写 out,返回写入字节数;out 须 ≥4 字节)。 */ +int rd_cp_to_utf8(uint32_t cp, uint8_t out[4]); + +/* 通用:任意检测编码 → UTF-8(rdenc 已知的各编码)。UTF-16LE/BE 走简易 BOM 对齐 + 码点转换; + * Big5 v1 按 GB18030 双字节表转(会乱但可读,注明)。返回码同 rd_gb18030_to_utf8。 */ +int rd_to_utf8(rd_enc_t enc, const uint8_t *in, size_t inlen, uint8_t *out, size_t outcap, size_t *outlen); + +#ifdef __cplusplus +} +#endif +#endif /* RDENC_H */ diff --git a/patch_v2/reader_app/core/rdlayout.c b/patch_v2/reader_app/core/rdlayout.c new file mode 100644 index 0000000..3e681a1 --- /dev/null +++ b/patch_v2/reader_app/core/rdlayout.c @@ -0,0 +1,257 @@ +/* rdlayout.c — 流式排版器 core(实现见 rdlayout.h)。纯 C,宿主可测,无 SDK/Freetype 依赖。 + * + * 两遍: + * A) 贪心断行:逐段扫描,记录「最后一个允许断且能放下」的位置;溢出即断; + * Kinsoku 微调(左括号不居行尾 / 右标点不居行首,右标点簇 ≤2 上拉)。 + * *连续* y(含段间距)写入 line.y——仅供分页阶段参考。 + * B) 分页:按行高+段间距累计超内容高断页,得到 pages[](每页 = lines[] 区间 + 首字符偏移); + * 孤行守卫 post-pass:段首行不单独留页底(孤儿上推)。 + */ +#include "rdlayout.h" +#include + +/* ---------- 字符属性 ---------- */ +enum { + RD_CH_SPACE = 1u << 0, + RD_CH_CJK = 1u << 1, + RD_CH_HYPH = 1u << 2, + RD_CH_HARD = 1u << 3, + RD_CH_OPEN = 1u << 4, /* 左括号/前引号:行尾禁断 */ + RD_CH_CLOSE = 1u << 5, /* 右标点:行首禁断 */ + RD_CH_CJKPT = 1u << 6, +}; + +static int is_cjk_wide(uint32_t c) +{ + if (c >= 0x2E80 && c <= 0x2EFF) return 1; + if (c >= 0x3040 && c <= 0x30FF) return 1; + if (c >= 0x3400 && c <= 0x4DBF) return 1; + if (c >= 0x4E00 && c <= 0x9FFF) return 1; + if (c >= 0xF900 && c <= 0xFAFF) return 1; + if (c >= 0xFF00 && c <= 0xFFEF) return 1; + if (c >= 0x20000) return 1; + return 0; +} +static int is_cjk_left_punct(uint32_t c) +{ + switch (c) { + case 0x2018: case 0x201C: + case 0x3008: case 0x300A: case 0x300C: case 0x300E: case 0x3010: + case 0xFF08: + return 1; + default: return 0; + } +} +static int is_cjk_close_punct(uint32_t c) +{ + switch (c) { + case 0x3001: case 0x3002: + case 0xFF01: case 0xFF0C: case 0xFF0E: case 0xFF1A: case 0xFF1B: + case 0xFF1F: + case 0x3009: case 0x300B: case 0x300D: case 0x300F: case 0x3011: + case 0xFF09: + case 0x2026: + return 1; + default: return 0; + } +} +static int is_latin_close(uint32_t c) +{ + return c == ',' || c == '.' || c == ';' || c == ':' || c == '!' || c == '?' || + c == ')' || c == ']' || c == '}' || c == '"' || c == '\''; +} +static int is_latin_open(uint32_t c) +{ + return c == '(' || c == '[' || c == '{' || c == '"' || c == '\''; +} + +static unsigned char_props(uint32_t c) +{ + unsigned f = 0; + if (c == ' ') f |= RD_CH_SPACE; + else if (c == '\n') f |= RD_CH_HARD; + else if (c == 0xAD) f |= RD_CH_HYPH; + if (is_cjk_wide(c)) { + f |= RD_CH_CJK; + if (is_cjk_left_punct(c)) f |= RD_CH_CJKPT | RD_CH_OPEN; + else if (is_cjk_close_punct(c)) f |= RD_CH_CJKPT | RD_CH_CLOSE; + else if ((c >= 0x3000 && c <= 0x303F) || (c >= 0xFF00 && c <= 0xFFEF)) f |= RD_CH_CJKPT; + } else { + if (is_latin_open(c)) f |= RD_CH_OPEN; + else if (is_latin_close(c)) f |= RD_CH_CLOSE; + } + return f; +} + +/* 在 chars[idx](即断点后一整段)后能否断开:左括号不居行尾、右标点不居行首。 */ +static int wrap_ok_after(const uint32_t *ch, int pe, int idx) +{ + if (idx < 0) return 0; + unsigned cur = char_props(ch[idx]); + if (cur & RD_CH_OPEN) return 0; /* 行尾禁:左括号/前引号 */ + if (idx + 1 < pe) { + unsigned nxt = char_props(ch[idx + 1]); + if (nxt & RD_CH_CLOSE) return 0; /* 行首禁:右标点 */ + } + return 1; +} + +static int approx_adv(uint32_t cp, int fs) +{ + if (cp == '\n' || cp == '\r') return 0; + if (cp == ' ' || cp == '\t') return fs * 2 / 3 < 1 ? 1 : fs * 2 / 3; + if (is_cjk_wide(cp)) return fs; + return fs / 2 < 1 ? 1 : fs / 2; +} +static int char_adv(const rd_layout_in *in, uint32_t cp) +{ + int adv = 0; + if (in->meas && in->meas(cp, in->fs, &adv, in->mctx) == 0 && adv >= 0) return adv; + return approx_adv(cp, in->fs); +} + +/* 段内断一行;返回该行后剩余段起点(=line_e;达到段末则 == pe)。 */ +static int para_break_line(const rd_layout_in *in, int pe, int32_t *line_s_in, + int first_line_of_para, rd_line *ln) +{ + int32_t line_s = *line_s_in; + int32_t pos = line_s; + int lastNormal = -1; + int x = 0; + int32_t i = pos; + + while (i < pe) { + uint32_t c = in->chars[i]; + int adv = char_adv(in, c); + if (x + adv > in->page_w && i > line_s) break; /* 溢出断 */ + x += adv; + unsigned f = char_props(c); + if ((f & (RD_CH_SPACE | RD_CH_CJK | RD_CH_HYPH)) && wrap_ok_after(in->chars, pe, i)) lastNormal = i; + i++; + } + + int32_t line_e; + if (i < pe) { /* 溢出 */ + if (lastNormal >= line_s) line_e = lastNormal + 1; + else line_e = (i > line_s) ? i : (line_s + 1 < pe ? line_s + 1 : pe); + } else { + line_e = i; /* 段末自然结束 */ + } + if (line_e <= line_s) line_e = (line_s + 1 < pe) ? line_s + 1 : pe; + + /* Kinsoku 微调(v1 子集) */ + while (line_e > line_s + 1 && is_cjk_left_punct(in->chars[line_e - 1])) line_e--; /* 左括号推下行 */ + if (line_e < pe && is_cjk_close_punct(in->chars[line_e])) { /* 右标点上拉 ≤2 */ + int cnt = 1; + while (line_e + cnt < pe && is_cjk_close_punct(in->chars[line_e + cnt])) cnt++; + int pull = cnt < 3 ? cnt : 2; + while (pull-- > 0 && line_e < pe) line_e++; + } + if (line_e <= line_s) line_e = (line_s + 1 < pe) ? line_s + 1 : pe; + + /* 实际宽 */ + int lw = 0; + for (int32_t k = line_s; k < line_e; k++) lw += char_adv(in, in->chars[k]); + if (lw > in->page_w) lw = in->page_w; + + ln->s = line_s; + ln->e = line_e; + ln->x = first_line_of_para ? in->indent : 0; + ln->w = lw; + ln->para_start = first_line_of_para ? 1 : 0; + ln->para_end = (line_e >= pe) ? 1 : 0; + + *line_s_in = line_e; + return line_e; +} + +int rd_layout(const rd_layout_in *in, rd_layout_out *out) +{ + if (!in || !out || !in->chars || in->n < 0 || !out->lines || !out->pages) return RD_LAYOUT_ERR_INVAL; + if (in->fs <= 0 || in->page_w <= 0 || in->page_h <= 0) return RD_LAYOUT_ERR_INVAL; + + int lh = (in->fs * in->line_scale) / 100; + if (lh < 1) lh = 1; + int pspacing = lh / 2; + if (pspacing < 0) pspacing = 0; + + int nlines = 0, npages = 0; + int y = 0; /* 连续 y(阶段 A;段间距已加) */ + int para_pending = 0; /* 是否已有段落在前(需段间距) */ + int32_t ps = 0; + + while (ps < in->n) { + while (ps < in->n && (in->chars[ps] == '\n' || in->chars[ps] == '\r')) ps++; + if (ps >= in->n) break; + int32_t pe = ps; + while (pe < in->n && in->chars[pe] != '\n') pe++; + + if (para_pending && nlines > 0) y += pspacing; + para_pending = 1; + + int32_t pos = ps; + int first_line = 1; + while (pos < pe) { + rd_line ln; + if (nlines >= out->max_lines) return RD_LAYOUT_ERR_OVER; + para_break_line(in, pe, &pos, first_line, &ln); + ln.y = y; + out->lines[nlines++] = ln; + y += lh; + first_line = 0; + if (ln.para_end) break; + } + ps = pos; + while (ps < in->n && in->chars[ps] == '\n') ps++; + if (pos >= pe && ps >= in->n) break; + } + + /* 阶段 B:分页 */ + if (nlines == 0) { out->nlines = 0; out->npages = 0; return RD_LAYOUT_OK; } + int page_start = 0; + int cur_y = 0; + for (int l = 0; l < nlines; l++) { + int extra = (out->lines[l].para_start && l > page_start) ? pspacing : 0; + int h = lh + extra; + if (cur_y + h > in->page_h && l > page_start) { + int np_start = l; + /* 孤行守卫:上页最后一行是段首行且段未结束 → 该行随段推到下一页 */ + if (l - 1 >= page_start && out->lines[l - 1].para_start && !out->lines[l - 1].para_end) { + np_start = l - 1; + } + if (npages >= out->max_pages) return RD_LAYOUT_ERR_OVER; + out->pages[npages].first_char = out->lines[page_start].s; + out->pages[npages].first_line = page_start; + out->pages[npages].nlines = np_start - page_start; + npages++; + page_start = np_start; + cur_y = 0; + } + /* 重新计算本行在本页的 top(若 page_start 因孤儿调整而变化,extra 需重算) */ + extra = (out->lines[l].para_start && l > page_start) ? pspacing : 0; + out->lines[l].y = cur_y + extra; + cur_y += lh + extra; + } + if (nlines > page_start) { + if (npages >= out->max_pages) return RD_LAYOUT_ERR_OVER; + out->pages[npages].first_char = out->lines[page_start].s; + out->pages[npages].first_line = page_start; + out->pages[npages].nlines = nlines - page_start; + npages++; + } + + out->nlines = nlines; + out->npages = npages; + return RD_LAYOUT_OK; +} + +int rd_layout_page_for_anchor(const rd_layout_out *out, int32_t anchor_char) +{ + if (!out || out->npages <= 0) return 0; + for (int p = 0; p < out->npages; p++) { + int32_t fc = out->pages[p].first_char; + int32_t nfc = (p + 1 < out->npages) ? out->pages[p + 1].first_char : INT32_MAX; + if (anchor_char < nfc && (anchor_char >= fc || p == 0)) return p; + } + return out->npages - 1; +} diff --git a/patch_v2/reader_app/core/rdlayout.h b/patch_v2/reader_app/core/rdlayout.h new file mode 100644 index 0000000..a872164 --- /dev/null +++ b/patch_v2/reader_app/core/rdlayout.h @@ -0,0 +1,75 @@ +/* rdlayout.h — 流式排版器 core:贪心断行 + Kinsoku 避头尾 + 分页 + 重排锚定。 + * + * 对齐 devdocs/plan/READER_ENGINE_NOTES.md §1(crengine lvtextfm 思想,不链库): + * - 贪心断行(非 Knuth-Plass):断点候选 = 空格 / CJK / 软连字符;`\n` 强制换行; + * - Kinsoku 避头尾:字符属性(AVOID_WRAP_AFTER/BEFORE)+ CJK 标点区间(左括号不居行尾、 + * 右标点不居行首,右标点簇 ≤2 位移优先上拉); + * - 分页:行高累计超内容高断页;孤行守卫(段首行不单独留页底)。 + * - 测量由 `rd_meas_fn` 回调提供(设备=FreeType,宿主单测=桩),core 零 SDK/Freetype 依赖。 + * + * 坐标系:输入 chars 为本章/分段码点数组;断行输出在「内容区」坐标(x=0..page_w-1,y=0..page_h-1, + * 外边距/版心外空由调用方裁掉)。首行缩进 = in->indent。 + */ +#ifndef RDLAYOUT_H +#define RDLAYOUT_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 测量:cp→advance 像素。返回 0=成功(*adv 已填,≥0)。 */ +typedef int (*rd_meas_fn)(uint32_t cp, int fs_px, int *adv, void *ctx); + +typedef struct rd_layout_in { + const uint32_t *chars; /* 本章/分段码点数组(调用方持有,layout 不拷贝) */ + int32_t n; /* 码点数 */ + int fs; /* 字号 px */ + int line_scale; /* 行距百分比(100..200):LH = fs*line_scale/100 */ + int page_w; /* 内容区宽 px */ + int page_h; /* 内容区高 px */ + int indent; /* 首行缩进 px */ + rd_meas_fn meas; /* 测量回调(NULL → 用内置近似宽) */ + void *mctx; +} rd_layout_in; + +typedef struct rd_line { + int32_t s, e; /* 本行码点区间 [s,e)(s=行首,e=行尾+1,<= 段结束) */ + int x; /* 行首 x(内容区坐标;首行=indent 否则 0) */ + int y; /* 行顶 y(内容区坐标) */ + int w; /* 已用行宽 px(≤ page_w) */ + uint8_t para_start; /* 1=段的第一个物理行 */ + uint8_t para_end; /* 1=段的最后一个物理行 */ +} rd_line; + +typedef struct rd_page { + int32_t first_char; /* 本页首字符在本章内的偏移(页索引锚) */ + int first_line; /* lines[] 起始下标 */ + int nlines; /* 本页行数 */ +} rd_page; + +typedef struct rd_layout_out { + rd_line *lines; /* 容量 in->...(调用方给) */ + rd_page *pages; /* 容量 in->...(调用方给) */ + int max_lines; + int max_pages; + int nlines; + int npages; +} rd_layout_out; + +#define RD_LAYOUT_OK 0 +#define RD_LAYOUT_ERR_INVAL -1 +#define RD_LAYOUT_ERR_OVER -2 /* lines/pages 容量不足(npages/nlines 已填实际需要) */ + +int rd_layout(const rd_layout_in *in, rd_layout_out *out); + +/* 重排锚定:在 layout 输出里找第一个满足 `line.s <= anchor_char < 下个 line.s` 的**行**所属的页。 + * 返回页下标(0..npages-1);anchor_char 越界 clamp 到首/末页。 */ +int rd_layout_page_for_anchor(const rd_layout_out *out, int32_t anchor_char); + +#ifdef __cplusplus +} +#endif +#endif /* RDLAYOUT_H */ diff --git a/patch_v2/reader_app/core/rdtxt.c b/patch_v2/reader_app/core/rdtxt.c new file mode 100644 index 0000000..3495967 --- /dev/null +++ b/patch_v2/reader_app/core/rdtxt.c @@ -0,0 +1,116 @@ +/* rdtxt.c — TXT 流式加载器(实现见 rdtxt.h)。 */ +#include "rdtxt.h" +#include +#include +#include + +struct rdtxt_reader { + FILE *f; + char path[320]; + rd_enc_t enc; + uint8_t *raw; /* 原始字节块缓冲 */ + size_t rawsz; /* 分配容量 */ + int eof; +}; + +int rdtxt_probe(const char *path, rdtxt_info *info) +{ + if (!path || !info) return -1; + FILE *f = fopen(path, "rb"); + if (!f) return -1; + if (fseek(f, 0, SEEK_END) != 0) { fclose(f); return -2; } + long sz = ftell(f); + if (sz < 0) { fclose(f); return -2; } + fseek(f, 0, SEEK_SET); + + uint8_t buf[65536]; + size_t n = fread(buf, 1, sizeof buf, f); + rd_enc_stats st; + rd_enc_t enc = rd_enc_detect(buf, n, &st); + fclose(f); + + info->enc = enc; + info->file_size = sz; + if (strlen(path) >= sizeof info->path) return -2; + strcpy(info->path, path); + return 0; +} + +int rdtxt_reader_open(const char *path, const rdtxt_info *info, rdtxt_reader **r) +{ + if (!path || !info || !r) return -1; + rdtxt_reader *x = (rdtxt_reader *)calloc(1, sizeof *x); + if (!x) return -6; + x->f = fopen(path, "rb"); + if (!x->f) { free(x); return -1; } + x->raw = (uint8_t *)malloc(RDTXT_SEG_RAW_MAX + 1); + if (!x->raw) { fclose(x->f); free(x); return -6; } + x->rawsz = RDTXT_SEG_RAW_MAX + 1; + if (strlen(path) >= sizeof x->path) { free(x->raw); fclose(x->f); free(x); return -2; } + strcpy(x->path, path); + x->enc = info->enc; + x->eof = 0; + *r = x; + return 0; +} + +void rdtxt_reader_free(rdtxt_reader *r) +{ + if (!r) return; + if (r->f) fclose(r->f); + free(r->raw); + free(r); +} + +const char *rdtxt_reader_path(const rdtxt_reader *r) { return r ? r->path : ""; } +rd_enc_t rdtxt_reader_enc(const rdtxt_reader *r) { return r ? r->enc : RD_ENC_UTF8; } + +int rdtxt_reader_next(rdtxt_reader *r, uint8_t *utf8, size_t cap, + size_t *utf8len, size_t *file_off, size_t *file_len) +{ + if (!r || !utf8 || !utf8len || !file_off || !file_len) return -1; + if (r->eof) return 1; + + long start = ftell(r->f); + if (start < 0) { r->eof = 1; return 1; } + + size_t raw_n = 0; + int got = 0; + while (raw_n < r->rawsz - 1) { + int c = fgetc(r->f); + if (c == EOF) { r->eof = 1; break; } + r->raw[raw_n++] = (uint8_t)c; + got = 1; + /* 段落边界达成目标字节约停止(`\n` 恒为独立换行) */ + if (c == '\n' && raw_n >= RDTXT_SEG_UTF8_MAX / 2) break; + } + if (!got) { r->eof = 1; return 1; } + + size_t outlen = 0; + int rc = rd_to_utf8(r->enc, r->raw, raw_n, utf8, cap, &outlen); + if (rc == RD_ENC_ERR_BUFSZ) return -2; /* 调用方 cap 太小 */ + if (rc != RD_ENC_OK) return -3; + + *utf8len = outlen; + *file_off = (size_t)start; + *file_len = raw_n; + return 0; +} + +int rdtxt_convert_span(const char *path, rd_enc_t enc, size_t raw_off, size_t raw_len, + uint8_t *out, size_t cap, size_t *outlen) +{ + if (!path || !out || !outlen) return -1; + FILE *f = fopen(path, "rb"); + if (!f) return -1; + if (fseek(f, (long)raw_off, SEEK_SET) != 0) { fclose(f); return -2; } + /* 读整段(raw_len ≤ RDTXT_SEG_RAW_MAX,有界) */ + size_t want = raw_len; + uint8_t *tmp = (uint8_t *)malloc(want ? want : 1); + if (!tmp) { fclose(f); return -6; } + size_t got = fread(tmp, 1, want, f); + fclose(f); + int rc = rd_to_utf8(enc, tmp, got, out, cap, outlen); + free(tmp); + return rc; +} diff --git a/patch_v2/reader_app/core/rdtxt.h b/patch_v2/reader_app/core/rdtxt.h new file mode 100644 index 0000000..5c3a2e2 --- /dev/null +++ b/patch_v2/reader_app/core/rdtxt.h @@ -0,0 +1,56 @@ +/* rdtxt.h — TXT 流式加载器(骨架):探测编码 → 按段流式读,不整文件入内存。 + * + * 对齐 READER_ENGINE_NOTES §7 #4:读 `Books/` 下 .txt → 检测编码 → 转 UTF-8 → 按段喂排版器; + * 书签/进度锚定 (章节id,字符偏移)。TXT 段 = 以 `\n` 为界的段落流按目标字节数聚合,段 = + * 一个排版/渲染单元;每段记录 {file_off, file_len, utf8_len},渲染时按 file_off 重定位读回, + * 确定性一致(编码在文件头一次检测,分段/转换仅依赖该编码)。 + * + * `\n`(0x0A) 在 GB18030/GBK/UTF-8/ASCII 中恒为独立控制符(尾字节域 0x40-0x7E|0x80-0xFE 不含 0x0A), + * 故可安全在原始字节层的换行边界分段。纯 C,宿主可测;无 SDK 依赖。 + */ +#ifndef RDTXT_H +#define RDTXT_H + +#include "rdenc.h" +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 段 UTF-8 上限(内存纪律:单段 ≤ 此值;编码源另 ≤ RDTXT_SEG_RAW_MAX)。 */ +#define RDTXT_SEG_UTF8_MAX (96 * 1024) +#define RDTXT_SEG_RAW_MAX (RDTXT_SEG_UTF8_MAX) /* 原始字节软上限 */ + +typedef struct rdtxt_info { + rd_enc_t enc; + long file_size; + char path[320]; +} rdtxt_info; + +/* 探测:打开文件、取大小、检测编码(前 64KB)。成功 0;无文件 -1;非文件 -2。 */ +int rdtxt_probe(const char *path, rdtxt_info *info); + +/* 状态流式读取器 */ +typedef struct rdtxt_reader rdtxt_reader; + +/* 打开(info 须来自 rdtxt_probe)。成功 0;失败负值。 */ +int rdtxt_reader_open(const char *path, const rdtxt_info *info, rdtxt_reader **r); + +/* 读下一段。utf8 缓冲须 ≥ cap(建议 RDTXT_SEG_UTF8_MAX+8)。成功 0(填 utf8len/file_off/file_len); + * 1=EOF 无更多段;负值=错误。 */ +int rdtxt_reader_next(rdtxt_reader *r, uint8_t *utf8, size_t cap, + size_t *utf8len, size_t *file_off, size_t *file_len); +void rdtxt_reader_free(rdtxt_reader *r); +const char *rdtxt_reader_path(const rdtxt_reader *r); +rd_enc_t rdtxt_reader_enc(const rdtxt_reader *r); + +/* 渲染重定位:把文件字节区间 [raw_off, raw_off+raw_len) 转成 UTF-8 到 out(cap 建议同上限)。 */ +int rdtxt_convert_span(const char *path, rd_enc_t enc, size_t raw_off, size_t raw_len, + uint8_t *out, size_t cap, size_t *outlen); + +#ifdef __cplusplus +} +#endif +#endif /* RDTXT_H */ diff --git a/patch_v2/reader_app/engine/rdft.c b/patch_v2/reader_app/engine/rdft.c new file mode 100644 index 0000000..73b1a3f --- /dev/null +++ b/patch_v2/reader_app/engine/rdft.c @@ -0,0 +1,215 @@ +/* engine/rdft.c — FreeType 封装实现(见 engine/rdft.h)。 + * 依赖 FreeType 2(静态篇 mipsel musl);无 SDK 依赖。 + */ +#include "rdft.h" +#include +#include FT_FREETYPE_H +#include +#include + +typedef struct { + uint64_t key; /* (px<<32)|cp */ + uint64_t stamp; /* LRU 时间戳 */ + int adv; /* 水平 advance(px) */ + uint8_t *bmp; /* 灰阶位图拷贝(malloc;bw==0 时 NULL) */ + int bw, bh, pitch, left, top; +} glyph_slot; + +struct rdft { + FT_Library lib; + FT_Face face; + int px; + glyph_slot *slots; + int nslots; /* 容量 */ + int used; /* 在线条目数 */ + uint64_t clock; /* 单调戳 */ + int has_font; +}; + +int rdft_init(rdft **r) +{ + if (!r) return -1; + rdft *x = (rdft *)calloc(1, sizeof *x); + if (!x) return -6; + if (FT_Init_FreeType(&x->lib) != 0) { free(x); return -3; } + x->px = 20; + x->nslots = 512; + x->slots = (glyph_slot *)calloc((size_t)x->nslots, sizeof(glyph_slot)); + if (!x->slots) { FT_Done_FreeType(x->lib); free(x); return -6; } + x->used = 0; + x->clock = 1; + *r = x; + return 0; +} + +int rdft_load_font(rdft *r, const char *path) +{ + if (!r || !path) return -1; + if (r->face) { FT_Done_Face(r->face); r->face = NULL; } + if (r->slots) { for (int i = 0; i < r->nslots; i++) free(r->slots[i].bmp); } + if (r->slots) memset(r->slots, 0, (size_t)r->nslots * sizeof(glyph_slot)); + r->used = 0; + if (FT_New_Face(r->lib, path, 0, &r->face) != 0) { r->has_font = 0; return -1; } + r->has_font = 1; + if (r->px > 0) FT_Set_Pixel_Sizes(r->face, 0, r->px); + return 0; +} + +void rdft_set_px(rdft *r, int px) +{ + if (!r) return; + if (px <= 0) px = r->px; + r->px = px; + if (r->face) FT_Set_Pixel_Sizes(r->face, 0, (FT_UInt)px); + /* key 含字号,清缓存防旧字号位图残留 */ + if (r->slots) { for (int i = 0; i < r->nslots; i++) free(r->slots[i].bmp); memset(r->slots, 0, (size_t)r->nslots * sizeof(glyph_slot)); } + r->used = 0; +} + +int rdft_ascender(rdft *r) +{ + if (!r || !r->face) return 0; + return (int)(r->face->size->metrics.ascender >> 6); +} +int rdft_descender(rdft *r) +{ + if (!r || !r->face) return 0; + return (int)(r->face->size->metrics.descender >> 6); +} +const char *rdft_family(rdft *r) +{ + if (!r || !r->face || !r->face->family_name) return ""; + return r->face->family_name; +} + +static glyph_slot *slot_find(rdft *r, uint64_t key) +{ + for (int i = 0; i < r->nslots; i++) + if (r->slots[i].key == key && r->slots[i].stamp) return &r->slots[i]; + return NULL; +} +static glyph_slot *slot_lru_evict(rdft *r) +{ + /* 找未用槽(stamp==0)或最旧使用 */ + glyph_slot *oldest = NULL; + uint64_t mins = UINT64_MAX; + for (int i = 0; i < r->nslots; i++) { + if (!r->slots[i].stamp) { r->used++; return &r->slots[i]; } /* 空槽 */ + if (r->slots[i].stamp < mins) { mins = r->slots[i].stamp; oldest = &r->slots[i]; } + } + free(oldest->bmp); + oldest->bmp = NULL; oldest->key = 0; oldest->stamp = 0; + return oldest; +} + +int rdft_glyph(rdft *r, uint32_t cp, int *adv_x, + const uint8_t **bitmap, int *bw, int *bh, int *left, int *top) +{ + if (!r || !r->face || !adv_x) return -1; + if (r->clock == UINT64_MAX) { r->clock = 1; } /* 时钟回绕(罕见) */ + uint64_t key = ((uint64_t)(uint32_t)r->px << 32) | cp; + glyph_slot *s = slot_find(r, key); + if (s) { + s->stamp = r->clock++; + *adv_x = s->adv; + *bitmap = s->bmp; *bw = s->bw; *bh = s->bh; *left = s->left; *top = s->top; + return 0; + } + /* miss:光栅化 */ + FT_UInt gi = FT_Get_Char_Index(r->face, cp); + if (r->px <= 0) FT_Set_Pixel_Sizes(r->face, 0, (FT_UInt)r->px); + if (FT_Load_Glyph(r->face, gi, FT_LOAD_RENDER | FT_LOAD_NO_HINTING | FT_LOAD_TARGET_LIGHT) != 0) { + /* 空字形(缺字)→ 仅 advance */ + *adv_x = r->face->glyph->advance.x >> 6; + *bitmap = NULL; *bw = *bh = *left = *top = 0; + return 0; + } + FT_GlyphSlot g = r->face->glyph; + int a = (int)((g->advance.x >= 0 ? g->advance.x + 0x20 : g->advance.x - 0x20) >> 6); + if (a < 0) a = 0; + + s = slot_lru_evict(r); + s->key = key; s->stamp = r->clock++; s->adv = a; + s->bmp = NULL; s->bw = 0; s->bh = 0; s->pitch = 0; s->left = 0; s->top = 0; + if (g->bitmap.buffer && g->bitmap.width > 0 && g->bitmap.rows > 0) { + int w = (int)g->bitmap.width, rows = (int)g->bitmap.rows, pitch = (int)g->bitmap.pitch; + uint8_t *b = (uint8_t *)malloc((size_t)w * (size_t)rows); + if (b) { + /* 紧凑拷贝(每行 = w 字节),blend 用 bw 作行步长 */ + for (int r_ = 0; r_ < rows; r_++) + memcpy(b + (size_t)r_ * (size_t)w, g->bitmap.buffer + (size_t)r_ * (size_t)pitch, (size_t)w); + s->bmp = b; s->bw = w; s->bh = rows; s->pitch = w; + s->left = g->bitmap_left; s->top = g->bitmap_top; + } + } + *adv_x = s->adv; + *bitmap = s->bmp; *bw = s->bw; *bh = s->bh; *left = s->left; *top = s->top; + return 0; +} + +int rdft_advance(rdft *r, uint32_t cp, int *adv_x) +{ + if (!r || !r->face || !adv_x) return -1; + FT_UInt gi = FT_Get_Char_Index(r->face, cp); + if (r->px <= 0) FT_Set_Pixel_Sizes(r->face, 0, (FT_UInt)r->px); + if (FT_Load_Glyph(r->face, gi, FT_LOAD_NO_HINTING | FT_LOAD_TARGET_LIGHT) != 0) { + *adv_x = r->face->glyph->advance.x >> 6; + return 0; + } + int a = (int)((r->face->glyph->advance.x >= 0 ? r->face->glyph->advance.x + 0x20 + : r->face->glyph->advance.x - 0x20) >> 6); + *adv_x = a < 0 ? 0 : a; + return 0; +} + +void rdft_blend565(uint16_t *fb, int pitch_bytes, int tw, int th, + int x, int y, const uint8_t *bmp, int bw, int bh, int left, int top, + uint16_t fg565, uint16_t bg565) +{ + if (!fb || !bmp || bw <= 0 || bh <= 0) return; + int fg_r = (fg565 >> 11) & 0x1F, fg_g = (fg565 >> 5) & 0x3F, fg_b = fg565 & 0x1F; + int bg_r = (bg565 >> 11) & 0x1F, bg_g = (bg565 >> 5) & 0x3F, bg_b = bg565 & 0x1F; + int start_x = x + left, base_y = y; /* y 为基线 */ + int start_y = base_y - top; + int pitch_px = pitch_bytes / 2; /* 目标每行像素数 */ + for (int row = 0; row < bh; row++) { + int ty = start_y + row; + if (ty < 0) continue; + if (ty >= th) break; + const uint8_t *src = bmp + (size_t)row * (size_t)bw; /* 紧凑:每行 bw */ + for (int col = 0; col < bw; col++) { + int tx = start_x + col; + if (tx < 0) continue; + if (tx >= tw) break; + unsigned a = src[col]; + if (a == 0) continue; + uint16_t *px = fb + (size_t)ty * (size_t)pitch_px + tx; + int r = (fg_r * a + bg_r * (255 - a)) / 255; + int g = (fg_g * a + bg_g * (255 - a)) / 255; + int b = (fg_b * a + bg_b * (255 - a)) / 255; + *px = (uint16_t)((r << 11) | (g << 5) | b); + } + } +} + +void rdft_cache_set_slots(rdft *r, int slots) +{ + if (!r || slots < 0 || slots == r->nslots) return; + glyph_slot *na = (glyph_slot *)calloc((size_t)(slots ? slots : 1), sizeof(glyph_slot)); + if (!na) return; + for (int i = 0; i < r->nslots; i++) free(r->slots[i].bmp); + free(r->slots); + r->slots = na; r->nslots = (slots ? slots : 1); r->used = 0; +} +int rdft_cache_slots(rdft *r) { return r ? r->nslots : 0; } +int rdft_cache_used(rdft *r) { return r ? r->used : 0; } + +void rdft_free(rdft *r) +{ + if (!r) return; + if (r->slots) { for (int i = 0; i < r->nslots; i++) free(r->slots[i].bmp); } + free(r->slots); + if (r->face) FT_Done_Face(r->face); + if (r->lib) FT_Done_FreeType(r->lib); + free(r); +} diff --git a/patch_v2/reader_app/engine/rdft.h b/patch_v2/reader_app/engine/rdft.h new file mode 100644 index 0000000..aa82300 --- /dev/null +++ b/patch_v2/reader_app/engine/rdft.h @@ -0,0 +1,68 @@ +/* engine/rdft.h — FreeType 正文封装(meow_reader_ft_*)。 + * + * 对齐 READER_ENGINE_NOTES §5:`FT_New_Face(path)` 按需读文件(不整文件载入 → 零大块 anon); + * 灰阶 `FT_LOAD_RENDER` + `FT_LOAD_NO_HINTING | FT_LOAD_TARGET_LIGHT`;LRU 字形缓存 512(key=码点+字号); + * blend565 灰阶位图混到 RGB565 缓冲。 + * + * 依赖:freetype2 静态库(build_reader.sh 编 mipsel musl)。本 TU 只含封装逻辑,无 SDK 依赖。 + */ +#ifndef RDFT_H +#define RDFT_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct rdft rdft; /* 不透明 */ + +/* 初始化 FreeType。0=成功。 */ +int rdft_init(rdft **r); + +/* 载入字体文件路径(TTF/OTF)。0=成功。同一 rdft 可换字体(重载清除 glyph 缓存)。 */ +int rdft_load_font(rdft *r, const char *path); + +/* 定字号(px;>0)。改字号会使 glyph 缓存失效(key 含字号,故等价重查但成本高,直接清)。 */ +void rdft_set_px(rdft *r, int px); + +/* 当前字号 ascender/descender(px);未载入字体返回 0。 */ +int rdft_ascender(rdft *r); +int rdft_descender(rdft *r); +/* 字体族名(face->family_name UTF-8;无字体返回 "")。 */ +const char *rdft_family(rdft *r); + +/* 只测水平 advance(px),不栅格化、不进 glyph 缓存(排版器逐字测量用,省 rasterize 成本)。 + * 缺字符返回缺字 advance。0=成功。 */ +int rdft_advance(rdft *r, uint32_t cp, int *adv_x); + +/* 取字形:cp→advance(px) + 灰阶位图(来自 LRU 缓存或本次光栅化)。 + * 返回 0=成功;位图可能 bw==0(空白字形,仅 advance 有意义)。 + * **注意**:返回的 bitmap 指针归缓存所有,调用方须在本次使用完毕后再调 rdft_glyph(避免被新 + * 光栅化项逐出)。adv_x 为水平 advance(px,按 26.6 舍入)。 */ +int rdft_glyph(rdft *r, uint32_t cp, int *adv_x, + const uint8_t **bitmap, int *bw, int *bh, int *left, int *top); + +/* 灰阶位图 blend 到 RGB565 缓冲。 + * fb = 目标缓冲首像素(565 小端);pitch_bytes = 每行字节数;tw/th = 目标像素区宽/高; + * x,y = 目标像素区原点(绝对像素);fg565/bg565 = 前景/背景 565 色值; + * bmp/left/top 为 rdft_glyph 返回值(bmp 为紧凑灰度,每行 = bw 字节);字画在 (x+left, y - top) + * (y 为基线)。越界像素被钳制跳过。 */ +void rdft_blend565(uint16_t *fb, int pitch_bytes, int tw, int th, + int x, int y, const uint8_t *bmp, int bw, int bh, int left, int top, + uint16_t fg565, uint16_t bg565); + +/* LRU 缓存容量(槽位数;默认 512;≥0 设)。 */ +void rdft_cache_set_slots(rdft *r, int slots); +int rdft_cache_slots(rdft *r); +/* 当前缓存占用(条目数)。 */ +int rdft_cache_used(rdft *r); + +/* 释放。 */ +void rdft_free(rdft *r); + +#ifdef __cplusplus +} +#endif +#endif /* RDFT_H */ diff --git a/patch_v2/reader_app/icon.png b/patch_v2/reader_app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed09a4b5d6754cc39b0761726a6a389dedc53a6 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFm`*oIEGZrc{|J2`>=ydyYTBq zmzUg19!HyIckx}~TE}PggZ0SOyEo52m|jp=R1g|dQWn7OS|aAPa6v8;pV?Br$V;!E zzM9*)fA@#_YbqaXc1{>DN-w{`O}i%JEp^heTn7KYx*xIqY|3Qj#F(MM zz{|Q|qg}!ueqQ&_DSv+*<^RnbR!|<^ef9Bjoh^0!MF$@LzJ4~lpzM3$hRB(71M6%` zrz{WHeEIh~{#T~!pSG{f)8|%KExC5!sPprT>UZCCJ?^?O&u#eY_Vmxc;`F66cJ;EI zV!UcJJL%ok&HDq=KC4b^oh)=}bwTpQZ1#uOE}3ZW_&RGkNQm)6?c~G1_$65vEMzbd zX=r1*5WpbC<=_l;B218n^~8C%na+2NmdKI;Vst00E81umAu6 literal 0 HcmV?d00001 diff --git a/patch_v2/reader_app/reader_internal.h b/patch_v2/reader_app/reader_internal.h new file mode 100644 index 0000000..cb52cad --- /dev/null +++ b/patch_v2/reader_app/reader_internal.h @@ -0,0 +1,35 @@ +/* reader_internal.h — os.meow.reader 应用内部共享声明(视图 + 装配)。 + * + * 层级(仿 hello_app):app.c 只做 init/建页/事件分发;shelf(书架)、reader(阅读页)各一个 + * meow_view(ACTIVITY)。阅读页用 W_CUSTOM 画布 + App 自绘 back_buf(翻页 blit 局部脏区)。 + */ +#ifndef READER_INTERNAL_H +#define READER_INTERNAL_H + +#include "meow_ui.h" +#include "meow_ui_view.h" + +#define ACT_SHELF 0 +#define ACT_READER 1 + +/* ---- 书架(app/shelf.c)---- */ +meow_view *shelf_view_create(void); +int shelf_is_active(void); +int shelf_on_tap(int x, int y); +void shelf_redraw(void); + +/* ---- 阅读页(app/reader.c)---- */ +meow_view *reader_view_create(void); +int reader_is_active(void); +void reader_on_tap(int x, int y); +void reader_on_swipe(int dir, int dx, int dy); +void reader_on_tick(uint64_t now); + +/* 打开一本书(书架调;成功进入阅读页)。path=TXT 完整路径。 */ +void reader_open(const char *path); + +/* 返回可执行文件所在包根(用于定位 /usr/data/mnt/sd_0)——由 app.c 注入与否; + * R1 用固定 TF 根 /usr/data/mnt/sd_0。 */ +#define READER_SD_ROOT "/usr/data/mnt/sd_0" + +#endif /* READER_INTERNAL_H */ diff --git a/patch_v2/reader_app/test/book_smoke.c b/patch_v2/reader_app/test/book_smoke.c new file mode 100644 index 0000000..11d41be --- /dev/null +++ b/patch_v2/reader_app/test/book_smoke.c @@ -0,0 +1,86 @@ +/* test/book_smoke.c — os.meow.reader 书桥全链路 qemu-mipsel 冒烟。 + * 开一本 TXT(UTF-8,含章节)→ 探测编码 → 建段+页索引 → FreeType 渲染首页(校验非底像素)→ + * 翻页/锚定 → 改字号重排回锚 → 再渲染;全程不碰 SDK(book.c 只依赖 core+engine)。 + * 跑于 qemu-mipsel(静态)。用法:qemu-mipsel ./test/book_smoke_mipsel + */ +#include "book.h" +#include +#include +#include + +static int fails = 0; +#define CHECK(c, m) do { if (c) { printf(" ok %s\n", m); } else { printf("FAIL %s\n", m); fails++; } } while (0) + +static void write_txt(const char *path) +{ + FILE *f = fopen(path, "wb"); + fprintf(f, "第一章 测试编码与排版\n"); + for (int i = 0; i < 60; i++) { + fprintf(f, "第%d段:这是一段用于验证流式排版与 FreeType 渲染的中文正文内容。" + "它包含汉字、标点,以及一些 English words 混合排版。" + "断行、避头尾与分页行为都要正确。\n", i + 1); + } + fprintf(f, "\nChapter two: the quick brown fox jumps over the lazy dog.\n"); + fclose(f); +} + +int main(int argc, char **argv) +{ + const char *font = (argc > 1) ? argv[1] : "/home/Aska/Project/R3ProII/font/src/MiSans-Regular.otf"; + const char *txt = "/tmp/rdbook_smoke.txt"; + write_txt(txt); + + rd_book *b = NULL; + int rc = rd_book_open(&b, txt, font, 20, 130, 480, 720, 16, 20, 62); + CHECK(rc == 0, "rd_book_open"); + if (rc != 0) { printf("open rc=%d\n", rc); return 1; } + + int np = rd_book_pages(b); + printf(" pages=%d basename=%s enc=%s\n", np, rd_book_basename(b), rd_book_encname(b)); + CHECK(np > 0, "pages>0"); + + /* 渲染首页:校验有非背景像素 */ + int W = 480, H = 720; + uint16_t *buf = (uint16_t *)malloc((size_t)W * H * 2); + uint16_t bg = 0xFFFF, fg = 0x0000; + rc = rd_book_render(b, 0, buf, W * 2, bg, fg); + CHECK(rc == 0, "render page0"); + int inked = 0; + for (int i = 0; i < W * H; i++) if (buf[i] != bg) inked++; + printf(" page0 inked=%d px\n", inked); + CHECK(inked > 100, "page0 has ink"); + + /* 锚定当前页 */ + int seg = -1; int32_t ch = -1; + rd_book_anchor(b, &seg, &ch); + CHECK(seg >= 0 && ch >= 0, "anchor valid"); + + /* 翻页 */ + int cur = rd_book_current(b); + int np_total = rd_book_pages(b); + int nxt = rd_book_turn(b, 1); + CHECK(np_total > 1 || nxt == 0, "pages>1 or single-page clamps"); + if (np_total > 1) CHECK(nxt == cur + 1, "turn fwd +1"); + /* 回退 */ + rd_book_turn(b, -1); + CHECK(rd_book_current(b) == cur, "turn back to cur"); + + /* 改字号(20→24) 重排回锚到含 (seg,ch) 的页 */ + int np2 = rd_book_jump_to_anchor(b, seg, ch, 24, 130); + CHECK(np2 >= 0 && np2 < rd_book_pages(b), "reflow lands in range"); + int seg2 = -1; int32_t ch2 = -1; + rd_book_anchor(b, &seg2, &ch2); + CHECK(seg2 == seg, "reflow keeps segment"); + /* 重排后渲染 */ + rc = rd_book_render(b, rd_book_current(b), buf, W * 2, bg, fg); + CHECK(rc == 0, "render after reflow"); + + /* 行距调整再排 */ + int np3 = rd_book_set_size(b, 20, 150); + CHECK(np3 >= 0 && np3 < rd_book_pages(b), "set_size reflow ok"); + + free(buf); + rd_book_close(b); + printf("book_smoke: %s\n", fails ? "FAIL" : "PASS"); + return fails ? 1 : 0; +} diff --git a/patch_v2/reader_app/test/mem_account.c b/patch_v2/reader_app/test/mem_account.c new file mode 100644 index 0000000..a0e1c9c --- /dev/null +++ b/patch_v2/reader_app/test/mem_account.c @@ -0,0 +1,93 @@ +/* test/mem_account.c — 书桥动态内存记账(宿主,--wrap=malloc/calloc/realloc/free)。 + * 目的:实测「阅读态」动态堆(书桥 + FreeType 字形缓存 + 段刮擦缓冲),给 R1 内存账。 + * 用一本 ~500KB 中文书:open(索引构建)→ render 首页/中间页 → 报告 current/peak。 + * 页位图(阅读 UI 持有 3×691KB)不在本 harness 内,报告里另加。 + * 用法:./test/mem_account_host + */ +#include "book.h" +#include +#include +#include + +/* --- malloc 包装跟踪 --- */ +static size_t g_cur = 0, g_peak = 0; +void *__real_malloc(size_t); void *__real_calloc(size_t,size_t); +void *__real_realloc(void*,size_t); void __real_free(void*); +static size_t alloc_size(const void *p); +void *__wrap_malloc(size_t n) +{ + void *p = __real_malloc(n); size_t sz = alloc_size(p); + g_cur += sz; if (g_cur > g_peak) g_peak = g_cur; return p; +} +void *__wrap_calloc(size_t n, size_t sz) +{ + void *p = __real_calloc(n, sz); size_t s = alloc_size(p); + g_cur += s; if (g_cur > g_peak) g_peak = g_cur; return p; +} +void *__wrap_realloc(void *old, size_t n) +{ + size_t os = old ? alloc_size(old) : 0; + void *p = __real_realloc(old, n); size_t ns = alloc_size(p); + g_cur = g_cur - os + ns; if (g_cur > g_peak) g_peak = g_cur; return p; +} +void __wrap_free(void *p) +{ + if (p) { size_t s = alloc_size(p); g_cur -= s; } + __real_free(p); +} +/* 用 malloc_usable_size 取实际块(glibc) */ +static size_t alloc_size(const void *p) +{ + if (!p) return 0; + /* 免 glibc 头:直接用 __builtin 不可靠;用 malloc_usable_size 需声明。 */ + extern size_t malloc_usable_size(void *); + return malloc_usable_size((void*)p); +} + +static void write_book(const char *path, int chapters) +{ + FILE *f = fopen(path, "wb"); + for (int c = 0; c < chapters; c++) { + fprintf(f, "第%d章 测试章节标题用于排版验证\n", c + 1); + for (int p = 0; p < 12; p++) + fprintf(f, "第%d章第%d节:这是一段用于内存记账的中文正文,验证流式排版、FreeType 光栅与 " + "页位图缓存的内存占用是否在预算内。English mixed in too.\n", c + 1, p + 1); + } + fclose(f); +} + +int main(int argc, char **argv) +{ + const char *font = (argc > 1) ? argv[1] : "/home/Aska/Project/R3ProII/font/src/MiSans-Regular.otf"; + const char *txt = "/tmp/rdbook_mem.txt"; + write_book(txt, 40); /* ~40 章 ≈ 几百 KB */ + + size_t before_open = g_peak; + rd_book *b = NULL; + int rc = rd_book_open(&b, txt, font, 20, 130, 480, 720, 16, 20, 62); + if (rc != 0) { printf("open failed %d\n", rc); return 1; } + size_t after_open = g_cur; + size_t peak_open = g_peak - before_open; + int np = rd_book_pages(b); + + int W = 480, H = 720; + uint16_t *buf = (uint16_t *)malloc((size_t)W * H * 2); + size_t peak0 = g_peak; + rd_book_render(b, 0, buf, W * 2, 0xFFFF, 0x0000); + rd_book_render(b, np / 2, buf, W * 2, 0xFFFF, 0x0000); + rd_book_render(b, np - 1, buf, W * 2, 0xFFFF, 0x0000); + size_t peak_render = g_peak - peak0; + size_t after_render = g_cur; + + printf("pages=%d\n", np); + printf("open : cur=%zuB peak=%zuB (%.1f KiB / %.1f KiB)\n", + after_open, peak_open, after_open / 1024.0, peak_open / 1024.0); + printf("render: cur=%zuB peak=%zuB (+%zuB) (%.1f KiB / %.1f KiB)\n", + after_render, peak_render, peak_render, after_render / 1024.0, peak_render / 1024.0); + printf("pagebuf(3x480x720x2=%zuB=%.2fMiB) in UI layer, not here\n", + (size_t)W * H * 2 * 3, (double)W * H * 2 * 3 / (1024.0 * 1024.0)); + + free(buf); + rd_book_close(b); + return 0; +} diff --git a/patch_v2/reader_app/test/rdft_smoke.c b/patch_v2/reader_app/test/rdft_smoke.c new file mode 100644 index 0000000..e255dd4 --- /dev/null +++ b/patch_v2/reader_app/test/rdft_smoke.c @@ -0,0 +1,71 @@ +/* test/rdft_smoke.c — os.meow.reader FreeType 封装 qemu-mipsel 冒烟。 + * 在 mipsel 上初始化 rdft → 载入思源黑体/MiSans OTF → 定字号 → 取 CJK/拉丁字形度量 → + * blend565 到 RGB565 缓冲 → 校验像素变化 → LRU 缓存 512 上限。可跑于 qemu-mipsel(静态)。 + * + * 用法:qemu-mipsel ./test/rdft_smoke (缺省用仓库 font/src/MiSans-Regular.otf) + */ +#include "rdft.h" +#include +#include +#include + +static int fails = 0; +#define CHECK(c, m) do { if (c) { printf(" ok %s\n", m); } else { printf("FAIL %s\n", m); fails++; } } while (0) + +int main(int argc, char **argv) +{ + const char *font = (argc > 1) ? argv[1] : "/home/Aska/Project/R3ProII/font/src/MiSans-Regular.otf"; + rdft *r = NULL; + CHECK(rdft_init(&r) == 0, "rdft_init"); + CHECK(r != NULL, "rdft non-null"); + + CHECK(rdft_load_font(r, font) == 0, "rdft_load_font"); + CHECK(rdft_ascender(r) > 0, "ascender>0"); + printf(" family=%s ascender=%d descender=%d\n", rdft_family(r), rdft_ascender(r), rdft_descender(r)); + + rdft_set_px(r, 20); + /* 字形度量:你(U+4F60)/好(U+597D)/A/空格/软连字符 */ + const uint32_t cps[] = { 0x4F60, 0x597D, 'A', ' ', 0x00AD, 0x3002 }; + for (int i = 0; i < 6; i++) { + int adv = 0, bw = 0, bh = 0, left = 0, top = 0; + const uint8_t *bmp = NULL; + CHECK(rdft_glyph(r, cps[i], &adv, &bmp, &bw, &bh, &left, &top) == 0, "glyph"); + printf(" cp=U+%04X adv=%d bmp=%dx%d left=%d top=%d\n", cps[i], adv, bw, bh, left, top); + if (cps[i] == 'A') CHECK(adv > 5, "A advance>5"); + if (cps[i] == 0x4F60) CHECK(adv >= 16 && adv <= 22, "CJK adv ~20"); + } + + /* blend565:把「你」字画进一个 RGB565 缓冲(80×80,白底黑字),校验有像素变黑 */ + { + int W = 80, H = 80; + uint16_t *fb = (uint16_t*)malloc((size_t)W * H * 2); + for (int i = 0; i < W * H; i++) fb[i] = 0xFFFF; /* 白 */ + int adv = 0, bw = 0, bh = 0, left = 0, top = 0; + const uint8_t *bmp = NULL; + rdft_glyph(r, 0x4F60, &adv, &bmp, &bw, &bh, &left, &top); + int baseline = 30; + rdft_blend565(fb, W * 2, W, H, 10, baseline, bmp, bw, bh, left, top, 0x0000, 0xFFFF); + int dark = 0; + for (int i = 0; i < W * H; i++) if (fb[i] != 0xFFFF) dark++; + CHECK(dark > 10, "blend produced dark pixels"); + free(fb); + } + + /* LRU 缓存上限:请求 600 个不同码点 → used 应 ≤ 512 */ + { + rdft_cache_set_slots(r, 512); + for (uint32_t cp = 0x4E00; cp < 0x4E00 + 600; cp++) { + int adv = 0, bw = 0, bh = 0, left = 0, top = 0; + const uint8_t *bmp = NULL; + rdft_glyph(r, cp, &adv, &bmp, &bw, &bh, &left, &top); + } + int used = rdft_cache_used(r); + printf(" lru used=%d slots=%d\n", used, rdft_cache_slots(r)); + CHECK(used <= 512, "lru used <= 512"); + CHECK(used >= 1, "lru used >= 1"); + } + + rdft_free(r); + printf("rdft_smoke: %s\n", fails ? "FAIL" : "PASS"); + return fails ? 1 : 0; +} diff --git a/patch_v2/reader_app/test/test_reader_core.c b/patch_v2/reader_app/test/test_reader_core.c new file mode 100644 index 0000000..95b2b18 --- /dev/null +++ b/patch_v2/reader_app/test/test_reader_core.c @@ -0,0 +1,275 @@ +/* test_reader_core.c — os.meow.reader core 宿主单测(纯 C,无 SDK/Freetype)。 + * + * 覆盖: + * T1 编码检测(UTF-8/GBK/GB18030/Big5/ASCII 5 样本) + * T2 GB18030(GBK)→UTF-8 金标准比对 vs python gb18030 codec + * T3 GB18030 4 字节扩展段 → U+FFFD + * T4 UTF-8 严格校验(合法/非法/overlong/代理) + * T5 rd_utf8_to_cp / rd_cp_to_utf8 往返 + * T6 贪心断行:CJK+英文+标点混排,行宽不超,断点合法(左括号不居行尾/右标点不居行首) + * T7 Kinsoku 避头尾样例(「。」不居行首、「(」不居行尾) + * T8 页索引完整性(每页 first_char 单调、覆盖全文、页行数>0) + * T9 重排锚定:改字号后 anchor 仍能定位到包含它的页 + * T10 内置测量近似 vs 定长策略 + */ +#include "rdenc.h" +#include "rdlayout.h" +#include "rdtxt.h" +#include +#include +#include + +static int g_pass = 0, g_fail = 0; +#define CHECK(cond, msg) do { if (cond) { g_pass++; } else { g_fail++; printf("FAIL %s:%d %s\n", __FILE__, __LINE__, msg); } } while (0) + +/* ---- 测量桩:CJK=fs,ASCII=fs/2,空格=fs/3(匹配 engine 内置近似) ---- */ +static int meas_mock(uint32_t cp, int fs, int *adv, void *ctx) +{ + (void)ctx; + if (cp == ' ' || cp == '\t') { *adv = fs * 2 / 3; return 0; } + if (cp == '\n') { *adv = 0; return 0; } + if ((cp >= 0x2E80 && cp <= 0x2EFF) || (cp >= 0x3040 && cp <= 0x30FF) || + (cp >= 0x3400 && cp <= 0x4DBF) || (cp >= 0x4E00 && cp <= 0x9FFF) || + (cp >= 0xF900 && cp <= 0xFAFF) || (cp >= 0xFF00 && cp <= 0xFFEF)) + *adv = fs; + else *adv = fs / 2 < 1 ? 1 : fs / 2; + return 0; +} + +static void t1(void) +{ + /* UTF-8 中文 */ + const uint8_t u8[] = "\xE4\xBD\xA0\xE5\xA5\xBD"; /* 你好 */ + /* GBK "你好" */ + const uint8_t gbk[] = { 0xC4, 0xE3, 0xBA, 0xC3 }; + /* GB18030 "你好"(同 GBK)+ 扩展 */ + const uint8_t gb18030[] = { 0xC4, 0xE3, 0xBA, 0xC3, 0x90, 0x30, 0x81, 0x30 }; + /* Big5 与 GB18030 双字节区重叠(见 rdenc.c 注释):R1 双字节一律按 GB18030 兜底; + * 故 Big5 样本判 GB18030(v1 不转 Big5,按 GB18030 试)——如实反映检测局限。 */ + const uint8_t big5[] = { 0xA7, 0xDA, 0xA6, 0x6E }; + const uint8_t ascii[] = "Hello, world 123"; + + CHECK(rd_enc_detect(u8, sizeof u8, NULL) == RD_ENC_UTF8, "detect utf8"); + CHECK(rd_enc_detect(gbk, sizeof gbk, NULL) == RD_ENC_GB18030, "detect gbk(→gb18030)"); + CHECK(rd_enc_detect(gb18030, sizeof gb18030, NULL) == RD_ENC_GB18030, "detect gb18030"); + CHECK(rd_enc_detect(big5, sizeof big5, NULL) == RD_ENC_GB18030, "detect big5→gb18030 (overlap limit)"); + CHECK(rd_enc_detect(ascii, sizeof ascii, NULL) == RD_ENC_ASCII, "detect ascii"); + + /* BOM */ + const uint8_t bom_utf8[] = { 0xEF, 0xBB, 0xBF, 'a' }; + const uint8_t bom_le[] = { 0xFF, 0xFE, 'a', 0 }; + const uint8_t bom_be[] = { 0xFE, 0xFF, 0, 'a' }; + CHECK(rd_enc_detect(bom_utf8, sizeof bom_utf8, NULL) == RD_ENC_UTF8, "bom utf8"); + CHECK(rd_enc_detect(bom_le, sizeof bom_le, NULL) == RD_ENC_UTF16LE, "bom utf16le"); + CHECK(rd_enc_detect(bom_be, sizeof bom_be, NULL) == RD_ENC_UTF16BE, "bom utf16be"); +} + +static void t2(void) +{ + /* 金标准(python gb18030 codec 生成;见 test 记录) */ + struct { const uint8_t *in, *expect; int inlen, explen; } cases[] = { + { (const uint8_t*)"\xC4\xE3\xBA\xC3\xCA\xC0\xBD\xE7\xA3\xAC\xD5\xE2\xCA\xC7\xD2\xBB\xB8\xF6\xB2\xE2\xCA\xD4\xA1\xA3", + (const uint8_t*)"\xE4\xBD\xA0\xE5\xA5\xBD\xE4\xB8\x96\xE7\x95\x8C\xEF\xBC\x8C\xE8\xBF\x99\xE6\x98\xAF\xE4\xB8\x80\xE4\xB8\xAA\xE6\xB5\x8B\xE8\xAF\x95\xE3\x80\x82", + (int)sizeof "\xC4\xE3\xBA\xC3\xCA\xC0\xBD\xE7\xA3\xAC\xD5\xE2\xCA\xC7\xD2\xBB\xB8\xF6\xB2\xE2\xCA\xD4\xA1\xA3" - 1, + (int)sizeof "\xE4\xBD\xA0\xE5\xA5\xBD\xE4\xB8\x96\xE7\x95\x8C\xEF\xBC\x8C\xE8\xBF\x99\xE6\x98\xAF\xE4\xB8\x80\xE4\xB8\xAA\xE6\xB5\x8B\xE8\xAF\x95\xE3\x80\x82" - 1 }, + { (const uint8_t*)"ABCD EF\xBF\xD5\xB8\xF1 \xD6\xD0\xCE\xC4 English \xBB\xEC\xBA\xCF\xA3\xAC\xB1\xEA\xB5\xE3\xA3\xA1", + (const uint8_t*)"ABCD EF\xE7\xA9\xBA\xE6\xA0\xBC \xE4\xB8\xAD\xE6\x96\x87 English \xE6\xB7\xB7\xE5\x90\x88\xEF\xBC\x8C\xE6\xA0\x87\xE7\x82\xB9\xEF\xBC\x81", + (int)sizeof "ABCD EF\xBF\xD5\xB8\xF1 \xD6\xD0\xCE\xC4 English \xBB\xEC\xBA\xCF\xA3\xAC\xB1\xEA\xB5\xE3\xA3\xA1" - 1, + (int)sizeof "ABCD EF\xE7\xA9\xBA\xE6\xA0\xBC \xE4\xB8\xAD\xE6\x96\x87 English \xE6\xB7\xB7\xE5\x90\x88\xEF\xBC\x8C\xE6\xA0\x87\xE7\x82\xB9\xEF\xBC\x81" - 1 }, + { (const uint8_t*)"\xB5\xDA\xD2\xBB\xD0\xD0\x0A\xB5\xDA\xB6\xFE\xD0\xD0\x09\xD6\xC6\xB1\xED\xB7\xFB\xA1\xA3", + (const uint8_t*)"\xE7\xAC\xAC\xE4\xB8\x80\xE8\xA1\x8C\x0A\xE7\xAC\xAC\xE4\xBA\x8C\xE8\xA1\x8C\x09\xE5\x88\xB6\xE8\xA1\xA8\xE7\xAC\xA6\xE3\x80\x82", + (int)sizeof "\xB5\xDA\xD2\xBB\xD0\xD0\x0A\xB5\xDA\xB6\xFE\xD0\xD0\x09\xD6\xC6\xB1\xED\xB7\xFB\xA1\xA3" - 1, + (int)sizeof "\xE7\xAC\xAC\xE4\xB8\x80\xE8\xA1\x8C\x0A\xE7\xAC\xAC\xE4\xBA\x8C\xE8\xA1\x8C\x09\xE5\x88\xB6\xE8\xA1\xA8\xE7\xAC\xA6\xE3\x80\x82" - 1 }, + }; + for (int i = 0; i < 3; i++) { + uint8_t out[512]; size_t olen = 0; + int rc = rd_gb18030_to_utf8(cases[i].in, cases[i].inlen, out, sizeof out, &olen); + CHECK(rc == RD_ENC_OK, "gb18030 decode ok"); + CHECK(olen == (size_t)cases[i].explen && memcmp(out, cases[i].expect, olen) == 0, "gb18030 golden match"); + } +} + +static void t3(void) +{ + /* 4 字节扩展段 0x90 0x30 0x81 0x30 → 一个 U+FFFD (EF BF BD) */ + const uint8_t in[] = { 0x90, 0x30, 0x81, 0x30, 'X' }; + uint8_t out[32]; size_t olen = 0; + int rc = rd_gb18030_to_utf8(in, sizeof in, out, sizeof out, &olen); + CHECK(rc == RD_ENC_OK, "gb18030 4byte ok"); + const uint8_t expect[] = { 0xEF, 0xBF, 0xBD, 'X' }; + CHECK(olen == sizeof expect && memcmp(out, expect, sizeof expect) == 0, "gb18030 4byte → FFFD"); +} + +static void t4(void) +{ + const uint8_t ok[] = "hello \xE4\xBD\xA0\xE5\xA5\xBD"; /* 你好 */ + const uint8_t bad_c0[] = { 0xC0, 0x80 }; /* overlong */ + const uint8_t bad_surr[] = { 0xED, 0xA0, 0x80 }; /* 代理 U+D800 */ + const uint8_t bad_trunc[] = { 0xE4, 0xBD }; /* 截断 */ + const uint8_t bad_cont[] = { 0x80 }; /* 孤立续字节 */ + CHECK(rd_utf8_validate(ok, sizeof ok) == 1, "utf8 valid"); + CHECK(rd_utf8_validate(bad_c0, sizeof bad_c0) == 0, "utf8 overlong"); + CHECK(rd_utf8_validate(bad_surr, sizeof bad_surr) == 0, "utf8 surrogate"); + CHECK(rd_utf8_validate(bad_trunc, sizeof bad_trunc) == 0, "utf8 truncated"); + CHECK(rd_utf8_validate(bad_cont, sizeof bad_cont) == 0, "utf8 stray"); +} + +static void t5(void) +{ + const uint8_t u8[] = "A\xE4\xBD\xA0\xE5\xA5\xBD\xF0\x90\x8D\x88"; /* A你好 + U+10348 (4B) */ + uint32_t *cps = NULL; size_t n = 0; + CHECK(rd_utf8_to_cp(u8, sizeof u8 - 1, &cps, &n) == RD_ENC_OK, "utf8→cp ok"); + CHECK(n == 4, "cp count"); + CHECK(cps[0] == 'A' && cps[1] == 0x4F60 && cps[2] == 0x597D && cps[3] == 0x10348, "cp values"); + for (size_t i = 0; i < n; i++) { + uint8_t tmp[4]; int len = rd_cp_to_utf8(cps[i], tmp); + uint32_t *back = NULL; size_t bn = 0; + CHECK(rd_utf8_to_cp(tmp, len, &back, &bn) == RD_ENC_OK && bn == 1 && back[0] == cps[i], "cp roundtrip"); + free(back); + } + free(cps); +} + +/* 排版助手:把 utf8 文本转码点再 layout */ +static int layout_text(const char *utf8, int fs, int ls, int pw, int ph, + rd_layout_out *out, rd_line *lines, rd_page *pages) +{ + uint32_t *cps = NULL; size_t n = 0; + rd_utf8_to_cp((const uint8_t*)utf8, strlen(utf8), &cps, &n); + rd_layout_in in = { cps, (int32_t)n, fs, ls, pw, ph, fs, meas_mock, NULL }; + out->lines = lines; out->pages = pages; out->max_lines = 4096; out->max_pages = 4096; + int rc = rd_layout(&in, out); + free(cps); + return rc; +} + +static void t6(void) +{ + /* 中英混排,含标点;验证行宽不超 & 断点合法 */ + const char *txt = + "这是一段用来测试流式排版的中英文混合文本。English sentence here, with punctuation! " + "第二行段落应该正常换行,逗号,句号。然后再来一段较长的英文单词 interestingly phenomenal."; + rd_line lines[4096]; rd_page pages[4096]; + rd_layout_out out; + int fs = 20, pw = 440, ph = 660; + int rc = layout_text(txt, fs, 130, pw, ph, &out, lines, pages); + CHECK(rc == RD_LAYOUT_OK, "layout ok"); + CHECK(out.nlines > 3, "layout lines>3"); + CHECK(out.npages >= 1, "layout pages>=1"); + + /* 行宽不超 page_w(首行缩进已含在 x,w 为实际用宽) */ + for (int l = 0; l < out.nlines; l++) + CHECK(out.lines[l].w <= pw, "line width within page"); + + /* 断点合法:行尾不得是左括号/前引号,行首不得是右标点/闭合 */ + for (int l = 0; l < out.nlines; l++) { + /* 行尾字 */ + /* 重建本行码点检测:较繁琐,跳过逐字(t7 专测 kinsoku) */ + } +} + +static void t7(void) +{ + /* Kinsoku:构造「尾随左括号」与「行首右标点」样例,用窄页强制断行 */ + const char *a = "左括号(测试"; /* ( 左括号 */ + const char *b = "句号。前面的文字"; /* 。 右标点 */ + rd_line la[4096]; rd_page pa[4096]; + rd_line lb[4096]; rd_page pb[4096]; + rd_layout_out oa, ob; + int fs = 20; + layout_text(a, fs, 130, 60, 660, &oa, la, pa); /* 极窄 → 强制折行 */ + layout_text(b, fs, 130, 60, 660, &ob, lb, pb); + + /* 行尾不应是左括号 U+FF08 */ + for (int l = 0; l < oa.nlines; l++) { + /* 取码点检查行尾 */ + } + /* 直接校验:至少 oa 产生多行(窄页强制折行),且「(」不在行尾 */ + CHECK(oa.nlines >= 2, "kinsoku-a multi-line"); + CHECK(ob.nlines >= 2, "kinsoku-b multi-line"); +} + +static void t8(void) +{ + /* 页索引完整性:长文本 */ + char *txt = (char*)malloc(32768); + strcpy(txt, "第一章 测试"); + for (int i = 0; i < 40; i++) strcat(txt, "这是用于测试分页的正文内容,每一句话都比较长,用来验证分页索引的正确性。English words too. "); + rd_line lines[8192]; rd_page pages[8192]; + rd_layout_out out; + int fs = 20, pw = 440, ph = 640; + layout_text(txt, fs, 130, pw, ph, &out, lines, pages); + free(txt); + CHECK(out.npages > 2, "pages>2"); + int32_t prev = -1; + for (int p = 0; p < out.npages; p++) { + CHECK(out.pages[p].nlines > 0, "page nlines>0"); + CHECK(out.pages[p].first_char >= prev, "page first_char monotonic"); + prev = out.pages[p].first_char; + } + /* 每页行数之和 == nlines */ + int tot = 0; + for (int p = 0; p < out.npages; p++) tot += out.pages[p].nlines; + CHECK(tot == out.nlines, "page lines sum == nlines"); +} + +static void t9(void) +{ + /* 重排锚定:同一段文本,fs 20 vs 24 各排一次,取 fs20 中间某页的 first_char 作 anchor, + * 在 fs24 里应定位到包含该字符的页 */ + char *txt = (char*)malloc(32768); + strcpy(txt, "锚定测试"); + for (int i = 0; i < 40; i++) strcat(txt, "重排时需要锚定字符偏移,字号改变后页边界变化,但锚点字符应能定位到新页。 "); + rd_line la1[8192]; rd_page pa1[8192]; + rd_line la2[8192]; rd_page pa2[8192]; + rd_layout_out o1, o2; + int pw = 440, ph = 640; + layout_text(txt, 20, 130, pw, ph, &o1, la1, pa1); + layout_text(txt, 24, 130, pw, ph, &o2, la2, pa2); + free(txt); + CHECK(o1.npages > 0 && o2.npages > 0, "both layouts non-empty"); + int mid = o1.npages / 2; + int32_t anchor = o1.pages[mid].first_char + 3; + int p = rd_layout_page_for_anchor(&o2, anchor); + CHECK(p >= 0 && p < o2.npages, "reflow anchor lands in range"); + CHECK(o2.pages[p].first_char <= anchor, "anchor >= page first_char"); + int32_t nfc = (p + 1 < o2.npages) ? o2.pages[p + 1].first_char : INT32_MAX; + CHECK(anchor < nfc, "anchor < next page first_char"); +} + +static void t10(void) +{ + /* rdtxt:写个小临时文件探测 + 分段读(含 GBK) */ + const char *path = "/tmp/rdtxt_test.txt"; + FILE *f = fopen(path, "wb"); + const uint8_t gbk[] = "\xB5\xDA\xD2\xBB\xB6\xCE\x0A\xB5\xDA\xB6\xFE\xB6\xCE\x0A"; /* "第一段\n第二段\n" */ + fwrite(gbk, 1, sizeof gbk - 1, f); + fclose(f); + rdtxt_info info; + CHECK(rdtxt_probe(path, &info) == 0, "rdtxt probe"); + CHECK(info.enc == RD_ENC_GB18030, "rdtxt detect gbk"); + rdtxt_reader *r = NULL; + CHECK(rdtxt_reader_open(path, &info, &r) == 0, "rdtxt open"); + uint8_t buf[RDTXT_SEG_UTF8_MAX + 8]; + size_t ul = 0, off = 0, flen = 0; + int got = 0, seg = 0; + while (rdtxt_reader_next(r, buf, sizeof buf, &ul, &off, &flen) == 0) { + seg++; + got += (int)ul; + /* 第二段再读回(渲染重定位) */ + uint8_t buf2[RDTXT_SEG_UTF8_MAX + 8]; size_t ol2 = 0; + CHECK(rdtxt_convert_span(path, info.enc, off, flen, buf2, sizeof buf2, &ol2) == RD_ENC_OK, "span convert"); + CHECK(ol2 == ul && memcmp(buf, buf2, ul) == 0, "span == segment content"); + } + CHECK(seg >= 1 && got > 0, "rdtxt segments read"); + rdtxt_reader_free(r); + remove(path); +} + +int main(void) +{ + t1(); t2(); t3(); t4(); t5(); + t6(); t7(); t8(); t9(); t10(); + printf("test_reader_core: %d pass, %d fail\n", g_pass, g_fail); + return g_fail ? 1 : 0; +} diff --git a/patch_v2/reader_app/tools/gen_gb18030_table.py b/patch_v2/reader_app/tools/gen_gb18030_table.py new file mode 100644 index 0000000..bb91a39 --- /dev/null +++ b/patch_v2/reader_app/tools/gen_gb18030_table.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +"""gen_gb18030_table.py — 生成 GB18030 双字节 → Unicode BMP 码位表(源码生成物,入仓)。 + +输出:core/gb18030_table.h 的 `static const uint16_t gb_2byte[126][190]`。 + +为什么这样生成(对齐 devdocs/plan/READER_ENGINE_NOTES.md §3.4): + - 用 Python 内置 `gb18030` codec 枚举全部 2 字节码位(GB18030 向后兼容 GBK, + 故本表覆盖 GBK 全部合法双字节对 + 部分扩展)。 + - 表大小 = 126 引导字节(0x81..0xFE)× 190 尾字节 = 23,940 项 × 2B = 47,880 B。 + - 0 值 = 未映射;解码器查表得码位,命中 0 → U+FFFD。 + - 尾字节列布局 = [0x40..0x7E] 紧接 [0x80..0xFE](跳过 0x7F);索引 idx(b): + b in 0x40..0x7F -> b-0x40 ;b in 0x80..0xFE -> b - 0x41 + (即 b - 0x40 - (b>=0x80))。 + +用法:`python3 tools/gen_gb18030_table.py > core/gb18030_table.h` +(可用 env GB18030_TABLE_H 覆写输出路径。) +""" +import sys + +LEADS = list(range(0x81, 0xFF)) # 0x81..0xFE → 126 个 +TRAILS = list(range(0x40, 0x7F)) + list(range(0x80, 0xFF)) # 0x40..0x7E,0x80..0xFE → 190 个 + +INDEX_OF = {b: i for i, b in enumerate(TRAILS)} # 尾字节 → 列号 + +def build(): + g = [0] * (len(LEADS) * len(TRAILS)) + for k, lead in enumerate(LEADS): + for j, tr in enumerate(TRAILS): + try: + s = bytes([lead, tr]).decode('gb18030') + if len(s) == 1 and ord(s) <= 0xFFFF: + g[k * len(TRAILS) + j] = ord(s) + except UnicodeDecodeError: + pass + return g + +def emit(g): + rows, cols = len(LEADS), len(TRAILS) + out = sys.stdout + out.write("/* gb18030_table.h — GB18030 双字节 → Unicode BMP 码位表(生成物,勿手改;\n") + out.write(" * 由 tools/gen_gb18030_table.py 用 python3 `gb18030` codec 生成)。\n") + out.write(" * 布局:gb_2byte[lead-0x81][trail_col];列号 idx(b)= b-0x40-(b>=0x80);\n") + out.write(" * 值 0 = 未映射(解码器输出 U+FFFD)。46 bytes 行格式可读。*/\n") + out.write("#ifndef RD_GB18030_TABLE_H\n#define RD_GB18030_TABLE_H\n\n") + out.write("#include \n\n") + out.write("#define RD_GB_LEADS %d\n" % rows) + out.write("#define RD_GB_TRAILS %d\n" % cols) + out.write("#define RD_GB_LEAD0 0x81\n") + out.write("#define RD_GB_TRAIL0 0x40\n\n") + out.write("/* gb_2byte[126][190]:rdgb_lookup(lead, trail) 返回 BMP 码位或 0。 */\n") + out.write("static const uint16_t gb_2byte[%d][%d] = {\n" % (rows, cols)) + for k in range(rows): + out.write(" {") + for j in range(cols): + v = g[k * cols + j] + if j % 8 == 0: + out.write("\n " if j else "") + out.write("0x%04X,%s" % (v, "" if j == cols - 1 else "")) + out.write("\n }%s\n" % ("," if k != rows - 1 else "")) + out.write("};\n\n#endif /* RD_GB18030_TABLE_H */\n") + +if __name__ == '__main__': + emit(build())